前言:
使用模板的方式开生成PDF文件
1.下载Adobe Acrobat DC,使用正式版(可以试用7天)
2.打开模板编辑表单域: 选择工具–>准备表单

3.编辑文本域属性

根据要求的模板设置文本域-本例只是测试,就放单个
4.码代码

import com.alibaba.fastjson.JSONObject;
import com.itextpdf.text.pdf.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;import java.io.*;
import java.util.HashMap;
import java.util.Map;public class PdfUtils {public static void main(String[] args) throws IOException {HashMap map = new HashMap<String, String>();map.put("numberNo","001");JSONObject jsonObject = new JSONObject();jsonObject.put("numberNo","001");String sourceFile = "C:\\Users\\Administrator\\Desktop\\新建 DOCX 文档.pdf";String targetFile = "C:\\Users\\Administrator\\Desktop\\new1.pdf";createPDF(map,sourceFile,targetFile);}/*** Description : 通过Map形式传入动态参数* @param map* @param sourceFile* @param targetFile* @throws IOException*/public static void createPDF(HashMap map, String sourceFile, String targetFile) throws IOException {File templateFile = new File(sourceFile);fillParam(map, FileUtils.readFileToByteArray(templateFile), targetFile);}/*** Description: 使用Map中的参数填充pdf,Map中的key和pdf表单中的field对应 <br>* @Param* @return*/public static void fillParam(Map<String, String> fieldValueMap, byte[] file, String contractFileName) {FileOutputStream fos = null;try {fos = new FileOutputStream(contractFileName);PdfReader reader = null;PdfStamper stamper = null;BaseFont base = null;try {reader = new PdfReader(file);stamper = new PdfStamper(reader, fos);stamper.setFormFlattening(true);//UniGB-UCS2-Hbase = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);AcroFields acroFields = stamper.getAcroFields();for (Object key : acroFields.getFields().keySet()) {acroFields.setFieldProperty(key.toString(), "textfont", base, null);acroFields.setFieldProperty(key.toString(), "textsize", new Float(15), null);}if (fieldValueMap != null) {for (String fieldName : fieldValueMap.keySet()) {acroFields.setField(fieldName, fieldValueMap.get(fieldName));}}} catch (Exception e) {e.printStackTrace();} finally {if (stamper != null) {try {stamper.close();} catch (Exception e) {e.printStackTrace();}}if (reader != null) {reader.close();}}} catch (Exception e) {System.out.println("填充参数异常");e.printStackTrace();} finally {IOUtils.closeQuietly(fos);}}/*** Description 通过JSON形式传入动态参数* @param jsonObject* @param sourceFile* @param targetFile* @throws IOException*/public static void createPDF(JSONObject  jsonObject, String sourceFile, String targetFile) throws IOException {File templateFile = new File(sourceFile);fillParamJson(jsonObject, FileUtils.readFileToByteArray(templateFile), targetFile);}/*** Description: 使用Map中的参数填充pdf,Map中的key和pdf表单中的field对应 <br>* @param fieldValueMap* @param file* @param contractFileName*/public static void fillParamJson(JSONObject fieldValueMap, byte[] file, String contractFileName) {FileOutputStream fos = null;try {fos = new FileOutputStream(contractFileName);PdfReader reader = null;PdfStamper stamper = null;BaseFont base = null;try {reader = new PdfReader(file);stamper = new PdfStamper(reader, fos);stamper.setFormFlattening(true);base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);AcroFields acroFields = stamper.getAcroFields();for (Object key : acroFields.getFields().keySet()) {acroFields.setFieldProperty(key.toString(), "textfont", base, null);acroFields.setFieldProperty(key.toString(), "textsize", new Float(15), null);}if (fieldValueMap != null) {for (Object fieldName : fieldValueMap.keySet()) {acroFields.setField(fieldName.toString(), fieldValueMap.get(fieldName).toString());}}} catch (Exception e) {e.printStackTrace();} finally {if (stamper != null) {try {stamper.close();} catch (Exception e) {e.printStackTrace();}}if (reader != null) {reader.close();}}} catch (Exception e) {System.out.println("填充参数异常");e.printStackTrace();} finally {IOUtils.closeQuietly(fos);}}/*** 将File转成FileItem* @param file* @return*/public static FileItem createFileItem(File file) {FileItemFactory factory = new DiskFileItemFactory(16, null);FileItem item = factory.createItem("textField", "text/plain", true, file.getName());int bytesRead = 0;byte[] buffer = new byte[8192];try {FileInputStream fis = new FileInputStream(file);OutputStream os = item.getOutputStream();while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();fis.close();} catch (IOException e) {e.printStackTrace();}return item;}}

缺陷:无法添加多条数据,比如明细之类

2.itext 根据模板 生成pdf 多行数据
前言:基于 html + ccs + itext + 字符串替换完成的。简单,依赖的 jar 少…
根据 pdf模板 生成 pdf ,

  1. 不能有循环的数据(可能有,但我并没有找到);

  2. table 中的文字无法自适应(可能有,但我并没有找到)。
    预览效果

红框中的内容,就是 list 数据,长度不固定,无法用 PDF 模板生成。
右侧出现pdf生成出现适应问题,解决方案还没找到
下面是代码:
pom.xml文件

      <!--iTextpdf 相关依赖 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.6</version></dependency>

java 文件

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;import java.io.*;
import java.nio.charset.Charset;/*** 关于这里的异常及文件流* 1. 异常: 根据自身的业务,补货处理一下;* 2. 流:一定要在 [ try - catch - finally ] finally 中关闭流,不然啥时候出现 OOM 的时候,你明白的...* @author duzq* @date 2020-7-26 16:44:54*/
public class HtmlPdf {private static final String DEST = "target/HelloWorld_CN_HTML1.pdf";private static final String HTML = "src/main/resources/hrmTemplate.html";private static final String HTML_TEMP = "src/main/resources/hrmTemplateTemp.html";private static final String FONT = "src/main/resources/SimHei.ttf";public static void main(String[] args) throws IOException, DocumentException {// 1. 读取html文件FileInputStream fileInputStream = new FileInputStream(HTML);StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream, "utf8"));String line = null;while ((line = bufferedReader.readLine()) != null) {// 文字换行显示 stringBuilder.append(System.getProperty("line.separator"));stringBuilder.append(line);}System.out.println(stringBuilder.toString());// 2. 替换html中的关键字String htmlStr = stringBuilder.toString();htmlStr = htmlStr.replaceAll("#name#", "刘小华");htmlStr = htmlStr.replaceAll("#jobNumber#", "2000151");htmlStr = htmlStr.replaceAll("#dept#", "20200202");htmlStr = htmlStr.replaceAll("#gw#", "高频车间副经理");htmlStr = htmlStr.replaceAll("#gender#", "男");htmlStr = htmlStr.replaceAll("#dateOnBoard#", "2021-02-08");htmlStr = htmlStr.replaceAll("#workTime#", "2021-02-08");htmlStr = htmlStr.replaceAll("#birthday#", "1983-03-30");htmlStr = htmlStr.replaceAll("#idCard#", "555555555555555555");htmlStr = htmlStr.replaceAll("#household#", "农业");htmlStr = htmlStr.replaceAll("#idCardAddress#", "四川省东东县大人村,3号社区");htmlStr = htmlStr.replaceAll("#education#", "初中");htmlStr = htmlStr.replaceAll("#degree#", "无");htmlStr = htmlStr.replaceAll("#specialty#", "无");htmlStr = htmlStr.replaceAll("#school#", "无");htmlStr = htmlStr.replaceAll("#politics#", "");htmlStr = htmlStr.replaceAll("#marital#", "未婚");htmlStr = htmlStr.replaceAll("#phone#", "18552789087");htmlStr = htmlStr.replaceAll("#emailAddress#", "泉州");htmlStr = htmlStr.replaceAll("#email#", "");htmlStr = htmlStr.replaceAll("#emergency#", "刘国贵");htmlStr = htmlStr.replaceAll("#ContactNumber#", "16789098765");// 3. 可以替换成list中的数据, 后续将生成的html格式的字符串,加入到上面读取到的字符串中String trList = "\n" +"        <tr>\n" +"            <td class='fc'>1</td>" +"            <td class='fc'>2020-11-17</td>" +"            <td class='fc'>互联心</td>" +"            <td class='fl'>java开发</td>" +"            <td class='fr'>无</td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fl'></td>" +
//                "            <td class='fr'></td>" +"        </tr>";trList += "\n" +"        <tr>\n" +"            <td class='fc'>2</td>" +"            <td class='fc'>2020-11-10</td>" +"            <td class='fc'>互联心</td>" +"            <td class='fl'>java开发</td>" +"            <td class='fr'>无</td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fc'></td>" +
//                "            <td class='fl'></td>" +
//                "            <td class='fr'></td>" +"        </tr>";// 4. 将list中的数据替换到html中htmlStr = htmlStr.replaceAll("#trList#", trList);// 5. 生成临时文件  [PS: 文件名称是固定的,当碰到并发时,会出现问题,可以将html文件名称替换成 UUID]File file = new File(HTML_TEMP);FileOutputStream fop = new FileOutputStream(file);if (!file.exists()) {file.createNewFile();}byte[] contentInBytes = htmlStr.getBytes();fop.write(contentInBytes);fop.flush();fop.close();// 6. 开始生成pdfDocument document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();// 插入图片 , 具体怎么用,没有去琢磨...本次需求不涉及图片操作...// 想法: 在上面的步骤,文件主题已经完成,在最后部分,通过 itext 的 api,将图片放到 pdf文件流中//       将图片转换成 baset64 字符串的方式,试过了,不好用,才有了当前的这个想法,图片试过了,可以用。
//        Image img = Image.getInstance(LOGO_PATH);
//        img.setTop(100);
//        img.setLeft(50);
//        img.setAbsolutePosition(100,100);
//        document.add(img);// 7. 根据 html 模板转换成pdf文件XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(HTML_TEMP), null, Charset.forName("UTF-8"), fontImp);document.close();}
}

html 模板

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"/><title>Title</title><style>body {font-family: SimHei;width: 1080px;margin: 0 auto;}table {width: 1000px;font-size: 10px;}.fc {text-align: center;}.fl {text-align: left;}.fr {text-align: right;}.trBorder td {border-style: none;}/*.cjzytf_table{*//*    width: 98%;*//*    text-align: center;*//*    !*border-color: rgb(32, 82, 133);*!*//*    border-collapse: collapse;*//*    !*color: rgb(32, 82, 133);*!*//*    font-family: "微软雅黑";*//*    letter-spacing: 3px;*//*    table-layout: fixed;*//*}*/.cjzytf_table th{font-size: 20px;padding: 15px 0;}.cjzytf_table td{font-size: 16px;padding: 8px 0;/*width: 10%;*/}</style>
</head>
<body>
<h2style="text-align: center">人员履历表</h2>
<table class="cjzytf_table" border="1" cellspacing="0"style="border-style: none;"><tr ><td  class="fc">姓名</td><td class="fc">#name#</td><td class="fc"></td><td class="fc"></td><td class="fc">工号</td><td class="fc">#jobNumber#</td><td class="fc" rowspan="6">         aaaaaaaaaaaaa  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  </td></tr><tr ><td  class="fc">部门</td><td class="fc" colspan="5"></td></tr><tr ><td  class="fc">岗位</td><td class="fc" colspan="5">#gw#</td></tr><tr ><td  class="fc">性别</td><td  class="fc">#gender#</td><td  class="fc">入职日期</td><td  class="fc">#dateOnBoard#</td><td class="fc" >参加工作时间</td><td class="fc" >#workTime#</td></tr><tr ><td  class="fc">出生日期</td><td class="fc">#birthday#</td><td class="fc">身份证号</td><td class="fc"colspan="3">#idCard#</td></tr><tr ><td  class="fc">户口性质</td><td class="fc" >#household#</td><td  class="fc">身份证地址</td><td  class="fc"colspan="3">#idCardAddress#</td></tr><tr ><td  class="fc">学历</td><td class="fc" >#education#</td><td  class="fc">学位</td><td class="fc" >#degree#</td><td class="fc">专业</td><td class="fc" colspan="2">#specialty#</td></tr><tr ><td  class="fc">毕业院校</td><td class="fc" colspan="6">#school#</td></tr><tr ><td  class="fc">政治面貌</td><td  class="fc">#politics#</td><td  class="fc">婚姻状况</td><td  class="fc">#marital#</td><td class="fc" >联系电话</td><td class="fc" colspan="2">#phone#</td></tr><tr ><td  class="fc">邮寄地址</td><td class="fc" colspan="4">#emailAddress#</td><td class="fc">个人电子邮箱</td><td class="fc">#email#</td></tr><tr ><td  class="fc">紧急联系人</td><td class="fc" >#emergency#</td><td  class="fc">紧急联系人电话</td><td class="fc" colspan="4">#ContactNumber#</td></tr>
</table>
<tablestyle="margin-top: 20px;" border="1" cellspacing="0">
<tr><td  colspan="4">主要工作经历</td></tr><tr><td>序号</td><td>起始时间</td><td>工作单位</td><td>职务</td><td>离职原因</td></tr>#trList#
</table>
<tablestyle="margin-top: 20px;" border="1" cellspacing="0"><tr><td colspan="3">本人职业证书外部挂靠</td></tr><tr><td>序号</td><td>职业证书名称</td><td>挂靠单位名称</td><td>企业联系电话</td></tr>
</table>
</body>
</html>

SimHei.ttf
字体地址:
链接: https://pan.baidu.com/s/1sBhVaQfD3BNlqvoQUYQH2Q 提取码: gagq 复制这段内容后打开百度网盘手机App,操作更方便哦

itext根据数据生成PDF相关推荐

  1. 使用itext和JasperReports生成PDF文档

    1>方法一Itext来实现生成文档这个pdf的文档 1.使用Itext来实现生成我都这个PDF的文档,代码如下 public static void main(String[] args) {t ...

  2. 统计书中单词出现次数, 然后把数据生成pdf

    #/usr/bin/env python # *-*coding:utf-8 *-* #运行环境python3用Counter统计书中单词的使用次数 import sys from collectio ...

  3. java 生成pdf文件_Java 中HTTP响应数据生成PDF,PDF文件的读取

    将HTTP响应数据生成PDF,这一步的话,就比较坑,浪费了好多时间,查了很多资料,也是我想把它记录下来的主要原因, 废话少说,先说踩的坑 1.区分字符流.字节流 这里可以百度一下,但是简言之就是: j ...

  4. itext 根据模板 生成pdf 多行数据

    前言:基于 html + ccs + itext + 字符串替换完成的.简单,依赖的 jar 少... 根据 pdf模板 生成 pdf , 1. 不能有循环的数据(可能有,但我并没有找到): 2. t ...

  5. java itext根据模板生成pdf

    很久没有更新过了,稍微闲一点,顺势总结下N久之前用到的小技巧. 这里生成pdf主要使用itext.jar.如想生成一个pdf,其实很简单的啦!第一种:全部使用代码生成:第二种:根据pdf模板生成.当前 ...

  6. iText框架(生成pdf文档)

    1.创建一个itext的简单示例 a.导包(pom.xml文件) <dependencies><dependency><groupId>com.lowagie< ...

  7. 使用itext将HTML 生成PDF文件

    1.使用itext将HTML模板生成PDF文件 HTML模板注意事项: 所有标签按语法正确闭合,否则会报错 table用border设置表格 如果下载到空白文件,看看整体XML的宽度 width使用% ...

  8. Java—将数据生成pdf表格

    由于时间问题,所以粗略的封装了一个生成pdf表格的工具包(不喜欢讲废话,直接上代码!!!) package com.sgcc.dlsc.jibei.commons.utils;import com.i ...

  9. itext使用模板生成pdf文件

    用pdf模板生成pdf文档很简单,首先需要手动做个pdf模板,上面有很多的类似html里的text域的东西, 给他们起好名字,在程序里填充就可以了.虽然由于不会做模板(实际上由于短时间无法去熟悉使用A ...

最新文章

  1. Python 数据类型:列表
  2. 【数字信号处理】傅里叶变换性质 ( 频域函数的共轭对称分解 | 序列的傅里叶变换 | 傅里叶变换的共轭对称 | 傅里叶变换的共轭反对称 )
  3. 强化学习(十三) 策略梯度(Policy Gradient)
  4. 程序员一夜暴富捷径?不,别被轻易骗进“独角兽”
  5. java有装箱和拆箱吗_Java中装箱和拆箱,你真的都懂么?
  6. [ECMAScript] 举例说明你对es6的class的理解
  7. 达芬奇linux 与win,抛弃Linux:达芬奇软件WIN版安装及设置.doc
  8. RobotStudio传送带设计
  9. 关于生活工作学习之感悟-第一篇
  10. java开发安卓app_开发安卓app常用的三种开发语言
  11. matlab 读取odb,求教用C++方式读取abaqus的odb数据中的问题!!!
  12. 个人银行账户管理系统课程设计报告
  13. 动态规划 -- 活动时间问题
  14. java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100/虚拟机调优
  15. c语言程序教师节祝福,2015年教师节祝福语(大学生适用)
  16. 获取图片某一点的rgb色值
  17. 数据技术前沿趋势、TiDB 产品方向、真实场景 Demo… 丨PingCAP DevCon 2022 产品技术论坛预览
  18. 蓝桥杯:小明用积木搭了一个城堡(积木)
  19. 恋する気持ち的假名,罗马音
  20. RNN和BPTT、LSTM

热门文章

  1. JavaScript:异步执行机制
  2. oracle 导出01455,使用exp命令导出报EXP-00008 和ORA-01455的解决方法
  3. java map 泛型 反射_java - 反射操作泛型
  4. 新开博了,欢迎大家来做客!
  5. 201403-1-相反数
  6. linux 创建目录和删除目录
  7. Ubuntu使用谷歌浏览器登录账号时崩溃
  8. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
  9. mysql跳脱字符 单引号_MYSQL特殊字符(单引号,行尾斜杠)的处理
  10. 哈弗f7带自动泊车吗_中国品牌的全球车型再升级——试驾2020款哈弗F7