#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)")
}
}