从 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];

将我们的用户发送到 Adob​​ePDF 查看器以搜索系统文件夹不是解决方案。通常,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

如何通过“ Microsoft打印为PDF”以编程方式将文件和网页打印为PDF?

如何以编程方式将 PDF 数据发送到打印机?

在 Mac 中 Java 打印 PDF 文件

从 Windows 8 应用程序打印 PDF 文档

如何将网页打印为不分页的pdf