将 'PageSetupAccessory' 添加到 PDFDocument 的打印面板

Add 'PageSetupAccessory' to PrintPanel for PDFDocument

我有一个显示 PDFView 的应用程序,我希望它从视图中打印 PDF 文件。此外,我希望“打印”面板显示页面设置附件(即纸张尺寸、方向和比例设置,如在预览中一样,显示为选项下拉列表的一个面板)。

目前,我错误地打印了 PDFView,而不是 PDF 文档本身。这只给我一页,并在打印输出中包含滚动条!我看不出如何 init 一个 NSPrintOperation 引用 PDFDocument 而不是 PDFView

这是我的代码,可以运行,但不是我想要的。我想我必须用定义面板和信息的类似代码覆盖 NSDocumentprintDocumentprintOperation 函数。

func thePrintInfo() -> NSPrintInfo {
    let thePrintInfo = NSPrintInfo()
    thePrintInfo.horizontalPagination = .automatic // Tried fit
    thePrintInfo.verticalPagination = .automatic // Tried fit
    thePrintInfo.isHorizontallyCentered = true // Tried false
    thePrintInfo.isVerticallyCentered = true // Tried false
    thePrintInfo.leftMargin = 0.0
    thePrintInfo.rightMargin = 0.0
    thePrintInfo.topMargin = 0.0
    thePrintInfo.bottomMargin = 0.0
    thePrintInfo.jobDisposition = .spool
    return thePrintInfo
}

// Need to show the 'Page Setup' Options as an Accessory
// e.g. Paper size, orientation.
@IBAction func printContent(_ sender: Any) {
    let printOperation = NSPrintOperation(view: thePDFView, printInfo: thePrintInfo())
    let printPanel = NSPrintPanel()
    printPanel.options = [
        NSPrintPanel.Options.showsCopies,
        NSPrintPanel.Options.showsPrintSelection,
        NSPrintPanel.Options.showsPageSetupAccessory,
        NSPrintPanel.Options.showsPreview
    ]
    printOperation.printPanel = printPanel
    printOperation.run()
}

根据@Willeke 的评论,我提出了以下建议,似乎效果不错。 (小问题是打印对话框不是 sheet。)如果有人有任何改进,请 post 一个更好的答案。

@IBAction func printContent(_ sender: Any) {
   let printOperation = thePDFView.document?.printOperation(for: thePrintInfo(), scalingMode: .pageScaleNone, autoRotate: true)
printOperation?.printPanel = thePrintPanel()
printOperation?.run()
}