UIMarkupTextPrintFormatter 创建具有自定义背景和透明 HTML 内容的 PDF
UIMarkupTextPrintFormatter PDF creation with custom background and transparent HTML content
我正在使用 UIPrintPageRenderer
和 UIMarkupTextPrintFormatter
打印 html 页面,该页面在 UIWebView
中呈现。我正在努力实现以下目标:
我想将 html 内容作为透明层渲染到上下文中,但是 html 内容的背景色在覆盖所有内容的上下文中使用 UIPrintPageRenderer
渲染时始终为白色以下。
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()
我的问题是在 "background.png" 上呈现的 html 内容不是透明的,而是有一个白色背景。 html 样式中的透明属性似乎被 UIPrintPageRenderer
忽略了。将 html 样式中的 background-color
设置为例如blue
将呈现的 html 背景颜色从白色更改为蓝色。我还尝试通过使用 context.clear(printableRect)
使上下文透明来使呈现的 html 透明,但无济于事。
如何让 UIPrintPageRenderer
打印具有透明背景的 html 内容,使上下文中已经呈现的背景不被 html 的白色背景覆盖?
这不能保证,但正如 Yvonne 提到的,您的 PDF 渲染器可能不支持 transparent
作为颜色值。
可能的解决方案 A
尝试创建一个只有一个 100% 透明像素的 1px x 1px PNG 图像,然后将其设置为元素上的重复背景图像。
可能的解决方案 B
当此库呈现时,HTML 元素本身可能是白色的。您可以将 CSS 应用到 html
标签,就像对 body
一样。
可能的解决方案 C
如果我对您的情况的理解正确,您是在尝试将 UIWebView 内呈现的 PDF 叠加在其他应用内内容之上。我不能说 PDF 是否真的可以支持透明度。 UIWebView 可能需要自己的属性(更不用说可能有一个默认背景为白色的 PDF 查看器在播放)。如果您可以控制 UIWebView 的样式,请看一下:How to make a transparent UIWebView
可能的解决方案 D
也许使用 Canvas(HTML 或 Switft)渲染图像而不是 PDF 会更好。如果这适用于您的用例,从长远来看,这可能是一个更好的选择。
通过切换到另一个 UIPrintFormatter
解决了问题。从 UIMarkupTextPrintFormatter
切换到 UIViewPrintFormatter
以表彰透明度。
我正在使用 UIPrintPageRenderer
和 UIMarkupTextPrintFormatter
打印 html 页面,该页面在 UIWebView
中呈现。我正在努力实现以下目标:
我想将 html 内容作为透明层渲染到上下文中,但是 html 内容的背景色在覆盖所有内容的上下文中使用 UIPrintPageRenderer
渲染时始终为白色以下。
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()
我的问题是在 "background.png" 上呈现的 html 内容不是透明的,而是有一个白色背景。 html 样式中的透明属性似乎被 UIPrintPageRenderer
忽略了。将 html 样式中的 background-color
设置为例如blue
将呈现的 html 背景颜色从白色更改为蓝色。我还尝试通过使用 context.clear(printableRect)
使上下文透明来使呈现的 html 透明,但无济于事。
如何让 UIPrintPageRenderer
打印具有透明背景的 html 内容,使上下文中已经呈现的背景不被 html 的白色背景覆盖?
这不能保证,但正如 Yvonne 提到的,您的 PDF 渲染器可能不支持 transparent
作为颜色值。
可能的解决方案 A
尝试创建一个只有一个 100% 透明像素的 1px x 1px PNG 图像,然后将其设置为元素上的重复背景图像。
可能的解决方案 B
当此库呈现时,HTML 元素本身可能是白色的。您可以将 CSS 应用到 html
标签,就像对 body
一样。
可能的解决方案 C
如果我对您的情况的理解正确,您是在尝试将 UIWebView 内呈现的 PDF 叠加在其他应用内内容之上。我不能说 PDF 是否真的可以支持透明度。 UIWebView 可能需要自己的属性(更不用说可能有一个默认背景为白色的 PDF 查看器在播放)。如果您可以控制 UIWebView 的样式,请看一下:How to make a transparent UIWebView
可能的解决方案 D
也许使用 Canvas(HTML 或 Switft)渲染图像而不是 PDF 会更好。如果这适用于您的用例,从长远来看,这可能是一个更好的选择。
通过切换到另一个 UIPrintFormatter
解决了问题。从 UIMarkupTextPrintFormatter
切换到 UIViewPrintFormatter
以表彰透明度。