objective-c - 不使用 NSView 进行打印

标签 objective-c cocoa macos printing

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

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

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

在 iOS 上,UIPrintInteractionControllerprintingItem 属性可以获取包含 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/

相关文章:

linux - 我可以让 FIND_LIBRARY 在我的 *custom* 依赖项构建完成后运行吗?

objective-c - 自定义 NSToolbar - 禁用 "Use small size"

ios - 隐藏或隐藏 UIButton 顺序更改的最快方法

objective-c - 如何禁止用户在 NSTextField 中输入数字?

objective-c - 如何使大纲 View 像表格 View 一样可重新排序?

cocoa - 复制热键上的当前选择

macos - 如何使用 XCode 4.6 和 OS X 10.8 设置 SDL2

java - 在MacOS环境中使用selenium、java测试Electron应用程序

iphone - 在 iOS 7 中以编程方式锁定 iPhone 屏幕

iphone - 强制iphone应用程序以编程方式重新启动?