美文网首页
Java使用itext按模板生成PDF文件

Java使用itext按模板生成PDF文件

作者: GuangHui | 来源:发表于2020-11-02 14:47 被阅读0次
    1. 制作PDF模板

    目前制作PDF模板工具别无他物,唯有使用伟大的Adobe公司提供的Adobe Acrobat Pro DC软件进行制作。

    下面是一个测试PDF的表单域:


    2. 通过模板生成PDF文件

    具体实现:

    2.1 引入jar包
    <dependency>
         <groupId>com.itextpdf</groupId>
         <artifactId>itextpdf</artifactId>
         <version>5.5.13</version>
    </dependency>
    <dependency>
         <groupId>com.itextpdf</groupId>
         <artifactId>itext-asian</artifactId>
         <version>5.2.0</version>
    </dependency>
    
    2.2 具体代码如下:
    package pdfdemo;
    
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.AcroFields.Item;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;
    
    public class PDFUtils {
    
    
        /**
         * @param fields
         * @param data
         * @throws IOException
         * @throws DocumentException
         */
        private static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {
            List<String> keys = new ArrayList<String>();
            Map<String, Item> formFields = fields.getFields();
            for (String key : data.keySet()) {
                if (formFields.containsKey(key)) {
                    String value = data.get(key);
                    fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的
                    keys.add(key);
                }
            }
            Iterator<String> itemsKey = formFields.keySet().iterator();
            while (itemsKey.hasNext()) {
                String itemKey = itemsKey.next();
                if (!keys.contains(itemKey)) {
                    fields.setField(itemKey, " ");
                }
            }
        }
    
        /**
         * @param templatePdfPath 模板pdf路径
         * @param generatePdfPath 生成pdf路径
         * @param data            数据
         */
        public static String generatePDF(String templatePdfPath, String generatePdfPath, Map<String, String> data) {
            OutputStream fos = null;
            ByteArrayOutputStream bos = null;
            try {
                PdfReader reader = new PdfReader(templatePdfPath);
                bos = new ByteArrayOutputStream();
                /* 将要生成的目标PDF文件名称 */
                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);
                /* 必须要调用这个,否则文档不会生成的  如果为false那么生成的PDF文件还能编辑,一定要设为true*/
                ps.setFormFlattening(true);
                ps.close();
                fos = new FileOutputStream(generatePdfPath);
                fos.write(bos.toByteArray());
                fos.flush();
                return generatePdfPath;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (bos != null) {
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }
    
        public static void main(String[] args) {
            Map<String, String> data = new HashMap<String, String>();
            //key为pdf模板的form表单的名字,value为需要填充的值
            data.put("title", "河海市人民医院诊疗病历单");
            data.put("case", "123456789");
            data.put("date", "2020.11.02");
            data.put("name", "熊瞎子");
            data.put("sex", "男");
            data.put("age", "29");
            data.put("phone", "137888880000");
            data.put("office", "内科");
            data.put("cert", "身痒找打");
            data.put("drug", "1、奥美拉唑肠溶胶囊             0.25g10粒×2板 ");
            data.put("dose", "×2盒");
            data.put("cons", "用法用量:口服 一日两次 一次2粒");
            data.put("tips", "温馨提示");
            data.put("desc", "尽量呆在通风较好的地方,保持空气流通,有利于病情康复。尽量呆在通风较好的地方");
            generatePDF("D:\\tpl2.pdf",
                    "D:\\filled.pdf", data);
        }
    }
    
    

    生成效果如下:


    参考文章:
    https://www.cnblogs.com/zzlcome/p/11053226.html
    https://blog.csdn.net/javasun608/article/details/79307845

    相关文章

      网友评论

          本文标题:Java使用itext按模板生成PDF文件

          本文链接:https://www.haomeiwen.com/subject/uzhmvktx.html