UIMarkupTextPrintFormatter使用自定义背景和透明HTML内容创建PDF

时间:2017-10-03 14:15:14

标签: html css swift printing cgcontext

我正在使用UIPrintPageRendererUIMarkupTextPrintFormatter来打印以UIWebView呈现的html页面。我想要实现以下目标: 我想将html内容作为透明层渲染到上下文中,但在上下文中覆盖所有内容的UIPrintPageRenderer呈现时,html内容的背景颜色始终为白色。

html样式包含以下代码段:

body {
      background-color: transparent !important;;
      -webkit-print-color-adjust: exact;
}

UIWebView我可以看到html的背景确实是透明的,因为我将UIWebView的背景设置为不同的颜色。

这是我用于创建PDF数据的代码:

let printPageRenderer = UIPrintPageRenderer()
let printFormatter = UIMarkupTextPrintFormatter(markupText: htmlContent)
printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)

let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, Constants.Pdf.rect, nil)
let context = UIGraphicsGetCurrentContext()!

for i in 0..<printPageRenderer.numberOfPages {
    UIGraphicsBeginPDFPage()

    let backCoverView = UIView(frame: Constants.Pdf.rect)
    backCoverView.backgroundColor = UIColor(patternImage: UIImage(named: "background.png")!)
    backCoverView.layer.render(in: context)

    context.clear(printableRect)

    printPageRenderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")
    printPageRenderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
}

UIGraphicsEndPDFContext()

我的问题是通过&#34; background.png&#34;呈现的html内容。不透明但有白色背景。 html样式中的透明属性似乎被UIPrintPageRenderer忽略。将html样式中的background-color设置为例如blue将呈现的html背景颜色从白色更改为蓝色。我还尝试通过使用context.clear(printableRect)透明化上下文来使渲染的html透明无效。

如何使UIPrintPageRenderer打印带有透明背景的html内容,以便上下文中已渲染的背景不被html的白色背景覆盖?

2 个答案:

答案 0 :(得分:2)

这不是保证,但正如Yvonne所说,您的PDF渲染器可能不支持transparent作为颜色值。

可能的解决方案A

尝试使用一个100%透明像素创建1px x 1xx PNG图像,然后将其设置为元素上的重复背景图像。

可能的解决方案B

当此库呈现时,HTML元素本身可能是白色的。您可以像对html一样对body标记应用CSS。

可能的解决方案C

如果我理解你的情况,你会尝试在其他应用内内容的基础上覆盖UIWebView内部的渲染PDF。我无法谈论PDF是否真的能够支持透明度。 UIWebView可能有自己的属性(更不用说可能有一个PDF查看器,默认背景为白色)。如果您可以控制UIWebView的样式,请查看:How to make a transparent UIWebView

可能的解决方案D

使用Canvas(HTML或Switft)渲染图像而不是PDF也许会更好。如果这适用于您的用例,那么它可能是一个长期更好的选择。

答案 1 :(得分:0)

通过切换到其他UIPrintFormatter来解决问题。从UIMarkupTextPrintFormatter切换到尊重透明度的UIViewPrintFormatter