服务器测评网
我们一直在努力

Java转PDF时,HTML样式乱怎么办?在线工具还是代码库?

在Java开发中,将HTML转换为PDF是一项常见需求,例如生成报表、电子书或文档导出功能,实现这一功能需要结合Java后端技术与HTML渲染引擎,以下是几种主流方案及其实现步骤,帮助开发者根据项目需求选择合适的方法。

Java转PDF时,HTML样式乱怎么办?在线工具还是代码库?

使用iText库实现HTML转PDF

iText是Java领域广泛使用的PDF处理库,其iText 7版本提供了HtmlConverter工具类,支持将HTML字符串或文件直接转换为PDF,这种方法适合简单HTML场景,但对复杂CSS和JavaScript支持有限。

实现步骤:

  1. 添加依赖:在Maven项目的pom.xml中引入iText核心依赖:

    <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.3</version>  
    </dependency>  
  2. 编写转换代码

    import com.itextpdf.html2pdf.HtmlConverter;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.IOException;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.nio.file.Files;  
    import java.nio.file.Paths;  
    public class HtmlToPdfConverter {  
        public static void main(String[] args) {  
            String htmlPath = "input.html";  
            String pdfPath = "output.pdf";  
            try (InputStream htmlStream = new FileInputStream(htmlPath);  
                 OutputStream pdfStream = Files.newOutputStream(Paths.get(pdfPath))) {  
                HtmlConverter.convertToPdf(htmlStream, pdfStream);  
                System.out.println("PDF生成成功:" + pdfPath);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  

注意事项:

  • iText默认不支持外部CSS文件和JavaScript,需将样式内联到HTML中。
  • 对于中文字体,需额外注册字体资源,避免乱码问题:
    FontProvider fontProvider = new DefaultFontProvider(true, false, false);  
    fontProvider.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);  
    HtmlConverter.convertToPdf(htmlStream, pdfStream, new ConverterProperties().setFontProvider(fontProvider));  

使用Flying Saucer(xhtmlrenderer)实现复杂HTML转PDF

Flying Saucer是一个基于Java的XHTML渲染引擎,支持CSS 2.1和部分CSS 3样式,适合需要精确还原页面布局的场景(如打印样式)。

实现步骤:

  1. 添加依赖

    Java转PDF时,HTML样式乱怎么办?在线工具还是代码库?

    <dependency>  
        <groupId>org.xhtmlrenderer</groupId>  
        <artifactId>flying-saucer-pdf</artifactId>  
        <version>9.1.22</version>  
    </dependency>  
  2. 编写转换代码

    import org.xhtmlrenderer.pdf.ITextRenderer;  
    import java.io.File;  
    import java.io.FileOutputStream;  
    import java.io.OutputStream;  
    public class FlyingSaucerConverter {  
        public static void main(String[] args) {  
            String htmlPath = "input.html";  
            String pdfPath = "output.pdf";  
            try (OutputStream os = new FileOutputStream(pdfPath)) {  
                ITextRenderer renderer = new ITextRenderer();  
                renderer.setDocument(new File(htmlPath));  
                renderer.layout();  
                renderer.createPDF(os);  
                System.out.println("PDF生成成功:" + pdfPath);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  

优化建议:

  • 支持外部CSS和图片:需设置资源加载路径:
    renderer.getSharedContext().setBaseURL("file:/path/to/resources/");  
  • 中文字体配置:通过ITextFontResolver注册字体:
    ITextFontResolver fontResolver = renderer.getFontResolver();  
    fontResolver.addFont("simhei.ttf", "UTF-8", true);  

集成Headless浏览器(如PhantomJS或Selenium)

对于需要执行JavaScript或渲染动态HTML的场景(如单页应用),可通过无头浏览器将HTML渲染为图片,再转换为PDF。

实现步骤(以Selenium + Chrome为例):

  1. 添加依赖

    <dependency>  
        <groupId>org.seleniumhq.selenium</groupId>  
        <artifactId>selenium-java</artifactId>  
        <version>4.1.0</version>  
    </dependency>  
  2. 编写转换代码

    import org.openqa.selenium.WebDriver;  
    import org.openqa.selenium.chrome.ChromeDriver;  
    import org.openqa.selenium.chrome.ChromeOptions;  
    import java.io.File;  
    import java.io.IOException;  
    import org.apache.pdfbox.pdmodel.PDDocument;  
    import org.apache.pdfbox.pdmodel.PDPage;  
    import org.apache.pdfbox.pdmodel.PDImageXObject;  
    public class SeleniumToPdf {  
        public static void main(String[] args) {  
            System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");  
            ChromeOptions options = new ChromeOptions();  
            options.addArguments("--headless"); // 无头模式  
            WebDriver driver = new ChromeDriver(options);  
            try {  
                driver.get("http://example.com");  
                File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);  
                // 将截图转换为PDF(需结合PDFBox等库)  
                PDDocument document = new PDDocument();  
                PDPage page = new PDPage();  
                document.addPage(page);  
                PDImageXObject image = PDImageXObject.createFromFile(screenshot.getPath(), document);  
                document.save("output.pdf");  
                document.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                driver.quit();  
            }  
        }  
    }  

局限性:

  • 需安装浏览器驱动(如ChromeDriver),且版本需匹配。
  • 转换效率较低,适合处理动态内容较少的场景。

商业解决方案对比

对于企业级应用,商业工具如Aspose.Words、Adobe PDF Library等提供更强大的HTML转PDF功能,支持复杂布局、表单、数字签名等特性,但需付费授权。

Java转PDF时,HTML样式乱怎么办?在线工具还是代码库?

选择HTML转PDF方案时,需综合考虑HTML复杂度、CSS支持需求、动态内容处理能力及成本:

  • 简单HTML:iText轻量级,适合基础转换;
  • 复杂CSS/布局:Flying Saucer支持更完善的样式;
  • 动态HTML:无头浏览器可处理JavaScript,但性能较低;
  • 企业级需求:商业工具提供稳定性和高级功能。

无论哪种方案,都需注意字体乱码、资源路径、样式兼容性等细节问题,通过测试确保输出PDF的准确性。

赞(0)
未经允许不得转载:好主机测评网 » Java转PDF时,HTML样式乱怎么办?在线工具还是代码库?