You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用iText转换HTML字符串为PDF样式未按预期生效,求解决方案

非付费实现HTML转完整样式PDF的解决方案

你当前使用的默认iText转换方法未配置资源加载、字体、页面适配参数,加上依赖版本较低对现代CSS支持不足,是样式未达预期的核心原因,可通过以下两种免费方案解决:

方案1:优化现有iText配置(无需替换依赖)

首先升级依赖到免费稳定版,提升CSS支持能力:

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext7-core</artifactId>
        <version>7.2.5</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>html2pdf</artifactId>
        <version>4.0.5</version>
    </dependency>
</dependencies>

使用带自定义配置的转换代码:

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class HtmlToPdf {
    public static void main(String[] args) throws Exception {
        // 配置PDF页面尺寸,可根据目标网页尺寸调整
        PdfWriter pdfWriter = new PdfWriter(new FileOutputStream("index-to-pdf.pdf"));
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        pdfDocument.setDefaultPageSize(PageSize.A4);
        
        // 配置转换参数
        ConverterProperties properties = new ConverterProperties();
        // 设置资源根路径,HTML内的相对路径CSS、图片都会从该路径加载
        properties.setBaseUri("HTML文件所在目录的绝对路径");
        // 配置字体,支持中文和网页自定义字体
        FontProvider fontProvider = new FontProvider();
        fontProvider.addFont("本地字体文件路径/simsun.ttc");
        properties.setFontProvider(fontProvider);
        
        // 执行转换
        HtmlConverter.convertToPdf(new FileInputStream("index.html"), pdfDocument, properties);
    }
}

注意事项:

  • 尽量将所有CSS内联到HTML的<style>标签中,避免外部资源加载失败
  • 若页面使用flex布局,必须使用3.0以上版本的html2pdf依赖

方案2:替换为OpenHTML2PDF(复杂CSS适配更优)

如果iText仍无法匹配目标样式,可使用完全开源免费的OpenHTML2PDF,它对CSS3、flex等特性的支持优于旧版iText。
引入依赖:

<dependencies>
    <dependency>
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-core</artifactId>
        <version>1.0.10</version>
    </dependency>
    <dependency>
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-pdfbox</artifactId>
        <version>1.0.10</version>
    </dependency>
    <dependency>
        <groupId>com.openhtmltopdf</groupId>
        <artifactId>openhtmltopdf-svg-support</artifactId>
        <version>1.0.10</version>
    </dependency>
</dependencies>

转换代码示例:

import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class OpenHtmlToPdf {
    public static void main(String[] args) throws Exception {
        try (FileOutputStream os = new FileOutputStream("index-to-pdf.pdf");
             InputStreamReader isr = new InputStreamReader(new FileInputStream("index.html"), StandardCharsets.UTF_8)) {
            PdfRendererBuilder builder = new PdfRendererBuilder();
            // 设置A4页面尺寸,单位为毫米
            builder.useDefaultPageSize(210, 297, PdfRendererBuilder.PageSizeUnits.MM);
            // 导入自定义字体,支持中文和网页指定字体
            builder.useFont(new File("本地字体文件路径/simsun.ttc"), "SimSun");
            // 加载HTML内容和资源根路径
            builder.withHtmlContent(isr.readText(), "HTML文件所在目录的绝对路径");
            builder.toStream(os);
            builder.run();
        }
    }
}

通用注意事项:

  • 转换前先在本地浏览器打开HTML文件,确认样式符合预期后再执行转换
  • 所有图片、字体等资源尽量使用本地绝对路径或者内联到HTML中,避免加载失败

内容的提问来源于stack exchange,提问作者Haider Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 23:45:05