imagestopdf   [plain text]


#!/usr/bin/python
#
# Usage: imagestopdf [image-file ...] pdf-file
#
# This script creates the specified PDF file. The contents
# of each image file are placed into the PDF, one per page.
#

import sys, os
from Quartz.CoreGraphics import *
from Quartz.ImageIO import *


if len(sys.argv) > 2 :
	
	hasImages = False
	defaultPageRect = CGRectMake(0, 0, 612, 792)
	ctx = CGPDFContextCreateWithURL(CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, sys.argv[-1], len(sys.argv[-1]), False), defaultPageRect, None)
	if ctx:
		for arg in sys.argv[1:-1] :
			image = None
			transform = None
			provider = CGDataProviderCreateWithFilename(arg)
			if provider:
				imageSrc = CGImageSourceCreateWithDataProvider(provider, None)
				if imageSrc:
					image = CGImageSourceCreateImageAtIndex(imageSrc, 0, None)

			if image is not None :
				imageSize = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image))

				xRes = 204.0
				yRes = 196.0

				imageProps = CGImageSourceCopyPropertiesAtIndex(imageSrc, 0, None)
				if imageProps is not None :
					tiffProps = imageProps[kCGImagePropertyTIFFDictionary]
					if tiffProps is not None :
						xRes = tiffProps[kCGImagePropertyTIFFXResolution]
						yRes = tiffProps[kCGImagePropertyTIFFYResolution]

				transform = CGAffineTransformMakeScale( 72.0/xRes, 72.0/yRes)
				if transform is not None :
					imageSize = CGSizeApplyAffineTransform(imageSize, transform)

				mediaBox = CGRectMake(0, 0, imageSize.width, imageSize.height)

				CGContextBeginPage(ctx, mediaBox)
				CGContextDrawImage(ctx, mediaBox, image)
				CGContextEndPage(ctx)

				hasImages = True
			else:
				print >> sys.stderr, 'imagestopdf: invalid image file "' + arg + '"'

		CGPDFContextClose(ctx)

	if hasImages is False:
		os.remove(sys.argv[-1])
		sys.exit('imagestopdf: no images found!')

else :
	print >> sys.stderr, 'Usage: imagestopdf [image-file ...] pdf-file'
	sys.exit(2)