【发布时间】:2012-05-03 19:27:40
【问题描述】:
我有一个与图形相关的基于文档的 Mac 应用程序。我的应用程序的文档可能有多个“页面”。每个页面都有一个NSView“canvas”对象。
我的应用有几个导出选项,这些选项被实现为返回 NSData 对象(然后将其写入磁盘)的方法。
我想以以下方法实现 PDF 导出选项:
- 创建内存中的 PDF
- 循环遍历我文档的画布视图,并在内存 PDF 的新页面中呈现每个视图
- 以
NSData形式返回内存中的多页 PDF
下面的代码是我目前正在尝试的。
我文档中的每一页都是 800 x 600 像素。
当我将生成的NSData 对象写入磁盘时,写入操作成功,但磁盘上的文件以某种方式损坏。该文件无法在 Preview 或我尝试过的任何其他应用中打开。
我做错了什么?
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);
}
}
【问题讨论】:
-
你能发布一个十六进制转储,可能是第一千字节的数据吗?
-
为什么要导出到内存中的数据对象?为什么不直接导出到文件?
-
我想知道你能否给我一些意见:stackoverflow.com/questions/10621858/… 谢谢!
标签: macos cocoa core-graphics quartz-2d