NSPrintOperation—сохранить в папку без запроса

#swift #macos #cocoa #pdf-generation #swift3

#swift #macos #какао #pdf-генерация #swift3

Вопрос:

У меня есть репозиторий GitHub, который позволяет пользователю сохранять разбитый на страницы PDF-файл на Mac из некоторого HTML, загружая его в WebView и используя NSPrintOperation (в частности, NSPrintSaveJob с showsPrintPanel установленным значением false) позволяет пользователю сохранять этот PDF-файл в любом месте на своем Mac с панелью сохранения, аналогичной панели по умолчанию NSSavePanel . Тем не менее, я экспериментирую с кодом, и вместо этого я хотел бы сохранить созданный PDF-файл в определенную папку ( /Users/owlswipe/Downloads/ ) без панели сохранения.

Мой код для сохранения PDF-файла из WebView (с панелью сохранения) в настоящее время выглядит следующим образом:

 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-файла в предварительно заданную папку, а не в выбранные пользователем папки на панели сохранения?

Комментарии:

1. NSPrintOperation также имеет метод класса func pdfOperation(with: NSView, inside: NSRect, toPath: String, printInfo: NSPrintInfo) .

Ответ №1:

Этот фрагмент кода работает для меня в Swift 4 / Cocoa, чтобы выполнить то, что вы хотите, однако там немного больше кода, поскольку он преобразует содержимое WKWebView в страницы размером 8,5 x 11 дюймов для PDF.

Итак, для вашего приложения будут соответствующие настройки для вашего потока содержимого / объекта печати, но конфигурация операции печати будет такой же, чтобы получить желаемые результаты «без диалога».

Однако, чтобы проверить это, вы можете просто сбросить свою строку в webview и использовать код как есть. Сгенерированные файлы отображаются в корне вашего каталога «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)")
   }
 }