java按照模板生成PDF文件,包含文本内容,图片,条形码,二维码

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,双击表单字段
这里写图片描述
这里面都是可以设置的

猜你喜欢

转载自blog.csdn.net/qq_26173219/article/details/81629038