【问题标题】:Generate PDF from HTML in WKWebView with images在 WKWebView 中从 HTML 生成带有图像的 PDF
【发布时间】:2018-09-24 06:34:33
【问题描述】:

我正在尝试在我的应用中生成发票 PDF。这个想法是可以打印发票,然后生成 PDF 以便稍后通过电子邮件发送。

一切正常,包括打印格式,但是当我导出为 PDF 时,PDF 中的徽标图像消失了。

这是我在 WKWebView 中的原始 HTML

这是我的打印版

但是当我导出为 PDF 时,它看起来像这样: 徽标不见了。

我的 HTML 是这样的:

        <tr>
            <td>
                <table class="headerTable">
                    <tr>
                        <td width="33%"><img src="logo.png" style="width:80%; max-width:250px"></td>
                        <td width="1%"></td>
                        <td width="33%"><b>Realengo</b><br>Avenida Santa Cruz 1251<br>Realengo - Rio de Janeiro<br>Telefone: (21) 2401-0271</td>
                        <td width="33%"><b>Centro</b><br>Rua Buenos Aires 111<br>Centro - Rio de Janeiro<br>Telefone: (21) 2151-1189</td>
                    </tr>
                </table>
            </td>
        </tr>

有人知道为什么我的图片不是 PDF 格式吗?

【问题讨论】:

    标签: ios swift xcode pdf wkwebview


    【解决方案1】:

    WKWebView 在 iOS14 已经支持导出 PDF

    import PDFKit
    
    let config = WKPDFConfiguration()
     webView.createPDF(configuration: config) { result in
       switch result {
         case .success(let data):
           print("create pdf success: \(data)")
         case .failure(let error):
           print("create pdf failure: \(error)")
         }
      }
    

    https://developer.apple.com/documentation/webkit/wkwebview/3650490-createpdf

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案2】:

    斯威夫特 4.2 信用:http://www.swiftdevcenter.com/create-pdf-from-uiview-wkwebview-and-uitableview/

    extension WKWebView {
    
    // Call this function when WKWebView finish loading
     func exportAsPdfFromWebView() -> String {
        let pdfData = createPdfFile(printFormatter: self.viewPrintFormatter())
        return self.saveWebViewPdf(data: pdfData)
     }
    
     func createPdfFile(printFormatter: UIViewPrintFormatter) -> NSMutableData {
        
        let originalBounds = self.bounds
        self.bounds = CGRect(x: originalBounds.origin.x, y: bounds.origin.y, width: self.bounds.size.width, height: self.scrollView.contentSize.height)
        let pdfPageFrame = CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.scrollView.contentSize.height)
        let printPageRenderer = UIPrintPageRenderer()
        printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
        printPageRenderer.setValue(NSValue(cgRect: UIScreen.main.bounds), forKey: "paperRect")
        printPageRenderer.setValue(NSValue(cgRect: pdfPageFrame), forKey: "printableRect")
        self.bounds = originalBounds
        return printPageRenderer.generatePdfData()
     }
    
     // Save pdf file in document directory
     func saveWebViewPdf(data: NSMutableData) -> String {
        
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let docDirectoryPath = paths[0]
        let pdfPath = docDirectoryPath.appendingPathComponent("webViewPdf.pdf")
        if data.write(to: pdfPath, atomically: true) {
            return pdfPath.path
        } else {
            return ""
        }
      }
    }
    
    extension UIPrintPageRenderer {
    
     func generatePdfData() -> NSMutableData {
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, self.paperRect, nil)
        self.prepare(forDrawingPages: NSMakeRange(0, self.numberOfPages))
        let printRect = UIGraphicsGetPDFContextBounds()
        for pdfPage in 0 ..< self.numberOfPages {
            UIGraphicsBeginPDFPage()
            self.drawPage(at: pdfPage, in: printRect)
        }
        UIGraphicsEndPDFContext();
        return pdfData
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多