根据excel数据和pdf模板批量生成pdf

案例 批量生成合同

1、准备存储数据的excel 和对应的pdf

 

 

 

 

 

 2、利用 Adobe Acrobat DC    制作pdf模板 具体流程如下

  1> 下载Adobe Acrobat DC 并安装 打开准备的pdf

  2> 在右侧工具栏中 找到 准备表单 如图所示

 

 

 

(如果没有准备表单选项,在左上角工具中添加 )

 

   3> 根据需要可以对pdf进行编辑,在适当的位置加上表单控件(本案例添加的为文本框)

 

    4>添加后双击文本框 在弹出的窗口中修改映射的变量名

 

 3、准备完成后进入编码阶段

 public static void main(String[] args) throws Exception {
        FileInputStream file = new FileInputStream("excel文件地址");
        ExcelReader excelReader = EasyExcel.read(file, Excel.class, new ExcelListener()).build();
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        //读取Excel
        excelReader.read(readSheet);
        //这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
    }
public class ExcelListener implements ReadListener<Excel> {
    
    @Override
    public void invoke(Excel data, AnalysisContext context) {
        System.out.println("解析到一条数据:"+JSON.toJSONString(data) );
        PdfReader reader;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            reader = new PdfReader("pdf模板位置");
            bos = new ByteArrayOutputStream();
            PdfStamper stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            Map<String, String> map = new HashMap<>();
            map.put("name", data.getName());
            map.put("nameCard",data.getName()+"("+ data.getIdcard()+")");
            map.put("bTime", data.getBTime());
            map.put("eTime", data.getETime());
            fillPdfCellForm(map, form);

            // true代表生成的PDF文件不可编辑
            stamper.setFormFlattening(true);
            stamper.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File("生成pdf的地址"));
            bos.writeTo(fos);
        } catch(IOException ioe) {
            // Handle exception here
            ioe.printStackTrace();
        }
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println("所有数据解析完成!");
    }

    private void fillPdfCellForm(Map<String, String> map, AcroFields form) throws IOException, DocumentException {
        for (Map.Entry entry : map.entrySet()) {
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            form.setField(key, value);
        }
    }
}
用到的依赖
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

效果如图

 

 

 

posted @ 2022-10-13 09:48  DarkerbeS  阅读(1235)  评论(2编辑  收藏  举报