概述
背景
使用pdf模板 按需求导出pdf报告
技术调研
常见技术
常见的使用itext pdf和spire.pdf操作编辑pdf,使用pdfbox用来读取pdf
技术问题:
问题1 | itext | spire pdf | |
---|---|---|---|
20220530 | 文本替换 | 文本替换,使用遮罩层功能,但是若替换的问题过长,需要再模板上做留白处理,否则会使文本叠加显示 | 直接支持替换功能,但是仅会显示替换字符占位的坐标位置,超出部分直接不显示 |
表格替换 |
其他技术
1.借助模板技术:使用thymeleaf,freemarker或者word方式创建模板,然后将其生成pdf
2.使用pdfbox读取pdf模板,然后使用itext创建新的pdf文件
最终技术:word模板-word-》pdf
word模板:poi-tl:https://gitee.com/luffyuan/poi-tl
word处理技术:poi
word转pdf:xdocreport:fr.opensagres.poi.xwpf.converter.pdf
poi-tl介绍:
文档:Poi-tl Documentation
poi-tl技术调研对比
方案 | 移植性 | 功能性 | 易用性 |
---|---|---|---|
Poi-tl | Java跨平台 | Word模板引擎,基于Apache POI,提供更友好的API | 低代码,准备文档模板和数据即可 |
Apache POI | Java跨平台 | Apache项目,封装了常见的文档操作,也可以操作底层XML结构 | 文档不全,这里有一个教程:Apache POI Word快速入门 |
Freemarker | XML跨平台 | 仅支持文本,很大的局限性 | 不推荐,XML结构的代码几乎无法维护 |
OpenOffice | 部署OpenOffice,移植性较差 | - | 需要了解OpenOffice的API |
HTML浏览器导出 | 依赖浏览器的实现,移植性较差 | HTML不能很好的兼容Word的格式,样式糟糕 | - |
Jacob、winlib | Windows平台 | - | 复杂,完全不推荐使用 |
基本语法
所有的语法结构都是以 {{ 开始,以 }} 结束。
从一个超级简单的例子开始:把{{title}}替换成"Poi-tl 模板引擎"。
- 新建文档template.docx,包含文本{{title}}
- TDO模式:Template + data-model = output
//核心API采用了极简设计,只需要一行代码 XWPFTemplate template = XWPFTemplate.compile("~/template.docx").render(new HashMap<String, Object>(){{ put("title", "Poi-tl 模板引擎"); }}); FileOutputStream out = new FileOutputStream("out_template.docx"); template.write(out); out.flush(); out.close(); template.close();
文本模板 {{var}}
TextRenderData
或String
数据模型,继承模板样式的同时,也可以自定义颜色、字体等样式。
Map<String, Object> datas = new HashMap<String, Object>(); datas.put("author", new TextRenderData("00FF00", "Sayi卅一")); datas.put("introduce", "http://www.deepoove.com");
图片模板 {{@var}}
//本地图片 put("localPicture", new PictureRenderData(120, 120, "src/test/resources/sayi.png")); //本地图片byte数据 put("localBytePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getLocalByteArray(new File("src/test/resources/logo.png"))));
表格模板 {{#var}}
RowRenderData header = RowRenderData.build(new TextRenderData("FFFFFF", "姓名"), new TextRenderData("FFFFFF", "学历")); RowRenderData row = RowRenderData.build(new TextRenderData("张三"), new TextRenderData("1E915D", "研究生")); put("table", new MiniTableRenderData(header, Arrays.asList(row)));
列表模板 {{*var}}
put("feature", new NumbericRenderData(new ArrayList<TextRenderData>() { { add(new TextRenderData("Plug-in grammar, add new grammar by yourself")); add(new TextRenderData("Supports word text, header, footer...")); add(new TextRenderData("Templates, not just templates, but also style templates")); } }));
xdocreport介绍
fr.opensagres.poi.xwpf.converter.pdf
xdocreport是一个java api,它能够根据ms office(docx或者ppt)以及open office的odt创建的xml文档模板,与java模型一起配合生成你想要的docx或者odt文档报告。
2.同时你可以把生成的docx或者odt文档转换你想要的其它格式,例如pdf,xhtml等。
xdocreport根据模板生成合同(docx/pdf)神器:(一)介绍_热水钟的博客-CSDN博客_xdocreport
对比:word转pdf技术有 org.jodconverter和jacob ,这两个技术对一般在window平台上可用,对linux的支持一般,并且要求在os上安装对应插件(office插件)辅助完成
实际代码
maven引用
<!--poi word模板生成--> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.8.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency> <!--word 转pdf--> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.pdf</artifactId> <version>2.0.2</version> <exclusions> <exclusion> <artifactId>poi-ooxml</artifactId> <groupId>org.apache.poi</groupId> </exclusion> </exclusions> </dependency>
代码:
poi-tl/PaymentExample.java at dev-1.8.0 · Sayi/poi-tl · GitHub
我用的poi-tl是低版本的,若是感兴趣可以用官网最新版本1.10
最后
以上就是欣喜舞蹈为你收集整理的pdf模板定制技术调研最终技术:word模板-word-》pdf实际代码的全部内容,希望文章能够帮你解决pdf模板定制技术调研最终技术:word模板-word-》pdf实际代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复