Cocoa swift macOS 打印 html 到 pdf

Posted

技术标签:

【中文标题】Cocoa swift macOS 打印 html 到 pdf【英文标题】:Cocoa swift macOS Print html to pdf 【发布时间】:2018-05-28 09:55:40 【问题描述】:

我想从 html 内容生成一个 pdf 文件。 (从 html 模板生成发票) 我想指出,我是一个swift-beginner

要将 html 内容打印到 pdf 文件,我使用以下代码:

func makePDF(markup: String) 
    let directoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    
    let printOpts: [NSPrintInfo.AttributeKey: Any] = [NSPrintInfo.AttributeKey.jobDisposition: NSPrintInfo.JobDisposition.save, NSPrintInfo.AttributeKey.jobSavingURL: directoryURL]
    let printInfo = NSPrintInfo(dictionary: printOpts)
    //printInfo.horizontalPagination = NSPrintInfo.
    //printInfo.verticalPagination = NSPrintInfo.AutoPagination
    printInfo.topMargin = 20.0
    printInfo.leftMargin = 20.0
    printInfo.rightMargin = 20.0
    printInfo.bottomMargin = 20.0
    
    let view = NSView(frame: NSRect(x: 0, y: 0, width: 570, height: 740))
    
    if let htmlData = markup.data(using: String.Encoding.utf8) 
        if let attrStr = NSAttributedString(html: htmlData, options: [ .documentType : NSAttributedString.DocumentType.html], documentAttributes: nil) 
            
            print(attrStr);
        
            let frameRect = NSRect(x: 0, y: 0, width: 570, height: 740)
            let textField = NSTextField(frame: frameRect)
            textField.attributedStringValue = attrStr
            view.addSubview(textField)
            
            let printOperation = NSPrintOperation(view: view, printInfo: printInfo)
            

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

基于此 *** 问题/答案:***Answer

我不得不将代码“翻译”为 swift4 - 这里很可能出现任何错误 运行代码时,我得到以下日志(按此顺序):

    NSURLConnection 完成但出现错误 - 代码 -1002 打印失败,因为 PMSessionBeginCGDocumentNoDialog() 返回 -61。 NSURLConnection 完成但出现错误 - 代码 -1002

PMSessionBeginCGDocumentNoDialog() -61 -> 根据this表示我在某个位置没有写权限(写权限错误)

我尝试切换沙盒模式,并授予应用程序读取和写入桌面文件的权限。

有人知道如何修复 PMSessionBeginCGDocumentNoDialog() -61 错误吗? (或者通常让代码启动并运行......) 谢谢!

【问题讨论】:

【参考方案1】:

更多研究得出以下答案: SO answer

指的是这个 GitHub 项目 GitHub Swift 3 PDFCreator

github项目中的代码解决了我的错误!完美运行。

【讨论】:

以上是关于Cocoa swift macOS 打印 html 到 pdf的主要内容,如果未能解决你的问题,请参考以下文章

Swift / Cocoa:如何观察文件夹的变化?

使用 PDFOutline 在 Swift/Cocoa 中将 TOC 添加到 PDFDocument

在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐

如何使用 Storyboards/Cocoa 在 Swift 3.x 中引用视图的窗口

自定义类 Unarchive 在 Cocoa Swift 中为零

使用 Cocoa 在 Swift 4.0 中以编程方式创建复选框的标准方法是啥?