故事起因
公司签约功能之前放在后台,后来因为服务器压力太大,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)
}
遗留问题
问题解决了,至于为什么第一种方式会出现问题,目前还没找到答案,希望知道的小伙伴能告知一下。
好啦,希望能帮助到大家!
网友评论