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;
    }
}

 

posted @ 2020-07-07 15:39  yvioo  阅读(6283)  评论(0编辑  收藏  举报