gpt4 book ai didi

macos - Mac OS X : How to draw multiple NSViews into a new, 多页 PDF?

转载 作者:行者123 更新时间:2023-12-03 16:13:47 25 4
gpt4 key购买 nike

我有一个与图形相关的基于文档的Mac应用程序。我的应用程序的文档可能有多个“页面”。每个页面都有一个 NSView“canvas”对象。

我的应用程序有多个导出选项,这些选项作为返回 NSData 对象(然后写入磁盘)的方法来实现。

我想通过以下方法实现 PDF 导出选项:

  1. 创建内存中 PDF
  2. 循环浏览文档的 Canvas View 并在内存 PDF 的新页面中渲染每个 View
  3. NSData 形式返回内存中的多页 PDF

下面的代码是我目前正在尝试的。

我的文档中的每个页面都是 800 x 600 像素。

当我将生成的 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);
}
}

最佳答案

在这里。我已经解决了这个问题。我错过了对 CGPDFContextClose() 的最后一次调用。

所以在释放上下文之前...

CGPDFContextClose(ctx);
CGContextRelease(ctx);

关于macos - Mac OS X : How to draw multiple NSViews into a new, 多页 PDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com