java实现pdf生成,包括合并图片

参考帖子:

这位大佬的帖子必读,因为涉及到pdf创建表单的教程:
java使用itext填充pdf模板,超简单教学,有手就行
以下是学习当中参考的帖子:
java pdf域插入img_java实现在pdf模板的指定位置插入图片
java 使用 itextpdf 为 PDF 添加图片

依赖

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

代码部分

package com.pdfCeShi.ceShi1;

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

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 给定几个地址功能,传入参数和图片生成pdf
 *
 * @author zihao
 * @version 1.0
 * @BelongsPackage com.pdfCeShi.ceShi1
 * @CreateTime 2023-01-10
 * @Description:
 */
public class PdfCeShi {
    private static int blank = 1;
    public static void main(String[] args) {
        // 模板文件路径
        String inputFileName = "E:\\未标题-1(带表单).pdf";
        // 生成的文件路径
        String outputFileName = "E:\\test.pdf";
        String image = "E:\\透明印章.png";
        String phoneImage = "C:\\Users\\Administrator\\Pictures\\微信截图.jpg";
        //旧的pdf流
        OutputStream os = null;
        //旧的pdf表单信息
        PdfReader reader = null;
        //新的pdf
        PdfStamper ps = null;
        
        try {
            os = new FileOutputStream(new File(outputFileName));
            // 2. 读入pdf表单
            reader = new PdfReader(inputFileName);
            // 3. 根据表单生成一个新的pdf
            ps = new PdfStamper(reader, os);
            // 4. 获取pdf表单
            AcroFields form = ps.getAcroFields();
            
            /* ---文字部分--- */
            // 5. 给表单添加中文字体
            BaseFont bf = BaseFont.createFont("src/main/resources/Font/FZLTHJW.TTF", BaseFont.IDENTITY_H,
                    BaseFont.NOT_EMBEDDED);
            form.addSubstitutionFont(bf);
            // 6. 查询数据================================================
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("projectName", "李四");
            data.put("productMarking", "张三");
            
            // 7.遍历data 给pdf表单表格赋值
            for (String key : data.keySet()) {
                form.setField(key, data.get(key).toString());
            }
            ps.setFormFlattening(true);
            PdfContentByte under =null;
            
            /* ---拍照图片部分(这部分内容是根据图片域的大小插入自适应大小的图片)--- */
            // 通过域名获取所在页和坐标,左下角为起点
//            int pageNo = form.getFieldPositions("field").get(0).page;
//            Rectangle signRect = form.getFieldPositions("field").get(0).position;
//            float x = signRect.getLeft();
//            float y = signRect.getBottom();
//            // 读图片
//            Image image1 = Image.getInstance(phoneImage);
//            // 获取操作的页面
//            under = ps.getOverContent(pageNo);
//            // 根据域的大小缩放图片
//            image1.scaleToFit(signRect.getWidth(), signRect.getHeight());
//            // 添加图片
//            image1.setAbsolutePosition(x, y);
//            under.addImage(image1);
            
            /* ---印章图片部分--- */
            // 获取PDF文档信息
            Map<String, Object> pdfMsg = getPdfMsg(inputFileName);
            // 开始计算图片起始位置 * PDF文档宽度 - (所有图片的宽度 + 每张图片右侧加5 个单位的空白 )
            float startAddress = Float.parseFloat(pdfMsg.get("width").toString());
            startAddress -= (Double.parseDouble(getImgMsg(image).get("width").toString()) + blank);
            // 插入水印
            Image img = Image.getInstance(image);
            //图片缩放,值越小图片越小
            img.scalePercent((float) 48 );
            // 设置图片水印的位置,第一个数值越大越靠右,第二个数值越大图片越往上。
            img.setAbsolutePosition(startAddress+140, 350);
            img.getTop();
            // 开始水印 如果需要每一页都加图片,这里添加循环即可,getOverContent是显示在上,getUnderContent是显示在下
            under = ps.getOverContent(Integer.parseInt(pdfMsg.get("pageSize").toString()));
            under.addImage(img);
            startAddress += Float.parseFloat(getImgMsg(image).get("width").toString()) + blank;
            
            System.out.println("===============PDF导出成功=============");
        } catch (Exception e) {
            System.out.println("===============PDF导出失败=============");
            e.printStackTrace();
        } finally {
            try {
                ps.close();
                reader.close();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 获取PDF共有几页,宽高,页面高度
     *
     * @param filePath pdf路径
     * @return java.util.Map
     * @author ZiHao
     * @create 2023/1/11 0011
     **/
    public static Map<String, Object> getPdfMsg(String filePath) {
        Map<String, Object> map = new LinkedHashMap<String, Object>();
        try {
            // 获取PDF共有几页
            PdfReader pdfReader = new PdfReader(new FileInputStream(filePath));
            int pages = pdfReader.getNumberOfPages();
            // System.err.println(pages);
            map.put("pageSize", pages);
            
            // 获取PDF 的宽高
            PdfReader pdfreader = new PdfReader(filePath);
            Document document = new Document(pdfreader.getPageSize(pages));
            float widths = document.getPageSize().getWidth();
            // 获取页面高度
            float heights = document.getPageSize().getHeight();
            // System.out.println("widths = " + widths + ", heights = " + heights);
            map.put("width", widths);
            map.put("height", heights);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
    
    /**
     * 获取源图宽度,源图高度
     *
     * @param imgPath 图片路径
     * @return java.util.Map
     * @author ZiHao
     * @create 2023/1/11 0011
     **/
    public static Map<String, Object> getImgMsg(String imgPath) {
        Map<String, Object> map = new LinkedHashMap<String, Object>();
        try {
            File picture = new File(imgPath);
            BufferedImage sourceImg = ImageIO.read(new FileInputStream(picture));
            // System.out.println("=源图宽度===>"+sourceImg.getWidth()); // 源图宽度
            // System.out.println("=源图高度===>"+sourceImg.getHeight()); // 源图高度
            map.put("width", sourceImg.getWidth());
            map.put("height", sourceImg.getHeight());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }  
}

== 注意:pdf图片域需要设置不显示,那样你的图片才能在最顶层,不然图片会被域遮挡==

你可能感兴趣的:(java,pdf)