JAVA使用itext根据模板生成PDF文档
1、制作PDF模板
网址打开:https://www.pdfescape.com/open/
我们这里先在线上把基础的内容用word文档做好,然后转成PDF模板,直接上传到网站上,这样方便点
假设我们pdf是这样
然后我们选择文件上传到网站上之后,如下图所示
选择文件后,点击upload ,或者可以把文件直接用鼠标拖到Drop PDF Here的位置,也会直接上传,上传成功之后会跳转页面,所下图所示
接着我们可以进行操作,点击左上角 Form Field,这个是插入字段(你可以理解成是java中文档要用的占位符)
选择对应的text,如有需要,可以选择其他的模式,好了之后,点击Select
选择之后用按住鼠标左键,划定要显示的区域(绿色区域)
然后把鼠标放到绿色区域,点击鼠标右键,点击Object Properties设置属性名称
userName 就是我们到时候在代码中要替换的属性名,好了之后点击OK,然后依次设置其他的内容
还可以选中某个表单域,可以对字体、大小等进行设置(线上版本不支持编辑字体样式、具体可以查看 https://www.pdfescape.com/windows/ 需要下载软件)
然后点击鼠标左侧的保存按钮,或者直接按ctrl+s 也可以直接保存,保存之后点击下方的下载按钮,把我们设置的pdf文档下载下来
以上模板就制作好了。 网站还有很多其他的功能,需要的可以自己去研究使用。
接着是代码书写
1、引入jar包 iText-2.1.7.jar、itextasian-2.1.7.jar、itext-rtf-2.1.7.jar
下载地址:https://yvioo.lanzous.com/b00nq830b
密码:g912
2、这里只是一个简单的demo方法,可以根据自己需要改写
package com.pdf; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import com.lowagie.text.pdf.AcroFields; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; public class Test { public static void main(String[] args) throws Exception { export(); System.out.println("生成完成"); } public static void export(){ try { // pdf模板所在路径,就是网站制作好后下载的pdf模板路径 String fileName = "D:/testpdf.pdf"; PdfReader reader = new PdfReader(fileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); PdfStamper ps = new PdfStamper(reader, bos); // 使用中文字体 BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); ArrayList<BaseFont> fontList = new ArrayList<BaseFont>(); fontList.add(bf); AcroFields fields = ps.getAcroFields(); fields.setSubstitutionFonts(fontList); fillData(fields, data()); //必须要调用这个,否则文档不会生成的 ps.setFormFlattening(true); ps.close(); //生成pdf路径存放的路径 OutputStream fos = new FileOutputStream("D:/result.pdf"); fos.write(bos.toByteArray()); fos.flush(); fos.close(); bos.close(); }catch (Exception e){ e.printStackTrace(); } } /** * 填充模板中的数据 */ public static void fillData(AcroFields fields, Map<String, String> data) { try { for (String key : data.keySet()) { String value = data.get(key); // 为字段赋值,注意字段名称是区分大小写的 fields.setField(key, value); } } catch (Exception e) { e.printStackTrace(); } } /** * 填充数据源 * 其中data存放的key值与pdf模板中的文本域值相对应 */ public static Map<String, String> data() { Map<String, String> data = new HashMap<String, String>(); data.put("schoolName", "国际测试测试测试测试"); data.put("userName", "yvioo"); data.put("date", "2020/7"); return data; } }