PDFをJPEGに変換
Rev.2を表示中。最新版はこちら。
概要
PDFファイルの各ページをJPEG画像に変換する。
Linux上でpdftoppmなどのツールを使うことで簡単に変換できるが、フォント周りが若干汚くなったりするため、Mac OS XでPDFKitを使って変換する。
開発環境
- OS: Mac OS X 10.4 (PPC)
 - 環境: X-Code
 - 言語: Objective-C
 
変換処理
変換はPDFKitを使って読み込んだPDFファイルから各ページのオブジェクトPDFPageを取得して、以下のように変換していく。
- PDFPageからNSData取得
 - NSDataからNSPDFImageRepを生成
 - NSPDFImageの内容をNSImageに描画
 - NSImageからTIFFRepresentationでTIFF表現データを取得
 - TIFF表現からNSBitmapImageRepを生成
 - NSBitmapImageRepからJPEGデータを生成してファイルへ書き出す
 
- (IBAction)convert:(id)sender
{
	int i;
	NSLog(@"save");
	if (!pdfDoc) {
		NSRunAlertPanel(@"Alert", 
					@"PDF document isn't loaded.", 
					@"OK", nil, nil);
		return;
	}
	NSSavePanel *panel = [NSSavePanel savePanel];
	int result = [panel runModal];
	if (result != NSOKButton) {
		return;
	}
	NSString *savePath = [panel directory];
	NSDictionary *propJpeg;
	propJpeg = [NSDictionary dictionaryWithObjectsAndKeys:
				[NSNumber numberWithFloat: 0.5],
				NSImageCompressionFactor,
				nil];
	int pageN = [pdfDoc pageCount];
	for (i = 0 ; i < pageN ; i++) {
		PDFPage *page = [pdfDoc pageAtIndex: i];
		NSImage *image = [self _pdf2image: page];
		// Bitmap画像に変換
		NSData *tiffRep = [image TIFFRepresentation];
		NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithData:tiffRep];
		if (!imageRep) {
			[image release];
			return;
		}
		// Jpeg出力
		NSData       *dataJpeg;
		BOOL          bResult;
		dataJpeg = [imageRep representationUsingType: NSJPEGFileType properties:propJpeg];
		NSString *filename = [savePath stringByAppendingString:
								[NSString stringWithFormat: @"/test%d.jpg", i]];
		bResult = [dataJpeg writeToFile : filename atomically: YES];
		if (!bResult)
			NSLog(@"ERR");
		[image release];
		[imageRep release];
	}
}
- (NSImage *)_pdf2image:(PDFPage *)page
{
	NSData *dataPage = [page dataRepresentation];
	// PDF画像 (NSBitmapImageRepだとリサイズした時に画像が荒くなる)
	NSPDFImageRep *pdfImageRep = [[NSPDFImageRep alloc] initWithData:dataPage];
	// NSImageに書き込む
	NSSize size;	// 出力サイズ
	if (0) {
		// resizeする場合
		size.width  = 2400;
		size.height = 2400;
	} else {
		size.width  = [pdfImageRep pixelsWide];
		size.height = [pdfImageRep pixelsHigh];
	}
	NSImage *image = [[NSImage alloc] initWithSize:size];
	[image lockFocus];
	[pdfImageRep drawInRect: NSMakeRect(0, 0, size.width, size.height)];
	[image unlockFocus];
	[pdfImageRep release];
	return image;
}
