IText HTML в PDF меняет цвет фона

Я пытался преобразовать файл HTML в PDF, используя iText с Java. Однако в моем PDF-файле есть область другого цвета из-за свойства фона тега <body>. PDF-файл должен иметь полностью белый фон, такой же, как и класс <div class='container'>. Есть ли способ добиться этого вместо изменения фона <body> в теге <style> на белый?

Это мой HTML и CSS

<!DOCTYPE html>
<html lang = "en">

<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        @page {
            margin-left: 0;
            margin-right: 0;
            margin-top: 0;

            @bottom-left {
                margin-left: 10px;
                content: "Page " counter(page) " / " counter(pages);
            }
        }

        body {
            scroll-behavior: smooth;
            color: #000;
            font-weight: normal;
            background: #f0f0f0;
            background-color: rgb(244, 180, 103);
            width: 100%;
            line-height: 20pt;
            text-align: justify;
            margin: 0 auto;
            height: 100%;
        }

        @media print {
            body {
                background-color: #fff;
            }
        }

        .container {
            scroll-behavior: smooth;
            width: 210mm;
            padding: 25mm 25mm 25mm 35mm;
            background: #FFF;
            margin: 0 auto;
            box-sizing: border-box;
            position: relative;
            font-size: 14pt;
            height: 100%;
        }
    </style>
</head>

<body>
    <div class = "container">
        <h1>CONTAINER</h1>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
        <p>This is my data</p>
    </div>
</body>

</html>

Это мой Java-код

private static final String HTML_FILE_PATH = "C:/yourlocation/input.html";
private static final String PDF_FILE_PATH = "C:/yourlocation/output.pdf";

public static void main(String[] args) throws IOException {
    System.out.println("Hello World!");

    FontProvider fontProvider = new DefaultFontProvider(true, true, true);
    ConverterProperties properties = new ConverterProperties();
    properties.setCharset("UTF-8");
    properties.setFontProvider(fontProvider);

    File htmlFile = new File(HTML_FILE_PATH);
    File pdfFile = new File(PDF_FILE_PATH);
    try (FileInputStream fStream = new FileInputStream(htmlFile)) {
        System.out.println("BEGIN to convert HTML to PDF");
        HtmlConverter.convertToPdf(fStream, new FileOutputStream(pdfFile), properties);
        System.out.println("FINISHED convert HTML to PDF");

    } catch (IOException e) {
        e.printStackTrace();
    }
}

вы пробовали добавить @media print{ body {background: #fff;} }, чтобы сбросить этот цвет?

Justinas 26.06.2024 11:42

@Justinas Я скопировал и добавил его прямо под телом {} в теге стиля, но, похоже, он не работает.

Nguyen Tran Nhat Vu 26.06.2024 11:51

Покажите это в своем вопросе

Justinas 26.06.2024 11:52

@Justinas Я только что сделал, пожалуйста, взгляни

Nguyen Tran Nhat Vu 26.06.2024 12:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, поэтому я могу изменить цвет фона тега <body> с помощью iText, расширив BodyTagCssApplier, переопределив, скопировав весь метод apply и установив для него цвет фона (в cssProps ниже) на белый.

private static class CustomBodyTagCssApplier extends BodyTagCssApplier {
    @Override
    public void apply(ProcessorContext context, IStylesContainer stylesContainer, ITagWorker tagWorker) {
        Map<String, String> cssProps = stylesContainer.getStyles();
        // Set background-color to white
        cssProps.put(CommonCssConstants.BACKGROUND_COLOR, "#fff");
        BodyHtmlStylesContainer styleProperty = new BodyHtmlStylesContainer();
        IPropertyContainer container = tagWorker.getElementResult();
        if (container != null) {
            BackgroundApplierUtil.applyBackground(cssProps, context, styleProperty);
            MarginApplierUtil.applyMargins(cssProps, context, styleProperty);
            PaddingApplierUtil.applyPaddings(cssProps, context, styleProperty);
            BorderStyleApplierUtil.applyBorders(cssProps, context, styleProperty);
            if (styleProperty.hasStylesToApply()) {
                container.setProperty(Html2PdfProperty.BODY_STYLING, styleProperty);
            }
            FontStyleApplierUtil.applyFontStyles(cssProps, context, stylesContainer, container);
        }
    }
}

А затем используйте ConverterProperties, чтобы применить этот CSS к моему тегу <body>.

public static void main(String[] args) {
    // Some code in question above
    ConverterProperties properties = new ConverterProperties();
    properties.setCssApplierFactory(new DefaultCssApplierFactory() {
        @Override
        public ICssApplier getCustomCssApplier(IElementNode tag) {
            if ("body".equals(tag.name())) {
                return new CustomBodyTagCssApplier();
            }
            return null;
        }
    });
    // Some code in question above
    // HtmlConverter.convertToPdf(fStream, new FileOutputStream(pdfFile), properties);
}

Другие вопросы по теме