微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

html – UIMarkupTextPrintFormatter永远不会渲染base64图像

我在swift 3.0中用html内容创建一个pdf文件
/**
 *
 */
func exportHtmlContentToPDF(HTMLContent: String,filePath: String) {
    // let webView = UIWebView(frame: CGRect(x: 0,y: 0,width: 694,height: 603));

    // webView.loadHTMLString(HTMLContent,baseURL: nil);

    let pdfPrinter = PDFPrinter();
    let printFormatter = UIMarkupTextPrintFormatter(markupText: HTMLContent);
    // let printFormatter = webView.viewPrintFormatter();

    pdfPrinter.addPrintFormatter(printFormatter,startingAtPageAt: 0);

    let pdfData = self.drawPDFUsingPrintPageRenderer(printPageRenderer: pdfPrinter);

    pdfData?.write(toFile: filePath,atomically: true);
}

/**
 *
 */
func drawPDFUsingPrintPageRenderer(printPageRenderer: UIPrintPageRenderer) -> NSData! {
    let data = NSMutableData();

    UIGraphicsBeginPDFContextToData(data,CGRect.zero,nil);

    printPageRenderer.prepare(forDrawingPages: NSMakeRange(0,printPageRenderer.numberOfPages));

    let bounds = UIGraphicsGetPDFContextBounds();

    for i in 0...(printPageRenderer.numberOfPages - 1) {
        UIGraphicsBeginpdfpage();

        printPageRenderer.drawPage(at: i,in: bounds);
    }

    UIGraphicsEndPDFContext();

    return data;
}

除了我的base64编码图像,一切都很好. Webview或内部safari或chrome浏览器中的HTML内容本身正确显示并正确显示所有图像.但图像永远不会呈现为PDF格式.

为什么图像没有渲染,我怎样才能渲染它们?

解决方法

发生这种情况是因为WebKit首先将HTML解析为DOM,并在多个事件循环周期中呈现内容.因此,您不仅要等待页面DOM准备好,还要等待资源加载完成.正如您所建议的那样,您需要重构代码,以便首先加载webview,然后才导出其内容.

要确定触发导出的正确时间,您可以在Web视图中观察DOM文档的状态.有多种方法可以做到这一点,但我找到的最可读的选项是a port of an answer to a related Objective-C question:在UIWebViewDelegate实现中,按照以下方式实现webViewDidFinishLoad以监控document.readyState

func webViewDidFinishLoad(_ webView: UIWebView) {

        guard let readyState = webView.stringByEvaluatingJavaScript(from: "document.readyState"),readyState == "complete" else
        {
            // document not yet parsed,or resources not yet loaded.
            return
        }

        // This is the last webViewDidFinishLoad call --> export.
        //
        // There is a problem with this method if you have JS code loading more content:
        // in that case -webViewDidFinishLoad can get called again still after document.readyState has already been in state 'complete' once or more.
        self.exportHtmlContentToPDF(…)
    }

原文地址:https://www.jb51.cc/html/232296.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐