2011-02-03 76 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打印對話框中將數據導入到數據中,我可以在這種方法中使用,我將接受他們的回答而不是這個。也就是說,沒有使用碳功能。

相關問題