最近遇到需求,需要批量生成800+个证书,所以写了一个简单个工具,原理就是PDF表单,读取csv表格中的数据,然后批量生成,比较通用的一个工具,所以分享一下

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;import java.io.*;
import java.util.*;/*** 生成证书* 将表格另存为UTF-8编码的csv文件,若为其他编码请修改常量CHARSET_NAME,修改对应表头行数为表格对应表头行数运行即可,Windows系统的文件路径为C:\\User\\xxx\\xxx.csv格式,linux和Unix系统为/格式** @author xuwei*/
public class Main {/*** 设置文件编码格式,不对应的话会统计错误*/private static final String CHARSET_NAME = "UTF-8";/*** 表格路径*/private static final String CSV_FILE_OF_USER = "/Users/xuwei/Desktop/users.csv";/*** 证书模板路径*/private static final String CERTIFICATE_TEMPLATE = "/Users/xuwei/Desktop/结业证书第三季.pdf";/*** 输出文件夹路径*/private static final String PATH_OF_OUTPUT = "/Users/xuwei/Desktop/certificate/";/*** 输出文件名对应表头字段名*/private static final String FILE_NAME_OF_OUTPUT = "姓名";/*** 字体路径*/private static final String PATH_OF_FONT = "KaiTi.ttc,1";/*** 主函数** @param args*/public static void main(String[] args) {try (Scanner scanner = new Scanner(new File(CSV_FILE_OF_USER), CHARSET_NAME)) {//读取表头String[] header = scanner.nextLine().split(",");while (scanner.hasNextLine()) {String[] fields = scanner.nextLine().split(",");String fileName = new Date().toString();Map<String, String> data = new HashMap<>(header.length);for (int i = 0; i < header.length && i < fields.length; ++i) {if(FILE_NAME_OF_OUTPUT.equals(deleteUtf8Bom(header[i]))){fileName = fields[i];}data.put(deleteUtf8Bom(header[i]), deleteUtf8Bom(fields[i]));}System.out.println("准备生成"+fileName+"的证书");generateCertificate(data,PATH_OF_OUTPUT+"/"+fileName+".pdf");}} catch (IOException | DocumentException e) {e.printStackTrace();}}/*** 生成证书* @param fields* @param fileName*/public static void generateCertificate(Map<String,String> fields,String fileName) throws IOException, DocumentException {//读取模板文件PdfReader pdfReader = new PdfReader(CERTIFICATE_TEMPLATE);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//读取PDF模板内容PdfStamper pdfStamper = new PdfStamper(pdfReader, byteArrayOutputStream);pdfStamper.getUnderContent(1);//使用项目下的自定义的中文字体BaseFont baseFont = BaseFont.createFont(PATH_OF_FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//获取模板中的所有字段AcroFields acroFields = pdfStamper.getAcroFields();acroFields.addSubstitutionFont(baseFont);for (String key : fields.keySet()){acroFields.setField(key,fields.get(key));}//必须要调用这个,否则文档不会生成的pdfStamper.setFormFlattening(true);pdfStamper.close();//将要生成的目标PDF文件名称OutputStream fileOutputStream = new FileOutputStream(fileName);fileOutputStream.write(byteArrayOutputStream.toByteArray());fileOutputStream.flush();fileOutputStream.close();byteArrayOutputStream.close();}/*** 解决utf8字符串中有隐含字符问题* @param str* @return*/public static String deleteUtf8Bom(String str) {byte[] utf8BomBytes = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};byte[] bytes = str.getBytes();if (bytes[0] == utf8BomBytes[0]&& bytes[1] == utf8BomBytes[1]&& bytes[2] == utf8BomBytes[2]) {return new String(bytes, 3, bytes.length - 3);}return str;}
}

Java根据PDF表单模板和CSV表格批量生成证书等文件相关推荐

  1. java pdf模板_java通过PDF模板填写PDF表单

    本文实例为大家分享了java通过PDF模板填写PDF表单的具体代码,包括图片,供大家参考,具体内容如下 需要用到的java包: itext.jar.iTextAsian.jar的JAR包.这个包里面定 ...

  2. java 填充pdf_Java如何创建和填充PDF表单域(代码示例)

    本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...

  3. Java 创建、填充PDF表单域

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  4. java pdf表单域实现_Java 创建PDF表单域 - 文本框、复选框、列表框、组合框、按钮等...

    表单域包括文本框.复选框.列表框.组合框.按钮和签名域等,主要用于收集用户填写或选择的数据.这篇文章将介绍如何在Java应用程序中给PDF文档添加表单域. 导入jar文件 本文所使用的PDF类库是Fr ...

  5. java 填充pdf_Java创建和填充PDF表单域方法

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

  6. 支付宝会员卡开卡表单模板配置(alipay.marketing.card.formtemplate.set)JAVA版本demo

    官方接口文档: https://docs.open.alipay.com/251/105668/ ,我这里写的是开卡组件前两步的操作流程, 仅供参考 1. 调用接口前的准备工作(创建应用等)参考该文档 ...

  7. 利用iTextSharp填写中文(中日韩)PDF表单(完整解决方案)

    或者说中日韩文)表单填写的问题,本不想回答这类问题,因为相关的注意事项都已经在我的博客里说了,但现在看来还是有必要再啰唆下了,如果再有问题的话,希望带着Money来问,拜托了. 下面这段代码根据iTe ...

  8. itext 填充PDF表单

    需要工具 处理pdf的两个itext 的jar包,其中一个是处理汉字兼容问题 需要使用软件 Acrobat Pro 制作表单 使用itext填充表单制作pdf,需要 itext 的jar包,itext ...

  9. itextpdf添加表格元素_使用iText填充pdf表单

    最近项目中用到了下载pdf回单的功能.需要把内容动态的填入pdf并打印,觉得这个功能挺实用的,所以决定用博客记录一下方便以后使用. 一.首先我们需要安装Adoble Acrobat XI Pro,因为 ...

最新文章

  1. 【FFmpeg】ffmpeg工具源码分析(一):main函数
  2. 算法学习之路|称量硬币(模拟)
  3. Angularjs controller之间的通信
  4. RPM 软件包名中的 el5、el6、el7 是什么?
  5. python定义一个列表_如何在Python中创建用户定义的列表?
  6. 会议交流 | 智能风控技术峰会(请关注图分析相关论坛)
  7. 估值指标方法20190805
  8. windowoPhone7.1 Socket编程-实现手机与电脑通信
  9. 【转】子弹短信内部技术分享:Redis
  10. 网易云解析接口PHP源码,网易云音乐直链解析API源代码^-^
  11. 用html和CSS做个人简历
  12. 2012年4月份第3周51Aspx源码发布详情
  13. MATLAB随机信号分析与处理
  14. android如何实现环形缓冲区
  15. python用四个圆画成花_秘籍:学画牡丹技法要领,不轻易外传...
  16. 普通卷积、分组卷积和深度分离卷积概念以及参数量计算
  17. 缺少包含@author的注释信息解决方法
  18. zencart1.55stripe信用卡内嵌支付获取卡号
  19. MAC上写Verilog并编译仿真
  20. php生成sn码,php生成唯一随机码

热门文章

  1. C++ 关于extern 全局变量的应用
  2. c语言体测成绩判定,体测成绩纳入学生毕业成绩评定,你对它了解多少?
  3. ARM体系结构(1)- 工作模式与工作状态
  4. 【对数】YY(jzoj 1438)
  5. cpu核数和逻辑个数的区别_区别: CPU 路数、CPU 核数、物理 CPU 个数、逻辑 CPU 个数...
  6. ProE野火4.0+vs2005 Pro/Toolkit 二次开发测试详细教程
  7. 元宇宙用在教育行业会怎么样?
  8. 【markdown】markdown语法
  9. 全国31省实际利用外资数据集(1978-2019年)
  10. matlab有限元计算程序,MATLAB 有限元计算程序2