不使用 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 打印的主要内容,如果未能解决你的问题,请参考以下文章