macos – Mac OS X:如何将多个NSView绘制成一个新的多页PDF?

macos – Mac OS X:如何将多个NSView绘制成一个新的多页PDF?,第1张

概述我有一个与图形相关的基于文档的Mac应用程序.我的应用程序的文档可能有多个“页面”.每个页面都有一个NSView“canvas”对象. 我的应用程序有几个导出选项,这些选项实现为返回NSData对象(然后写入磁盘)的方法. 我想在一个方法中实现PDF导出选项: >创建内存中的PDF >循环通过我的文档的画布视图,并在内存中的PDF中的每个页面中呈现每个视图 >将内存中的多页PDF作为NSData返 我有一个与图形相关的基于文档的Mac应用程序.我的应用程序的文档可能有多个“页面”.每个页面都有一个NSVIEw“canvas”对象.

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

我想在一个方法中实现pdf导出选项:

>创建内存中的pdf
>循环通过我的文档的画布视图,并在内存中的pdf中的每个页面中呈现每个视图
>将内存中的多页pdf作为NSData返回

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

我的文档中的每个页面都是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 belowCGContextRelease(ctx);...NSError *err = nil;if (![data writetofile:s options:NSDataWritingAtomic error:&err]) {    if (err) {        NSLog(@"%@",err);    }}
解决方法 OP在这里.我已经解决了这个问题.我错过了对CGPdfcontextClose()的最后调用.

所以在发布上下文之前……

CGPdfcontextClose(ctx);CGContextRelease(ctx);
总结

以上是内存溢出为你收集整理的macos – Mac OS X:如何将多个NSView绘制成一个新的多页PDF?全部内容,希望文章能够帮你解决macos – Mac OS X:如何将多个NSView绘制成一个新的多页PDF?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1002085.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存