NSPrintOperation - 保存到位置而不提示

owl*_*ipe 6 macos cocoa pdf-generation swift swift3

我有一个GitHub的仓库,它允许用户通过加载到一个WebView中,并使用一些HTML保存在Mac上的分页PDF的NSPrintOperation(具体而言,NSPrintSaveJobshowsPrintPanel设置为false)以让用户保存该PDF的任何位置他们的Mac上类似于默认的保存面板NSSavePanel.但是,我正在尝试使用代码,而我想将创建的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()
Run Code Online (Sandbox Code Playgroud)

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

Jc *_*lan 2

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

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

但是,要测试它,您可以将字符串转储到 Web 视图中并按原样使用代码。生成的文件出现在“user/documents”目录的根目录中。

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)")
   }
 }
Run Code Online (Sandbox Code Playgroud)