java使用iText按模板生成PDF文件,含文本,图片,条形码,二维码

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

2.操作流程新建一个Word文档内容就是你需要排好的文档格式,需要动态展示的值留空,比如:
111


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


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


点击右边准备表单


点击开始



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

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;

 
 

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

    }

}

感谢阅读

本帖子参考内容来源于网络;具体请了解:
https://blog.csdn.net/qq_26173219/article/details/81629038

发布了10 篇原创文章 · 获赞 0 · 访问量 4629

猜你喜欢

转载自blog.csdn.net/moyingmj/article/details/89703164