还在为HTML转PDF发愁?再介绍两款工具,为你保驾护航!

2025-12-12 0 640

01 引言

在之前专门写了一篇文章《SpringBoot集成:5分钟实现HTMLPDF功能》,介绍三款HtmlPDF工具。这不,又发现了两款类似的工具,整理一下分享给大家。

02 itextpdfhtmljava

2.1 简介

iText pdfHTMLiText7套件的一个附加组件,专门用于将HTMLCSS内容转换PDF文档。它基于iText核心PDF生成引擎,提供了高质量的HTMLPDF转换功能。性能表现非常优异。

主要特性:

  • 完整的HTML5CSS3支持:能够处理现代网页布局和样式
  • 字体嵌入:自动处理Web字体和系统字体
  • 响应式设计:支持媒体查询和响应式布局
  • 高保真转换:保持HTML内容的视觉保真度
  • Java原生:专为Java生态系统设计

GitHub地址:github.com/itext/itext…

官方地址:itextpdf.com/products/co…

2.2 案例

使用起来也非常简单,下面官方的案例:

Maven依赖

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>html2pdf</artifactId>
    <version>6.2.1</version>
</dependency>

实践代码

@RequestMapping(\"index6\")
public void index6(Model model, HttpServletResponse response) throws IOException {
    List<Map> list = new ArrayList();
    for (int i = 0; i < 3; i++) {
        Map item = new HashMap();
        item.put(\"image1\", \"http://example.com/2eb97.jpg\");
        item.put(\"image2\", \"http://example.com/2f9c3.jpg\");
        item.put(\"vehicleName\", \"路虎Defender[卫士](进口)2023款Defender130 48V[卫士 130 48V] 3.0T手自-体P400 HSE\");
        item.put(\"brandName\", \"路虎\");
        item.put(\"seriesName\", \"Defender[卫士]\");
        item.put(\"modelYear\", \"2023款\");
        item.put(\"licenseYear\", SDF.format(new Date()));
        item.put(\"displayMileage\", DF.format(new BigDecimal(\"9657\")));
        item.put(\"dealDate\", SDF.format(new Date()));
        item.put(\"dealPrice\", DF.format(new BigDecimal(\"702400\")));

        item.put(\"licenseCode\", \"沪A952714\");

        list.add(item);
    }
    model.addAttribute(\"list\", list);
    Map map = new HashMap();
    map.put(\"list\", list);

    Context context = new Context(Locale.getDefault(), map);
    String htmlContent = templateEngine.process(\"index\", context);
    System.out.println(htmlContent);

    // ---------------------------------------------------
    /*itext-html2pdf*/
    ConverterProperties properties = new ConverterProperties();

    FontProvider fontProvider = new FontProvider();
    fontProvider.addSystemFonts();
//        fontProvider.addFont(\"C:\\Windows\\Fonts\\simhei.ttf\");
    // 添加系统字体
    properties.setFontProvider(fontProvider);

    HtmlConverter.convertToPdf(htmlContent, response.getOutputStream(), properties);
}

同样默认是不支持中文的,需要通过FontProvider添加指定的字体。fontProvider.addSystemFonts();直接添加系统字体,也可以通过addFont()添加自定义字体。页面必须声明字体,否则会出现乱码。

03 x-easypdf

3.1 简介

x-easypdf是一个java语言简化处理pdf的框架,包含fop模块与pdfbox模块,fop模块以创建功能为主,基于xsl-fo模板生成pdf文档,以数据源的方式进行模板渲染;pdfbox模块以编辑功能为主,对标准的pdfbox进行扩展,添加了成吨的功能。

HtmlPdfpdfbox模块下的一个转化器的功能,是基于 playwright 实现的。而playwright的依赖需要手动引入。Playwright是一个跨语言的浏览器自动化库,由Microsoft开发。虽然主要用于端到端测试,但其强大的PDF生成功能也使其成为HTMLPDF的优秀工具。

Gitee地址:gitee.com/dromara/x-e…

官网地址:x-easypdf.cn/

3.2 案例

x-easypdf是对playwrigh的功能做了一层包装,使用起来更方便。

Maven依赖

<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>x-easypdf</artifactId>
    <version>3.4.7</version>
</dependency>
<dependency>
    <groupId>com.microsoft.playwright</groupId>
    <artifactId>playwright</artifactId>
    <version>1.53.0</version>
</dependency>

实践代码01

@RequestMapping(\"index10\")
public void index10(HttpServletResponse response) throws IOException {
    // 获取html转换器
    HtmlConvertor convertor = PdfHandler.getDocumentConvertor().getHtmlConvertor();
    Document pdf = convertor.toPdf(\"http://127.0.0.1:8080/page/index\");
    pdf.save(response.getOutputStream());
}

注意事项

playwrigh是基于浏览器引擎的,首次调用会下载默认的浏览器,下载完成之后,后续的使用就流畅了。而且默认支持中文,因为使用浏览器引擎,所以对于HtmlCss支持较好。但是消耗资源较高。

但是这里convertor.toPdf()目前支持传入地址和文件。不支持直接html内容直接转化的。但是playwrigh本身是支持的。

小编已经给x-easypdf作者提了issues:gitee.com/dromara/x-e…

**注意:**截止发稿,官方已经在3.5.0版本支持了html内容转Pdf

实战代码02

使用模板引擎的方式:

官网地址:x-easypdf.cn/guide/pdfbo…

依然是建立在playwrigh基础之上。

@RequestMapping(\"index12\")
public void index12(HttpServletResponse response) throws IOException {
    List<Map> list = new ArrayList();
    for (int i = 0; i < 3; i++) {
        Map item = new HashMap();
        item.put(\"image1\", \"http://example.com/2eb97.jpg\");
        item.put(\"image2\", \"http://example.com/2f9c3.jpg\");
        item.put(\"vehicleName\", \"路虎Defender[卫士](进口)2023款Defender130 48V[卫士 130 48V] 3.0T手自-体P400 HSE\");
        item.put(\"brandName\", \"路虎\");
        item.put(\"seriesName\", \"Defender[卫士]\");
        item.put(\"modelYear\", \"2023款\");
        item.put(\"licenseYear\", SDF.format(new Date()));
        item.put(\"displayMileage\", DF.format(new BigDecimal(\"9657\")));
        item.put(\"dealDate\", SDF.format(new Date()));
        item.put(\"dealPrice\", DF.format(new BigDecimal(\"702400\")));

        item.put(\"licenseCode\", \"沪A952714\");

        list.add(item);
    }
    Map map = new HashMap();
    map.put(\"list\", list);

    ThymeleafTemplater templater = PdfHandler.getDocumentTemplater().getThymeleafTemplater();
    templater.setTemplatePath(\"templates\");
    templater.setTemplateName(\"index.html\");
    templater.setTemplateData(map);

    // 获取 html 内容
    String content = templater.getHtmlContent();
    System.out.println(content);

    // 转换文档
    Document document = templater.transform();
    document.save(response.getOutputStream());
}

这里需要说明的是:由于x-easypdf自行解析了Thymeleaf模版,所以无法使用spring-boot-starter-thymeleaf的配置。templatePathtemplateName都需要写完整。templatePathclasspath下的路径。

模板引擎可能会出现nested exception is java.lang.NoClassDefFoundError: ognl/PropertyAccessor的错误,需要引入ognl,且版本不能超过3.2。从 3.2 开始,会报java.lang.NoClassDefFoundError: ognl/DefaultMemberAccess。有效版本:

<dependency>
	<groupId>ognl</groupId>
	<artifactId>ognl</artifactId>
	<version>3.1.28</version>
</dependency>

边距可以通过打印样式控制:

@page {
    size: A4;
    margin: 20px;
}

3.3 playwrigh原生写法

@RequestMapping(\"index11\")
public void index11(HttpServletResponse response) throws IOException {
    try (Playwright playwright = Playwright.create();
         Browser browser = playwright.chromium().launch()) {
        BrowserContext context = browser.newContext();
        Page page = context.newPage();

        // 从HTML内容生成PDF
        page.setContent(\"

Hello, Playwright!

\"
); byte[] pdf = page.pdf(); ByteArrayInputStream bais = new ByteArrayInputStream(pdf); IOUtils.copy(bais, response.getOutputStream()); } }

04 小结

iText pdfHTML内存占用低,转换速度快,适合服务器端批量处理。而Playwright需要更多资源,但渲染质量极高,适合对视觉保真度要求高的场景,所以x-easypdf也是一样的。如果只是针对HtmlPdf的服务端转化的场景iText pdfHTML的优势更明显一下,关键它快!

也有粉丝朋友留言说jasperreports也很好用,小编也试了一下。jasperreports需要加载特定的模板,也许是因为不是很熟悉,用起来感觉有点别扭。这里就不推荐了,有兴趣的可以去试试!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 还在为HTML转PDF发愁?再介绍两款工具,为你保驾护航! https://www.zuozi.net/35972.html

常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务