使用freemarker、Itext进行Html转Pdf(解决中文问题&图片问题)

HTML 模板+freemarker渲染 生成PDF(一) 最近项目中要把相关数据导出为PDF文件,总结下自己写这个功能遇到的种种问题 先给出个大概的框架 package com.xsm; import java.util.HashMap; import java.util.Map; import org.junit.Test; import com.sectechio.fintech.common.utils.PDFUtil; public c... 阅读详情

步骤一:写ftl格式的html
demo.ftl

<!DOCTYPE html>
<html lang="en">
​
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
    <title>正式收据</title>
    <style>
        @page {
            size: 297mm 120mm;
        }
        
        * {
            padding: 0;
            margin: 0;
        }
​
        ul,
        li {
            list-style: none;
        }
​
        body {
            font-family: "FangSong", "STFangsong", "SimSun", "SimHei", "Helvetica", "Arial", "sans-serif";
            font-size: 16px;
            color: black;
            background-color: transparent;
            -webkit-font-smoothing: antialiased;
            line-height: 1.42857143;
        }
​
​
        .receipt_box {
            background: #FFFFFF;
            border: 1px solid rgba(0, 0, 0, 0.13);
            border-radius: 4px;
            margin: 20px;
            overflow: hidden;
        }
​
        .header {
            width: 100%;
            position: relative;
            height: 100px;
            overflow: hidden;
        }
​
        .logo {
            position: absolute;
            top: 14px;
            left: 5px;
            height: 39px;
            width: 39px;
​
        }
​
​
        .date_box {
            position: absolute;
            top: 16px;
            right: 0;
            font-size: 12px;
            color: #3D424D;
            letter-spacing: 0;
            line-height: 17px
        }
​
        .title_box {
            padding: 0 0;
            text-align: center;
        }
​
        .title_box .title {
            font-size: 24px;
            font-weight: bold;
            color: #3D424D;
            line-height: 32px;
            margin: 9px 0 0 0;
        }
    </style>
</head>
​
<body>
<div class="receipt_box">
    <div class="header">
        <div class="title_box">
            <p class="title">正式收据</p>
            <span>OFFICIAL RECEIPT</span>
        </div>
        <img class="logo"
             src="https://xxx.com"
             alt=""/>
        <div class="date_box">
            <p style="word-break:break-all">No: ${receiptNo!}</p>
            <p>Date: ${payTimeStr!}</p>
        </div>
    </div>
</div>
</body>
​
</html>

步骤二:使用freemarker将参数写入html里
Pom.xml

//Main.class
Map<?, ?> dataMap = new BeanMap(receipt);
String dataHtml = FreemarkerUtils.loadFtlHtml("/templates", "demo.ftl", dataMap);
FreemarkerUtils.class
Java
public class FreemarkerUtils {
​
    private FreemarkerUtils() {
    }
​
    /**
     * 使用传入的Map对象,渲染指定的freemarker模板
     *
     * @param pathName 根目录
     * @param fileName 文件名
     * @param globalMap 数据绑定
     * @return html字符串
     */
    public static String loadFtlHtml(String pathName, String fileName, Map globalMap) {
        if (StringUtils.isEmpty(pathName) || StringUtils.isEmpty(fileName) || globalMap == null) {
            throw new IllegalArgumentException("使用数据渲染模板时文件路径异常");
        }
​
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
​
        try (StringWriter stringWriter = new StringWriter()) {
            cfg.setClassForTemplateLoading(FreemarkerUtils.class, pathName);
            cfg.setDefaultEncoding("UTF-8");
            cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
            cfg.setClassicCompatible(true);
​
            Template temp = cfg.getTemplate(fileName);
            temp.process(globalMap, stringWriter);
​
            return stringWriter.toString();
        } catch (IOException | TemplateException e) {
            log.error("使用数据渲染模板时异常", e);
            throw new BaobabRuntimeException("使用数据渲染模板异常", e);
        }
    }
}

步骤三:使用Itext将html转成pdf
代码块

//Main.class

try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            PdfFileUtils.html2pdf(byteArrayOutputStream, dataHtml);
            return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
            throw new BaobabRuntimeException("生成pdf文件失败" + e);
}
//Html的String转Pdf工具类
public class PdfFileUtils {
    /**
     * 将HTML转成PD格式的文件。html文件的格式比较严格 图片问题,图片实际上需要用url链接而非本地,本地可能存在解析不了的问题。
     * 
     * @param out
     * @throws Exception
     */
    public static void html2pdf(OutputStream out, String html) {
        ITextRenderer renderer = new ITextRenderer();
        try {
            // 解决中文支持
            ITextFontResolver fontResolver = renderer.getFontResolver();
            fontResolver.addFont("/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            fontResolver.addFont("/font/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
​
            renderer.setDocumentFromString(html);
​
            renderer.layout();
            renderer.createPDF(out);
            log.info("create pdf done!!");
        } catch (Exception e) {
            throw new BaobabRuntimeException("生成 pdf 文件异常", e);
        }
    }
}

中文问题:
如果导出pdf需要中文,则需要使用ITextFontResolver将中文字体导入进去,如代码中的 fontResolver.addFont("/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

并且在html中设置字体: 而必须是SimSun 而不是sinsum

其他字体如fangsong之类的似乎导入失败了,不知道为什么识别不了

图片问题:
建议直接在html中引入http链接形式的图片,如: src=“https://s3plus.sankuai.com/v1/xxx”

尝试过本地图片的方式,当时需要设置其目录才可以正确识别,而不同系统的目录不一样,在本地运行可以成功但放到linux里却识别不了,比较麻烦,故不推荐

本地图片需要设置图片路径:
Java
renderer.getSharedContext().setBaseURL(“file:” + System.getProperty(“user.dir”) + “/xxx/src/main/resources/templates/”);

HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF)) Java iText+FreeMarker生成PDF(HTML转PDF) 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户。 本文源码:http://git.oschina.net/lujianing/java_pdf_demo 2.iText iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iTe 阅读详情

相关推荐

Freemarker+IText生成pdf文件

最近项目中遇到要用html生成pdf文件的需求,一开始研究了下前端插件jspdf,使用h5 canvas绘图生成图片,再把图片生成pdf文件,遇到了各种各样的问题,生成的pdf文件达到20多M,height超过5000浏览器就崩溃,有兴趣的童鞋可以尝试一下,该方案LZ最终放弃了。        接着开始尝试服务端生成,使用freemaker模板生成静态html文件,通过iext生成pdf,网上很

piptae99的博客 5345

根据html改为ftl模板生成pdf文件,支持中文及换行

这里demo用的maven来管理项目,pom.xml如下:&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://m...

海纳百川的博客 9577

PDF生成方案之iText

PDF生成方案之iText 前言 有一段时间没有更新了,最近有点懒了,在此立下flag,督促自己能够常更新吧,话不多说,进入主题,今天介绍的是电子凭证(pdf)生成的解决方案,会从几个常用的工具来介绍,也会对比一下几者之间的性能。 iText是什么? 在官网中 http://itextpdf.com/描述: iText, the world’s preferred P

划不出的界限 2177

html怎么转换成ftl模板,FreeMarker入门+模板静态化+模板字符串静态化

只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)数据模型:数据模型在java中可以是基本类型也可以List、Map、Pojo等复杂类型模板输出FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序虽然FreeMarker具有一...

weixin_39597323的博客 2223

使用IText 将html 转 PDF问题

代码网上抄的,因为涉及项目情况,目前不能把代码都放出来。后续我开发完成后,简化一下,把遇到的问题融进去了之后再放代码。

m0_37641682的博客 2269

如何解决java html转pdf图片不显示问题的源码范例(由浅入深代码范例和详细说明).docx

如何解决java html转pdf图片不显示问题的源码范例(由浅入深代码范例和详细说明)

iText 7 html2pdf 使用总结

iText7 html2pdf 使用总结

gahd3000的博客 1万+

html转pdf、图片(linux版本)

java实现html转换为pdf或者图片

iText使用html生成pdf

iText是java的一个类库,可以直接生成pdf文档,或者通过html模板生成pdf文档。使用html生成文档的方式比较方便前端同事开发页面(后端开发大部分审美确实是呵呵……),所以一般选用此种方式。 先列出此种方式容易遇到的几个问题: html标签需要严格闭合,不然会报错。如&lt;/p&gt;,&lt;br&gt;&lt;/br&gt;,&lt;img&gt;&lt;/img&gt;等。注...

qq_18303491的博客 1632

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 449

计算机组成原理汉字编码与校验设计实验报告(汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码)

这次实验利用logisim进行设计,进行了以下这四个实验,其中分为汉字国标码转区位码实验、汉字机内码获取实验、海明编码电路设计与海明解码,实验报告分为四个部分,在这四个部分中依次对四个实验的方案设计,设计思路进行了介绍

zhang2gongzi的博客 6万+

使用IText5+Freemarker生成PDF(模板可以使用CCS3分页效果)

iText介绍   iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。iText5是目前比较主流使用的因为免费,iText7是更好但收费的,所以这里我们还是乖乖使用5吧!! 项目要使用iText,必须引入jar包。才能使用,maven依赖如下: ...

程序猿开发日志【学习永无止境】 6941

【CV论文精读】【协同感知综述】Collaborative Perception for Autonomous Driving :Current Status and Future Trend

感知是自动驾驶系统的关键模块之一,近年来取得了很大进展。然而,单个车辆的有限能力导致感知性能提高的瓶颈。为了突破个体感知的局限,协作感知被提出,它使车辆能够共享信息来感知视线和视野之外的环境。本文综述了有前途的协作感知技术的相关工作,包括介绍了基本概念,概括了协作模式,总结了协作感知的关键要素和应用。最后,我们讨论了这一研究领域面临的挑战和问题,并给出了一些潜在的进一步方向。

weixin_44184852的博客 4691

Java实现HTML页面转PDF(iText+FreeMarker)

Java实现HTML页面转PDF(iText+FreeMarker) 由于需求需要,但是又不会操作,从网上找了一大堆,都发现有点坑,可能我这份也有点坑,但是希望能给你一个思路。 一开始找的是word模板----&amp;gt;word----&amp;gt;pdf,走完流程步,发现最后下载的是pdf版的xml文件 找了很多方法,发现都没什么解决方式 OpenOffice 是无效的,其他的没测试 如果本来是word...

qq_25555763的博客 1929

大模型训练显存瘦身全记录:从ZeRO-3参数分区到CPU Offload的硬件协奏曲

本文详细解析了如何通过ZeRO-3参数分区与CPU/NVMe卸载技术优化大模型训练的显存使用。结合bf16混合精度与梯度累积等策略,实现在消费级GPU上高效训练百亿参数模型,显著提升硬件利用率与训练效率。

weixin_29051245的博客 435

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3089

Freemarker+iText7用Java生成pdf文档,pdf添加图片,html转pdf

要求生成如下格式的报告,一共有十种。因为本体是一个表格,所以大概的思路是用html画出这个表格,然后将html字符串转成pdf文件返回前端下载。技术方面选择用Freemarker画好html模板,然后后端把数值填好之后生成html字符串,最后把html字符串转成pdf文件返回前端下载。

wan9x1nzZZ的博客 987

避坑指南:DDR4内存条Margin测试Fail?从Intel RMT工具到PCB Layout的完整排错思路

本文深入探讨了DDR4内存条在Margin测试中Fail的完整排错思路,从Intel RMT工具分析到PCB Layout优化。通过实战案例,详细解析了信号完整性问题的诊断与解决方案,包括拓扑结构影响、传输线参数优化及HyperLynx仿真验证,为硬件设计工程师提供了宝贵的避坑指南。

weixin_42530458的博客 454

Java iText+FreeMarker生成PDF(HTML转PDF)

1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等。方便用户查看,下载,打印。目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户。 本文源码:http://git.oschina.net/lujianing/java_pdf_demo 2.iText iText是著名的开放源码的站点sourceforge一...

weixin_30721077的博客 238

在Android Jetpack Compose中实现夜间模式

Android基于Compose的深色主题实现

虎哥LoveDroid 1242

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

关于itext中转pdf的一些显示问题

itext将freemarker渲染的html转为pdf,其中它的一些html的属性不起作用。 比如当中的 &amp;nbsp;或&amp;emsp;不能被解析,可以用 &amp;#160;代替,也可以试试其他博主的方法: ---------------------------------------------------------------------------------分割线开始...

sethwiseman的博客 3204

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

含有图片的html生成pdf_SpringBoot 下PDF生成使用填坑总结

一、PDF生成由于直接使用IText生成PDF,数据填充较为繁琐,故:选用Freemarker和IText生成pdf,引入依赖:环境:jdk 1.8 + SpringBoot1.引入freemarker starter (版本跟随SpringBootparent即可)&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot...

weixin_34677764的博客 1196

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an &ldquo;advanced algorithms&rdquo; book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

使用Freemarker来生成pdf文件

使用Freemarker来生成pdf文件

Jackbillzsc的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片

项目中有个需求,需要将合同内容导出成pdf。上网查阅到了 iText , iText 是一个生成PDF文档的开源Java库,能够动态的从XML或者数据库生成PDF,同时还可以对文档进行加密,权限控制,并且还支持Java/C#等,但是iText本身提供的HTML解析器还是不够强大,许多HTML标签和属性无法识别,更悲催的是简单的CSS它不认识,排版调整样式让人头大。那么有没有什么方式能够支持css呢

词语大杂烩 1996

SpringBoot html转pdf 支持中文、图片水印+文字水印、页眉页脚 flying-saucer-pdf-itext5 + freemarker

使用flying-saucer-pdf-itext5加freemarker生成pdf,支持中文、图片水印+文字水印、页眉页脚。 引入jar包 &lt;!-- freemarker --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-freemarker&lt;/artifactId&gt; &lt;.

xxbai123456的博客 6057
上一篇: Mac Ideal快捷键
下一篇: Stream中toMap引发NullPointerException
HY_Chan
博客等级 码龄10年 54粉丝 60原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值