Создание UIMARKUPTEXTPRINTFORMATTER PDF с пользовательским фоном и прозрачным HTML-контентом

я использую 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()

моя проблема в том, что содержимое html, которое отображается поверх " фона.png " не является прозрачным, но имеет белый фон. Прозрачный атрибут в стиле html, похоже, игнорируется UIPrintPageRenderer. Установка background-color в стиле html, например blue изменение отрисованный цвет фона html от белого до синего. Я также попытался сделать визуализированный html прозрачным, сделав контекст прозрачным с помощью context.clear(printableRect) безрезультатно.

как я могу сделать UIPrintPageRenderer печать содержимого html с прозрачным фоном, чтобы уже отображаемый фон в контексте не покрывался белым фоном html?

2 ответов


это не гарантия, но, как упоминала Ивонна, возможно, что ваш PDF-рендерер просто не поддерживает transparent как цветовое значение.

Возможное Решение A

попробуйте создать 1px на 1px PNG-изображение с одним 100% прозрачным пикселем, затем установите его в качестве повторяющегося фонового изображения на вашем элементе.

Возможное Решение B

возможно, что сам элемент HTML Белый, когда эта библиотека отображает его. Вы можете применить CSS к html тег так же, как вы сделали с body.

Возможное Решение C

Если я правильно понимаю ваш случай, вы пытаетесь наложить визуализированный PDF, который находится внутри UIWebView поверх другого содержимого в приложении. Я не могу говорить о том, действительно ли PDF может поддерживать прозрачность. UIWebView может иметь свои собственные свойства (не говоря уже о том, что может быть просмотрщик PDF с фоном по умолчанию белого цвета в игре). Если у вас есть контроль над стилями UIWebView, возьмите посмотрите на это: как сделать прозрачный UIWebView

Возможное Решение D

возможно, было бы лучше использовать холст (HTML или Switft) для рендеринга изображения вместо PDF. Если это работает для вашего случая, это может быть гораздо лучшим вариантом в долгосрочной перспективе.


решил проблему, переключившись на другой UIPrintFormatter. Переключено с UIMarkupTextPrintFormatter to UIViewPrintFormatter который почтил прозрачность.