1.准备工作
通过百度下载adobe acrobat pro dc工具

2.操作流程

新建一个Word文档

内容就是你需要排好的文档格式,需要动态展示的值留空,比如:

模板画好以后另存为PDF格式

通过adobe acrobat pro dc工具打开保存好的PDF文件

点击右边准备表单

点击开始

图中的fill_i可以改成你自己的字段值,修改好以后另存为一个新的PDF,你也可以直接替换掉

jar文件

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.13</version>
</dependency>
    <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-pdfa -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-pdfa</artifactId>
    <version>5.5.13</version>
    <scope>test</scope>
</dependency>
    <!-- https://mvnrepository.com/artifact/com.itextpdf/itext-xtra -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-xtra</artifactId>
    <version>5.5.13</version>
</dependency>

java代码

  package com.pdf;
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    import com.itextpdf.text.Document;
    import com.itextpdf.text.DocumentException;
    import com.itextpdf.text.Font;
    import com.itextpdf.text.Image;
    import com.itextpdf.text.Rectangle;
    import com.itextpdf.text.pdf.AcroFields;
    import com.itextpdf.text.pdf.AcroFields.FieldPosition;
    import com.itextpdf.text.pdf.Barcode128;
    import com.itextpdf.text.pdf.BarcodeQRCode;
    import com.itextpdf.text.pdf.BaseFont;
    import com.itextpdf.text.pdf.PdfContentByte;
    import com.itextpdf.text.pdf.PdfCopy;
    import com.itextpdf.text.pdf.PdfImportedPage;
    import com.itextpdf.text.pdf.PdfReader;
    import com.itextpdf.text.pdf.PdfStamper;

    /**
    * @author 作者:宋浩志
    * @createDate 创建时间:2018年8月10日 上午9:32:04
    */
    public class AA {
        // 利用模板生成pdf  
        public static void pdfout(Map<String,Object> map) {
            // 模板路径 
            String templatePath = "C:\\Users\\Administrator\\Desktop\\pdf(2).pdf";
            // 生成的新文件路径  
            String newPDFPath = "C:/testout1.pdf";
            PdfReader reader;
            FileOutputStream out;
            ByteArrayOutputStream bos;
            PdfStamper stamper;
            try {
                //给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
                BaseFont bf = BaseFont.createFont("c://windows//fonts//simsun.ttc,1" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font FontChinese = new Font(bf, 5, Font.NORMAL);
                // 输出流
                out = new FileOutputStream(newPDFPath);
                // 读取pdf模板  
                reader = new PdfReader(templatePath);
                bos = new ByteArrayOutputStream();
                stamper = new PdfStamper(reader, bos);
                AcroFields form = stamper.getAcroFields();
                //遍历数据
                Map<String,Object> datemap = (Map<String,Object>)map.get("datemap");
                // 添加所创建的字体
                form.addSubstitutionFont(bf);
                for(String key : datemap.keySet()){
                    String value = datemap.get(key).toString();
                    form.setField(key,value);
                }
                Map<String,Object> qrcodeFields=(Map<String, Object>) map.get("qrcodeFields");
                //遍历二维码字段
                for (Map.Entry<String, Object> entry : qrcodeFields.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    // 获取属性的类型
                    if(value != null && form.getField(key) != null){
                        //获取位置(左上右下)
                        FieldPosition fieldPosition = form.getFieldPositions(key).get(0);
                        //绘制二维码
                        float width = fieldPosition.position.getRight() - fieldPosition.position.getLeft();
                        BarcodeQRCode pdf417 = new BarcodeQRCode(value.toString(), (int)width, (int)width, null);
                        //生成二维码图像
                        Image image128 = pdf417.getImage();
                        //绘制在第一页
                        PdfContentByte cb = stamper.getOverContent(1);
                        //左边距(居中处理)
                        float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2;
                        //条码位置
                        image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom());
                        //加入条码
                        cb.addImage(image128);
                    }
                }

                //遍历条码字段
                Map<String,Object> barcodeFields=(Map<String, Object>) map.get("barcodeFields");
                for (Map.Entry<String, Object> entry : barcodeFields.entrySet()) {
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    // 获取属性的类型
                    if(value != null && form.getField(key) != null){
                        //获取位置(左上右下)
                        FieldPosition fieldPosition = form.getFieldPositions(key).get(0);
                        //绘制条码
                        Barcode128 barcode128 = new Barcode128();
                        //字号
                        barcode128.setSize(10);
                        //条码高度
                        barcode128.setBarHeight(35);
                        //条码与数字间距
                        barcode128.setBaseline(10);
                        //条码值
                        barcode128.setCode(value.toString());
                        barcode128.setStartStopText(false);
                        barcode128.setExtended(true);
                        //绘制在第一页
                        PdfContentByte cb = stamper.getOverContent(1);
                        //生成条码图片
                        Image image128 = barcode128.createImageWithBarcode(cb, null, null);
                        //左边距(居中处理)
                        float marginLeft = (fieldPosition.position.getRight() - fieldPosition.position.getLeft() - image128.getWidth()) / 2;
                        //条码位置
                        image128.setAbsolutePosition(fieldPosition.position.getLeft() + marginLeft, fieldPosition.position.getBottom());
                        //加入条码
                        cb.addImage(image128);
                    }
                }
                 //图片类的内容处理
                Map<String,String> imgmap = (Map<String,String>)map.get("imgmap");
                for(String key : imgmap.keySet()) {
                    String value = imgmap.get(key);
                    String imgpath = value;
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    //根据路径读取图片
                    Image image = Image.getInstance(imgpath);
                    //获取图片页面
                    PdfContentByte under = stamper.getOverContent(pageNo);
                    //图片大小自适应
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    //添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
                // 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
                stamper.setFormFlattening(true);
                stamper.close();
                Document doc = new Document();
                Font font = new Font(bf, 20);
                PdfCopy copy = new PdfCopy(doc, out);
                doc.open();
                PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
                copy.addPage(importPage);
                doc.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (DocumentException e) {
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {
            //文本内容map
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("fill_1","文本内容展示");
            //条形码map
            Map<String,Object> barcodeFields = new HashMap<String, Object>();
            barcodeFields.put("fill_2","12345678910");
            //图片
            Map<String,Object> imgmap = new HashMap<String, Object>();
            imgmap.put("fill_3","C:\\Users\\Administrator\\Desktop\\tu.png");
            //二维码map
            Map<String,Object> qrcodeFields = new HashMap<String, Object>();
            qrcodeFields.put("fill_4","https://blog.csdn.net/qq_26173219");
            //组装map传过去
            Map<String,Object> o=new HashMap<String, Object>();
            o.put("datemap",map);
            o.put("barcodeFields",barcodeFields);
            o.put("qrcodeFields",qrcodeFields);
            o.put("imgmap",imgmap);
            //执行
            pdfout(o);
        }


    }

执行完以后的PDF文件在C:/testout1.pdf,可以看代码

效果图:

修改字体大小方式

打开adobe acrobat pro dc,双击表单字段

这里面都是可以设置的