html - UIMarkupTextPrintFormatter 创建具有自定义背景和透明 HTML 内容的 PDF

标签 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()

我的问题是在“background.png”上呈现的 html 内容不是透明的,而是具有白色背景。 UIPrintPageRenderer 似乎忽略了 html 样式中的透明属性。将 html 样式中的 background-color 设置为例如blue 将呈现的 html 背景颜色从白色更改为蓝色。我还尝试通过使用 context.clear(printableRect) 使上下文透明来使呈现的 html 透明,但无济于事。

如何让 UIPrintPageRenderer 使用透明背景打印 html 内容,以便上下文中已经呈现的背景不会被 html 的白色背景覆盖?

最佳答案

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

可能的解决方案A

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

可能的解决方案B

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

可能的解决方案C

如果我对您的情况的理解正确,您是在尝试将 UIWebView 内呈现的 PDF 叠加在其他应用内内容之上。我不能说 PDF 是否真的可以支持透明度。 UIWebView 可能需要自己的属性(更不用说可能有一个默认背景为白色的 PDF 查看器在播放)。如果您可以控制 UIWebView 的样式,请看一下:How to make a transparent UIWebView

可能的解决方案D

也许使用 Canvas(HTML 或 Switft)来呈现图像而不是 PDF 会更好。如果这适用于您的用例,从长远来看,这可能是一个更好的选择。

关于html - UIMarkupTextPrintFormatter 创建具有自定义背景和透明 HTML 内容的 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46546755/

相关文章:

ios - 让 UIScrollView 放弃 UITouch

ios - 从 objective-c 调用 swift 代码时,第一次推送 View Controller 花费了太多时间

html - 使用 flexbox 的 anchor 控件

javascript - 如何让 <table> 保持固定高度? Bootstrap 4

javascript - 这两个 HTMLCollections 有什么区别?

html - 对齐 &lt;textarea&gt; 右上角的 <p> 标签?

html - 为什么我的文字没有居中对齐?

javascript - 当鼠标位于 Bootstrap 弹出框滚动条内时,我必须防止页面的其余部分滚动

javascript - 如何重新调整文本和 css 背景图像的大小,例如 <img> 在此示例中正在重新调整大小?

ios - 即使重写的 hittest 返回正确的值,注释也不响应命中