【问题标题】:NSPrintOperation—save to location without promptNSPrintOperation——不提示保存到位置
【发布时间】:2016-10-17 00:35:30
【问题描述】:

我有一个GitHub repository,它允许用户通过将其加载到 WebView 并使用NSPrintOperation(特别是NSPrintSaveJob 并将showsPrintPanel 设置为false)从某些HTML 在Mac 上保存分页PDF允许用户使用类似于默认的NSSavePanelsave panel 将该PDF 保存到他们Mac 上的任何位置。但是,我正在试验代码,我想在没有保存面板的情况下将创建的 PDF 保存到特定文件夹 (/Users/owlswipe/Downloads/)。

我从 WebView(带有保存面板)保存 PDF 的代码目前是这样的:

let printOpts: [String : AnyObject] = [NSPrintJobDisposition:NSPrintSaveJob as AnyObject]
let printInfo: NSPrintInfo = NSPrintInfo(dictionary: printOpts)
printInfo.paperSize = NSMakeSize(595.22, 841.85)
let printOp: NSPrintOperation = NSPrintOperation(view: webView.mainFrame.frameView.documentView, printInfo: printInfo)
printOp.showsPrintPanel = false
printOp.showsProgressPanel = false
printOp.run()

如何调整该代码以将 PDF 保存到预设文件夹,而不是保存到用户从保存面板中选择的文件夹?

【问题讨论】:

  • NSPrintOperation 也有一个类方法func pdfOperation(with: NSView, inside: NSRect, toPath: String, printInfo: NSPrintInfo)

标签: swift macos cocoa pdf-generation swift3


【解决方案1】:

这段代码在 Swift 4/Cocoa 中为我工作以完成您想要的工作,但是其中还有更多代码,因为它将 WKWebView 的内容呈现为 PDF 的 8.5" x 11" 页面。

因此,对于您的应用程序,您的内容流/打印对象会有适当的调整,但打印操作的配置将是相同的,以获得您想要的“无对话框”结果。

但是,要对其进行测试,您可以将字符串转储到 web 视图中并按原样使用代码。生成的文件出现在“用户/文档”目录的根目录中。

static func createPDF(htmlString: String, streamId: String = "someStream") {

    let webView = WebView()
    webView.mainFrame.loadHTMLString(htmlString, baseURL: nil)
    let when = DispatchTime.now() + 1

    DispatchQueue.main.asyncAfter(deadline: when) {

       let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
       let directoryURLStr = directoryURL.absoluteString+"\(streamId).pdf"

       let outputFilePath = URL(string: directoryURLStr)

       let printOpts: [NSPrintInfo.AttributeKey : Any] = [
         NSPrintInfo.AttributeKey.jobDisposition : NSPrintInfo.JobDisposition.save,
         NSPrintInfo.AttributeKey.jobSavingURL   : outputFilePath
       ]

       let printInfo: NSPrintInfo = NSPrintInfo(dictionary: printOpts)
       let baseMargin: CGFloat    = 9.0; // .125"

       printInfo.paperSize    = NSMakeSize(612, 792); // 8.5" x 11/2"
       printInfo.topMargin    = baseMargin
       printInfo.leftMargin   = baseMargin
       printInfo.rightMargin  = baseMargin
       printInfo.bottomMargin = baseMargin

       let printOp: NSPrintOperation = NSPrintOperation(view: webView.mainFrame.frameView.documentView, printInfo: printInfo)

       printOp.showsPrintPanel = false
       printOp.showsProgressPanel = false
       printOp.run()

       Swift.print("Document complete: \(outputFilePath!.absoluteString)")
   }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2016-10-18
    相关资源
    最近更新 更多