グラフィック関連のドキュメントベースのMacアプリを持っています。アプリのドキュメントに複数の「ページ」が含まれている場合があります。各ページにはNSView
「キャンバス」オブジェクトがあります。
NSData
私のアプリには、オブジェクトを返す(ディスクに書き込まれる)メソッドとして実装されるいくつかのエクスポートオプションがあります。
次のような方法でPDFエクスポートオプションを実装したいと思います。
- インメモリPDFを作成します
- ドキュメントのキャンバスビューをループし、それぞれをメモリ内PDFの新しいページにレンダリングします
- メモリ内の複数ページのPDFを
NSData
以下のコードは私が現在試しているものです。
私のドキュメントの各ページは800x600ピクセルです。
結果のNSData
オブジェクトをディスクに書き込むと、書き込み操作は成功しますが、ディスク上のファイルが何らかの理由で破損しています。プレビューや試した他のアプリでファイルを開くことはできません。
私は何が間違っているのですか?
NSMutableData *data = [NSMutableData data];
CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)data);
CGRect mediaBox = CGRectMake(0.0, 0.0, 800.0, 600.0);
CGContextRef ctx = CGPDFContextCreate(consumer, &mediaBox, NULL);
CFRelease(consumer);
NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:NO];
for (NSView *canvas in myCanvases) {
CGContextBeginPage(ctx, &mediaBox);
CGContextSaveGState(ctx);
[canvas displayRectIgnoringOpacity:mediaBox inContext:gc];
CGContextRestoreGState(ctx);
CGContextEndPage(ctx);
}
CGPDFContextClose(ctx); // UPDATE: this line was originally missing. see answer below
CGContextRelease(ctx);
...
NSError *err = nil;
if (![data writeToFile:s options:NSDataWritingAtomic error:&err]) {
if (err) {
NSLog(@"%@", err);
}
}