【Java】使用PDF模板合成PDF文件(文本 + 图片)

使用PDF模板合成PDF文件(文字 + 图片)

制作PDF模板工具:Adobe Acrobat 9 Pro

导入依赖

<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>
package com.zzz.util;

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

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

public class PdfUtils {

    /**
     * 动态合成DPF  文本 + 图片
     * @param data Map<String, String>类型  key:模板中的字段名 value:填入值
     * @param imageData	Map<String, String>类型 key:模板中的字段名 value:图片路径
     * @return
     */
    public static String pdfContractBuilder(Map<String, String> data, Map<String, String> imageData){
        String contractUrl = null;
        //合同模板链接
        String contractTemplateUrl = "https://zzz-test.com/proxy/contract_template.pdf";
        System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
        ByteArrayOutputStream byteArrayOutputStream = null;
        FileOutputStream fileOutputStream = null;
        PdfStamper ps = null;
        PdfReader reader = null;
        try {
            byteArrayOutputStream = new ByteArrayOutputStream();
            reader = new PdfReader(contractTemplateUrl);
            ps = new PdfStamper(reader, byteArrayOutputStream);
            AcroFields form = ps.getAcroFields();
            // 设置中文
            BaseFont font = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            form.addSubstitutionFont(font);
            //
            for (String key : data.keySet()) {
                form.setField(key,data.get(key));
            }
            // 添加图片
            if(null != imageData && imageData.size() > 0){
                for(String key : imageData.keySet()){
                    int pageNo = form.getFieldPositions(key).get(0).page;
                    com.itextpdf.text.Rectangle signRect = form.getFieldPositions(key).get(0).position;
                    float x = signRect.getLeft();
                    float y = signRect.getBottom();
                    // 读图片
                    Image image = Image.getInstance(imageData.get(key));
                    if(key.equals("userSign")){
                        image.setRotationDegrees(90);
                    }
                    // 获取操作的页面
                    PdfContentByte under = ps.getOverContent(pageNo);
                    // 根据域的大小缩放图片
                    image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                    // 添加图片
                    image.setAbsolutePosition(x, y);
                    under.addImage(image);
                }
            }
            ps.setFormFlattening(true);
            ps.close();
            reader.close();
            byteArrayOutputStream.write(byteArrayOutputStream.toByteArray());
            contractUrl = "D:/" + System.currentTimeMillis()+".pdf";
            fileOutputStream = new FileOutputStream(contractUrl);
            fileOutputStream.write(byteArrayOutputStream.toByteArray());
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if(ps != null){
                    ps.close();
                }
                if(reader != null){
                    reader.close();
                }
                byteArrayOutputStream.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return contractUrl;
    }
    
	public static void main(String[] args) {
        Map<String, String> data = new HashMap<>();
        data.put("realName", "大壮");
        data.put("idCard", "142622188888888888");
        data.put("mobile", "17888888888");
        data.put("year", "2022");
        data.put("month", "08");
        data.put("day", "20");
        Map<String, String> imageMap = new HashMap<>();
        //签名
        imageMap.put("userSign", "https://zzz-test.com/proxy/contract/sign/64859.png");
        imageMap.put("stamp", "https://zzz-test.com/proxy/contract/sign/64859.png");//章
        String contractUrl = PdfUtils.pdfContractBuilder(data, imageMap);
    }
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值