目前我正在为 OSX 编写一个应用程序,最终需要移植到 iOS。
需要打印的数据通过 CoreGraphics 绘制到 PDF 上下文中 - 工作完美。
我一直在阅读有关 iOS 和 OSX 中打印的 Apple 开发文档,具有讽刺意味的是,实际上从 iOS 进行打印似乎会更容易。
在 iOS 上,UIPrintInteractionController的 printingItem
属性可以获取包含 PDF 数据的 NSData 对象并打印该对象。看起来应该相当简单。
另一方面,OSX(看起来像)需要使用 NSPrintOperation class - 但似乎将数据获取到实例的唯一方法是通过 NSView。 (+printOperationWithView:
或 +printOperationWithView:printInfo:
)。
由于内容已经格式化并分页,因此必须将 PDF 数据重新绘制为 NSView 之类的内容似乎毫无意义。
是否有可能有另一种我错过的方法来实现这一目标?
最佳答案
这段代码并不完整,但是对于以后遇到此代码的任何人来说,这基本上就是直接从 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 函数。
关于objective-c - 不使用 NSView 进行打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4881635/