没有NSView的打印

时间:2011-02-03 00:46:07

标签: objective-c cocoa macos printing

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

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

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

在iOS上,UIPrintInteractionControllerprintingItem属性可以获取包含PDF数据的NSData对象并打印出来。看起来应该是相当简单的。

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

看到内容已格式化并已分页,将PDF数据重新绘制为类似NSView的内容似乎毫无意义。

可能有另一种方法可以实现这一点,我错过了吗?

1 个答案:

答案 0 :(得分: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打印对话框中的数据转换为我可以在此方法中使用的数据,我将接受他们的答案,而不是这个。也就是说,不使用碳功能。