由于 iOS 14 从 Webview 创建 PDF 无法正常工作
Since iOS 14 creating a PDF from a Webview not working correctly
在 iOS 14 之前,我有一个函数 createPDF_Specs 从 Web 视图为我创建了一个 DIN A4 PDF。
然而,自 iOS14 以来,它将 webview 的背景图片(从 htmlString 创建)移动到 PDF 中的第二个站点。奇怪的是,webview 显示正确。
第一张图片显示了 Web 视图的显示方式,第二张图片显示了 PDF 的最终结果。
func createPDF_Specs(formatter: UIViewPrintFormatter, filename: String) -> String {
// From: https://gist.github.com/nyg/b8cd742250826cb1471f
// 2. Assign print formatter to UIPrintPageRenderer
let render = UIPrintPageRenderer()
render.addPrintFormatter(formatter, startingAtPageAt: 0)
// 3. Assign paperRect and printableRect
let page = CGRect(x: 0, y: 0, width: 841.8, height: 595.2) // A4, 72 dpi
let printable = page.insetBy(dx: -3, dy: -3)
render.setValue(NSValue(cgRect: page), forKey: "paperRect")
render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
// 4. Create PDF context and draw
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, page, nil)
print(render.numberOfPages, "Number of pages")
for i in 1...render.numberOfPages {
UIGraphicsBeginPDFPage();
let bounds = UIGraphicsGetPDFContextBounds()
print(bounds)
// render.drawPage(at: i - 1, in: bounds)
render.drawPage(at: i - 1, in: page)
}
UIGraphicsEndPDFContext()
// 5. Save PDF file
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let filePath = "\(documentsPath)/\(filename).pdf"
pdfPath = URL(string: filePath)
pdfData.write(toFile: filePath, atomically: true)
print("open \(filePath)")
return filePath
}
答:这是一个 apple bug。我向 Apple 报告了它,他们用 iOS 14.1
修复了它
在 iOS 14 之前,我有一个函数 createPDF_Specs 从 Web 视图为我创建了一个 DIN A4 PDF。 然而,自 iOS14 以来,它将 webview 的背景图片(从 htmlString 创建)移动到 PDF 中的第二个站点。奇怪的是,webview 显示正确。
第一张图片显示了 Web 视图的显示方式,第二张图片显示了 PDF 的最终结果。
func createPDF_Specs(formatter: UIViewPrintFormatter, filename: String) -> String {
// From: https://gist.github.com/nyg/b8cd742250826cb1471f
// 2. Assign print formatter to UIPrintPageRenderer
let render = UIPrintPageRenderer()
render.addPrintFormatter(formatter, startingAtPageAt: 0)
// 3. Assign paperRect and printableRect
let page = CGRect(x: 0, y: 0, width: 841.8, height: 595.2) // A4, 72 dpi
let printable = page.insetBy(dx: -3, dy: -3)
render.setValue(NSValue(cgRect: page), forKey: "paperRect")
render.setValue(NSValue(cgRect: printable), forKey: "printableRect")
// 4. Create PDF context and draw
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, page, nil)
print(render.numberOfPages, "Number of pages")
for i in 1...render.numberOfPages {
UIGraphicsBeginPDFPage();
let bounds = UIGraphicsGetPDFContextBounds()
print(bounds)
// render.drawPage(at: i - 1, in: bounds)
render.drawPage(at: i - 1, in: page)
}
UIGraphicsEndPDFContext()
// 5. Save PDF file
let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let filePath = "\(documentsPath)/\(filename).pdf"
pdfPath = URL(string: filePath)
pdfData.write(toFile: filePath, atomically: true)
print("open \(filePath)")
return filePath
}
答:这是一个 apple bug。我向 Apple 报告了它,他们用 iOS 14.1
修复了它