package com.boss.fiscal.report.utils;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.apache.commons.lang.StringUtils;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class PDFUtils {


    /**
     * 拿到数据直接转换输出pdf
     * @param data
     * @return
     */
    public Map dataPdf(Map<String, String> data) {
        Map<String, Object> result = new HashMap<>(); 
        try {
            String path = data.get("path");
            String fileName = data.get("fileName");
            if (StringUtils.isEmpty(path)) {
                path = "D:/fiscal/";
                File file = new File(path);
                if (!file.exists()) {// 判断目录是否存在
                    file.mkdir();
                }
                path = "D:/fiscal/" + fileName + "/";
                file = new File(path);
                if (!file.exists()) {// 判断目录是否存在
                    file.mkdir();
                }
            }
            if (StringUtils.isEmpty(fileName)) {
                throw new RuntimeException("fileName 不可为空");
            }
            //读取pdf
            PdfReader reader = new PdfReader(path + fileName);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            //将要生成的目标PDF文件名称
            PdfStamper ps = new PdfStamper(reader, bos);
            //PdfContentByte under = ps.getUnderContent(1);
            //设置中文字体
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
            fontList.add(bf);
            //取出报表模板中的所有字段
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            //对表单数据进行赋值
            fillData(fields, ps, data);
            //必须要调用这个,否则文档不会生成的
            ps.setFormFlattening(true);
            ps.close();
            String outPath = data.get("outPath");
            OutputStream fos = new FileOutputStream(outPath + fileName);
            fos.write(bos.toByteArray());
            fos.flush();
            fos.close();
            bos.close();
            result.put("code","100000");
            result.put("data",outPath+fileName);
            result.put("result","转化成功");
        } catch (Exception e) {
            result.put("code","118000");
            result.put("result","转化失败");
            result.put("data",e.getMessage());
        }
    
        return result;
    }

    public void fillData(AcroFields fields, PdfStamper ps, Map<String, String> data) throws IOException, DocumentException {
        // 为字段赋值,注意字段名称是区分大小写的
        for (String key : data.keySet()) {
            if (key.equals("image")) {
                /**
                 * 添加图片
                 */
                String imgpath = data.get(key);
                int pageNo = fields.getFieldPositions(key).get(0).page;
                Rectangle signRect = fields.getFieldPositions(key).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                // 读图片
                Image image = Image.getInstance(imgpath);
                // 获取操作的页面
                PdfContentByte under = ps.getOverContent(pageNo);
                // 根据域的大小缩放图片
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
            } else {
                String value = data.get(key);
                fields.setField(key, value);
            }
        }

    }


}
<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itextpdf</artifactId>
   <version>5.5.1</version>
</dependency>
<dependency>
   <groupId>com.itextpdf</groupId>
   <artifactId>itext-asian</artifactId>
   <version>5.2.0</version>
</dependency>