美文网首页
WKWebView生成pdf

WKWebView生成pdf

作者: 疯狂的面条 | 来源:发表于2022-09-14 17:37 被阅读0次

故事起因

公司签约功能之前放在后台,后来因为服务器压力太大,CPU时不时100%占用,排查问题发现后台java一行一行的画pdf,导致很慢,也无法优化,遂决定放到前端。
后台小伙伴把之前画pdf的java类扔给我们,幽幽地跟我说:你看看能不能翻译成iOS的语言,我看着几百行的代码陷入了沉思,安卓小伙伴倒是直接用上了,美滋滋。

略懂点儿html+css的我,决定用html画出来,然后WKWebView转pdf。网上一搜,果然有解决方案。代码如下:

问题代码

extension WKWebView {
    func pdfData() -> Data {
        let fmt = self.viewPrintFormatter()
        let render = UIPrintPageRenderer()
        render.addPrintFormatter(fmt, startingAtPageAt: 0)
        let pageRect = CGRect(x: 0, y: 0, width: 600, height: 768)
        
        let printable = pageRect.insetBy(dx: 50, dy: 50)
        render.setValue(pageRect, forKey: "paperRect")
        render.setValue(printable, forKey: "printableRect")
        
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)
        
        for i in 0 ..< render.numberOfPages {
            UIGraphicsBeginPDFPage()
            let bounds = UIGraphicsGetPDFContextBounds()
            render.drawPage(at: i, in: bounds)
        }
        UIGraphicsEndPDFContext()
        return Data(referencing: pdfData)
    }
}

然后功能就上线了。
几天后,后台小伙伴开始找我,说iOS很多设备报错,客户电话都打进来,客服小姐姐们忙不过来了...

What?明明测得好好的,为啥会出问题呢。pdf内容展示没问题,但就是签约失败。出现问题的设备都是比较老的机型,复制pdf的内容,粘贴到其他地方,发现乱码,,难道是网上传了很久的字体问题?尝试了一下修改字体,根本不解决问题。

解决方案

这个问题弄了几天,最后突发奇想,更改UIPrintFormatter试一下,发现有一个类

UIMarkupTextPrintFormatter

传入htmlString,问题竟然解决了,只怪我英文不好,当初就尝试过Simple那个PrintFormatter类,但是不行,这个类也看过,不懂MarkupText是啥意思,也没试过,在这里吐槽下苹果文档做的太差了,点进去根本看不到什么说明,只有在敲代码时才会看到html相关的字眼。解决办法如下:

private func getPdfData() -> Data {
        // htmlStr是html标签字符串
        let fmt = UIMarkupTextPrintFormatter(markupText: htmlStr)
        let render = UIPrintPageRenderer()
        render.addPrintFormatter(fmt, startingAtPageAt: 0)
        let pageRect = CGRect(x: 0, y: 0, width: 600, height: 768)
        
        let printable = pageRect.insetBy(dx: 50, dy: 50)
        render.setValue(pageRect, forKey: "paperRect")
        render.setValue(printable, forKey: "printableRect")
        
        let pdfData = NSMutableData()
        UIGraphicsBeginPDFContextToData(pdfData, .zero, nil)
        
        for i in 0 ..< render.numberOfPages {
            UIGraphicsBeginPDFPage()
            let bounds = UIGraphicsGetPDFContextBounds()
            render.drawPage(at: i, in: bounds)
        }
        UIGraphicsEndPDFContext()
        return Data(referencing: pdfData)
    }

遗留问题

问题解决了,至于为什么第一种方式会出现问题,目前还没找到答案,希望知道的小伙伴能告知一下。
好啦,希望能帮助到大家!

相关文章

网友评论

      本文标题:WKWebView生成pdf

      本文链接:https://www.haomeiwen.com/subject/dkfdortx.html