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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

Как переключиться с UIMarkupTextPrintFormatter на UIViewPrintFormatter? У меня есть UIMarkupTextPrintFormatter(markupText: HTMLContent) сейчас. Но UIViewPrintFormatter() не имеет markupText в качестве параметра. И если я получу UIViewPrintFormatter из UIWebView, результат будет таким же.