不使用 NSView 打印

Posted

技术标签:

【中文标题】不使用 NSView 打印【英文标题】:Printing without an NSView 【发布时间】:2011-02-03 00:46:07 【问题描述】:

目前我正在为 OSX 编写一个最终需要移植到 ios 的应用程序。

需要打印的数据正在通过 CoreGraphics 绘制到 PDF 上下文中 - 效果很好。

我一直在阅读有关在 iOS 和 OSX 中打印的 Apple 开发文档,具有讽刺意味的是,实际上从 iOS 打印似乎会更容易。

在 iOS 上,UIPrintInteractionController 的 printingItem 属性可以获取包含 PDF 数据的 NSData 对象并打印它。看起来应该是相当直截了当的。

另一方面,OSX(看起来)需要使用NSPrintOperation 类——但似乎将数据导入实例的唯一方法是通过 NSView。 (+printOperationWithView:+printOperationWithView:printInfo:)。

鉴于内容已经格式化和分页,因此必须将 PDF 数据重新绘制为 NSView 之类的东西似乎毫无意义。

是否有其他方法可以实现我错过的目标?

【问题讨论】:

找到了一些有用的信息:Core Printing Reference - PMPrinterPrintWithProvider 看起来它可能能够完成这项工作,但如果有人有其他或希望有更好的建议,请发布! 我建议将其发布为答案。 @PeterHosey:我愿意,但是这样做需要大量代码,并且不允许用户使用 OSX 的内置对话框更改任何设置。此外,设置纸张尺寸之类的事情似乎没有记录。将继续寻找替代解决方案。 【参考方案1】:

这段代码并不完整,但对于以后遇到的任何人来说,这基本上就是您可以直接从 NSData 流中打印的方式:

#define kMimeType @"application/pdf"
#define kPaperType @"A4"
- (void)printData:(NSData *)incomingPrintData 
    CFArrayRef printerList; //will soon be an array of PMPrinter objects
    PMServerCreatePrinterList(kPMServerLocal, &printerList);
    PMPrinter myPrinter;
    //iterate over printerList and determine which one you want, assign to myPrinter

    PMPrintSession printSession;
    PMPrintSettings printSettings;
    PMCreateSession(&printSession);
    PMCreatePrintSettings(&printSettings);
    PMSessionDefaultPrintSettings(printSession, printSettings);

    CFArrayRef paperList;
    PMPrinterGetPaperList(myPrinter, &paperList);
    PMPaper usingPaper;
    //iterate over paperList and to set usingPaper to the paper desired

    PMPageFormat pageFormat;
    PMCreatePageFormatWithPMPaper(&pageFormat, usingPaper);

    CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((CFDataRef)incomingPrintData);
    PMPrinterPrintWithProvider(myPrinter, printSettings, pageFormat, (CFStringRef)kMimeType, dataProvider);

(通过Core Printing Reference) 请注意此代码缺少内存管理,因此您需要使用 PMRetain()PMRelease() 函数以及 CoreFoundation 内存管理函数。

如果有人能告诉我如何将 OSX 打印对话框中的数据转换为我可以在这种方法中使用的数据,我会接受他们的答案而不是这个。也就是说,不使用 Carbon 函数。

【讨论】:

以上是关于不使用 NSView 打印的主要内容,如果未能解决你的问题,请参考以下文章

如何在移动 NSView 时接收通知

如何使用Swift在Cocoa App中设置NSView的颜色?

NSView的特定圆角

添加为子视图的 NSView 不显示

如何使用非透明窗口创建内部透明nsview

从 viewcontrollernib 加载 NSView