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;
}
