java ftl导出pdf_java根据模板导出PDF详细教程

本文档详细介绍了如何在Java中结合iText、FreeMarker和JFreeChart,根据模板动态生成PDF文档,包括配置字体、页眉页脚、图表,并解决了编码和分页问题。提供关键代码示例和遇到的坑的解决方案。
摘要由CSDN通过智能技术生成

原文:https://blog.csdn.net/pengyufight/article/details/75305128

题记:由于业务的需要,需要根据模板定制pdf文档,经测试根据模板导出word成功了;但是导出pdf相对麻烦了一点。两天的研究测试java导出PDF,终于成功了,期间走了不少弯路,今分享出来,欢迎大家有问题在此交流,与君共勉!

一、需求

根据业务需要,需要在服务器端生成可动态配置的PDF文档,方便数据可视化查看。

此文的测试是在客户端通过java程序的测试,直接运行java类获得成功!

二、解决方案

iText+FreeMarker+JFreeChart生成可动态配置的PDF文档。

iText有很强大的PDF处理能力,但是样式和排版不好控制,直接写PDF文档,数据的动态渲染很麻烦。

FreeMarker能配置动态的html模板,正好解决了样式、动态渲染和排版问题。

JFreeChart有这方便的画图API,能画出简单的折线、柱状和饼图,基本能满足需要。

三、实现功能

1、能动态配置PDF文档内容

2、能动态配置中文字体显示

3、设置自定义的页眉页脚信息

4、能动态生成业务图片

5、完成PDF的分页和图片的嵌入

四、主要代码结构说明:

1、component包:PDF生成的组件 对外提供的是PDFKit工具类和HeaderFooterBuilder接口,其中PDFKit负责PDF的生成,HeaderFooterBuilder负责自定义页眉页脚信息。

2、builder包:负责PDF模板之外的额外信息填写,这里主要是页眉页脚的定制。

3、chart包:JFreeChart的画图工具包,目前只有一个线形图。

4、test包:测试工具类

5、util包:FreeMarker等工具类。

d4235a114f91e279e9986306f59663bf.png

项目采用maven架构,开发工具为MyEclipse10,环境为jdk1.7

五、关键代码说明

1、模板配置

body {

font-family: pingfang sc light;

}

.center{

text-align: center;

width: 100%;

}

${templateName}

iText官网:${ITEXTUrl}

FreeMarker官网:${freeMarkerUrl}

JFreeChart教程:${JFreeChartUrl}

静态logo图

美团点评

气温变化对比图

我的图片

第二页开始了
列表值:

${item}

根据提供的引用内容,可以使用Java实现根据模板生成并导出PDF的功能。具体步骤如下: 1.使用JavaPDF库,例如iText或Apache PDFBox,读取PDF模板文件。 2.使用模板文件中的参数,填充PDF表单字段或者在PDF页面上添加文本、图片等内容。 3.将填充后的PDF文件导出到指定的路径。 下面是一个使用iText库实现根据模板导出PDF的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.FileOutputStream; import java.util.Map; public class PdfGenerator { public static void generatePdf(String templatePath, String outputPath, Map<String, String> params) throws Exception { // 读取PDF模板文件 PdfReader reader = new PdfReader(templatePath); // 创建输出流 FileOutputStream fos = new FileOutputStream(outputPath); // 创建PDF文档对象 Document document = new Document(); // 创建PDF写入器 PdfCopy copy = new PdfCopy(document, fos); // 打开文档 document.open(); // 填充PDF表单字段 PdfStamper stamper = new PdfStamper(reader, fos); for (Map.Entry<String, String> entry : params.entrySet()) { stamper.getAcroFields().setField(entry.getKey(), entry.getValue()); } stamper.setFormFlattening(true); stamper.close(); // 将填充后的PDF文件导出到指定的路径 for (int i = 1; i <= reader.getNumberOfPages(); i++) { PdfImportedPage page = copy.getImportedPage(new PdfReader(reader), i); copy.addPage(page); } document.close(); reader.close(); fos.close(); } } ``` 其中,`templatePath`为PDF模板文件的路径,`outputPath`为导出PDF文件的路径,`params`为填充PDF表单字段的参数。可以根据实际需求修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值