Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)


Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片)


相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚).

参考文章:https://www.cnblogs.com/wangpeng00700/p/8418594.html


这里主要使用到 itextpdf 的工具包
特点:

  • 一对一,点对点的给对应的地方写值,比如模板里面放了个name标识,在程序里把“张三”赋给name,那么输出的pdf里面name的地方就变成了张三,准确方便快捷
  • 支持中文,可以使用自己下载的字体。
  • 支持图片:图片的大小范围可以在模板随意调,生成出来的图片不会超过范围。而且不需要根据坐标去算,程序里面自动计算的。
  • 支持多页模板,即使是好几页的模板,只要每个变量对应的范围确定好了,生成出来的格式就不会错乱。

这里我下载了一个宋体的字体文件,大家可以下载进行参考:

  • 链接:https://pan.baidu.com/s/13i4t7R4gHOBUeh4lGzVZYg
  • 提取码:s7un

效果图:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第1张图片


一、模板准备

1.下载编辑PDF软件(adobe_acrobat_pro),大家可自行下载,也可下载我的百度网盘中的
  • 链接:https://pan.baidu.com/s/1I-a2rHnI_Xrz0zK7OzWP0A
  • 提取码:hi71

下载成功,解压后双击运行安装:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第2张图片


2.根据work模板生成对应的PDF模板文件

1.新建一个work文档,并将其另存为为PDF格式:

Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第3张图片
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第4张图片

2.将名称为 test2 的PDF文件用第一步安装的 Adobe Acrobat Pro 打开,进行表单的编辑和变量名的填充:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第5张图片

设置文本域的变量名,后期在代码中用于替换对应的值用:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第6张图片

也可以设置字体大小等,是否需要边框
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第7张图片

设置图片,图片的地方没有文本域,在空白地方点击右键,选择文本域,然后就可以规定显示图片区域的大小了,最后的图片显示不会超出这个边框:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第8张图片
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第9张图片

最后的结果,直接保存即可:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第10张图片


二、具体代码实现

1.在pom文件中引入 itextpdf 依赖

<dependency>
    <groupId>com.itextpdfgroupId>
    <artifactId>itextpdfartifactId>
    <version>5.4.3version>
dependency>  

2.在F盘下放入test2.pdf文件和一张图片
在这里插入图片描述


3.PDFUtils:

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * PDF生成
 */
public class PDFUtils {
    /** 模板路径 */
    private static final String TEMPLATE_PATH = "F:\\test2.pdf";

    /** 生成的新文件路径 */
    private static final String NEW_PDF_PATH = "F:\\testOut1.pdf";

    /**
     * 利用模板生成pdf
     * @param sourceMap 数据源Map
     */
    public static void pdfout(Map<String,Object> sourceMap) {
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            // 设置字体
            BaseFont bf = BaseFont.createFont("D:\\bb2360\\simsun.ttf" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            Font fontChinese = new Font(bf, 3, Font.NORMAL);
            out = new FileOutputStream(NEW_PDF_PATH);// 输出流
            reader = new PdfReader(TEMPLATE_PATH);// 读取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();

            //文字类的内容处理
            Map<String,String> dataMap = (Map<String,String>)sourceMap.get("dataMap");
            form.addSubstitutionFont(bf);
            for(String key : dataMap.keySet()){
                String value = dataMap.get(key);
                form.setField(key,value);
            }

            //图片类的内容处理
            Map<String,Object> imageMap = (Map<String,Object>)sourceMap.get("imageMap");
            for(String key : imageMap.keySet()) {
                String imgpath = imageMap.get(key).toString();
                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);
            }
            stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
            stamper.close();
            Document doc = new Document();
            Font font = new Font(bf, 32);
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();

        } catch (IOException | DocumentException e) {
            System.out.println(e);
        }

    }

    public static void main(String[] args) {
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        map.put("idcard","430159199802156596");

        Map<String,Object> map2 = new HashMap<>();
        map2.put("image","F:\\test2.png");

        Map<String,Object> o=new HashMap<>();
        o.put("dataMap",map);
        o.put("imageMap",map2);
        pdfout(o);
    }
}

4.结果展示:
Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)_第11张图片


至此结束,更多的功能和优化,大家可以自行补充完整!希望能对大家有用!

相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文字/图片/页眉页脚).

你可能感兴趣的:(Java,工具类,java,pdf,itextpdf)