在WKWebView中使用图像从HTML生成PDF

Vin*_*los 4 pdf xcode ios swift wkwebview

我正在尝试在我的应用程序中生成发票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>
Run Code Online (Sandbox Code Playgroud)

有人知道为什么我的图像没有PDF吗?

Ash*_*han 5

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


Jam*_*Jam 5

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

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