从 macOS 应用程序打印 PDF - 将上下文定义为 PDFDocument
Posted
技术标签:
【中文标题】从 macOS 应用程序打印 PDF - 将上下文定义为 PDFDocument【英文标题】:Printing a PDF from a macOS App - Defining the context as a a PDFDocument 【发布时间】:2019-08-11 19:36:52 【问题描述】:我们正在从 ios 移植到 macOS,需要能够直接从应用程序打印 PDF 文档。下面是相关的方法。
只是没有看到如何将“contextInfo”定义为 PDFDocument?
- (void)printDocumentWithSettings:(NSDictionary<NSPrintInfoAttributeKey, id> *)printSettings
showPrintPanel:(BOOL)showPrintPanel
delegate:(id)delegate
didPrintSelector:(SEL)didPrintSelector
contextInfo:(void *)contextInfo;
PDFDocument *pdfDoc = [[PDFDocument alloc] initWithURL:url];
将我们的用户发送到 AdobePDF 查看器以搜索系统文件夹不是解决方案。通常,Apple Doc 没有帮助,而且许多 macOS 示例已经使用了八年!
任何帮助或替代解决方案将不胜感激。
谢谢,
约翰
【问题讨论】:
【参考方案1】:很抱歉使用 Swift,但这是我打印 PDF 所采用的方法。
PDFDocument 有一个创建 NSPrintOperation 的方法。
if let printOperation = thePDFDocument?.printOperation(for: thePrintInfo(), scalingMode: .pageScaleNone, autoRotate: true)
printOperation.printPanel = thePrintPanel()
/// Would prefer to use .runModal but don't know what the window is.
printOperation.run()
thePrintInfo() 和 thePrintPanel() 是定义打印设置和对话框的函数。
func thePrintInfo() -> NSPrintInfo
let thePrintInfo = NSPrintInfo()
thePrintInfo.horizontalPagination = .fit
thePrintInfo.verticalPagination = .fit
thePrintInfo.isHorizontallyCentered = true
thePrintInfo.isVerticallyCentered = true
thePrintInfo.leftMargin = 0.0
thePrintInfo.rightMargin = 0.0
thePrintInfo.topMargin = 0.0
thePrintInfo.bottomMargin = 0.0
thePrintInfo.jobDisposition = .spool
return thePrintInfo
// Add the Page Setup options to the Print Dialog
func thePrintPanel() -> NSPrintPanel
let thePrintPanel = NSPrintPanel()
thePrintPanel.options = [
NSPrintPanel.Options.showsCopies,
NSPrintPanel.Options.showsPrintSelection,
NSPrintPanel.Options.showsPageSetupAccessory,
NSPrintPanel.Options.showsPreview
]
return thePrintPanel
【讨论】:
感谢本维吉的代码。这是一个很好的例子,说明如何用 20 行 swift 代码来完成可以用 3 行 Objective C 代码完成的事情! 公平地说,我认为在 ObjC 中可能会类似:您不必设置所有这些参数,操作系统将使用默认值。【参考方案2】:这可以通过以下方式完成:
创建一个 pdfView。
@property (weak) IBOutlet PDFView *showPDFView;
分配您的 PDF 的 URL 并设置此文档的视图。
pdfDoc = [[PDFDocument alloc] initWithURL:url];
[showPDFView setDocument:pdfDoc];
在视图上调用打印方法。
[showPDFView print : nil];
仅此而已!
【讨论】:
打印 PDFView 与打印 PDF 数据本身不同。您最终会在打印输出上看到滚动条!以上是关于从 macOS 应用程序打印 PDF - 将上下文定义为 PDFDocument的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa swift macOS 打印 html 到 pdf