2011-02-03 73 views
2

目前,我正在为OSX编写一个应用程序,该应用程序最终需要移植到iOS。不使用NSView进行打印

需要打印的数据正在通过CoreGraphics绘制到PDF上下文中 - 完美地工作。

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

在iOS上,UIPrintInteractionControllerprintingItem属性可以接受一个包含PDF数据的NSData对象并打印该数据。看起来应该是相当直接的。

另一方面,OSX(看起来像)需要使用NSPrintOperation类 - 但它似乎是通过NSView获取数据的唯一方法。 (+printOperationWithView:+printOperationWithView:printInfo:)。

看到内容已被格式化和分页已经看起来似乎没有多大意义,必须重新绘制PDF数据到像NSView。

难道还有另外一种方法可以实现我错过的?

+0

已经找到一些有用的信息:[Core Printing Reference](http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CorePrintRef/Reference/reference.html) - `PMPrinterPrintWithProvider`看起来像它可能能够完成这项工作,但如果任何人有另一个或希望更好的建议,请张贴它! – arrtchiu 2011-02-03 02:53:57

回答

3

此代码是不完整的,但任何人谁遇到此之后,这基本上是如何从一个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打印对话框中将数据导入到数据中,我可以在这种方法中使用,我将接受他们的回答而不是这个。也就是说,没有使用碳功能。

相关问题