简介

  • 本文使用openpdf 1.3.29 版本,也建议使用openpdf。

    <dependency><groupId>com.github.librepdf</groupId><artifactId>openpdf</artifactId><version>1.3.29</version>
    </dependency>
    
  • OpenPDF 是基于 itext4 开发的开源的jar,itext5也是基于 itext4 开发,且itext5是部分开源,部分收费,且官方不再更新维护,需要引入的包多,itext7绝大部分功能收费了
  • OpenPDF相比 itext5简单使用,且在github下载源码,里面有些例子,共参考
  • 有兴趣的可以下载看看:

    https://github.com/LibrePDF/OpenPDF

软件安装

  1. 所需软件Adobe Acrobat XI Pro,用于制作PDF模板,也可下载其他版本,仅供参考
  2. 可去官网下载,有30天试用期,可使用amtemu.v0.9.2-painter激活,官网下载需要注册用户

https://www.adobe.com/cn/products/catalog.html

  1. 由于上传有存在版权问题,无法上传,需要可以留言联系

制作PDF模板

  • 使用Adobe Acrobat XI Pro创建各种需要的域

    1. 条形码
      使用选定的域对输入进行编码,并将它显示为可以通过解码软件或硬件(分别提供)来解释的可视模式。
    2. 按钮
      促发用户计算机上的变化,如打开文件、播放声音,或者向网络服务器提交数据。这些按钮可通过图像、文本以及鼠标动作触发的可见变化进行自定义。
    3. 复选框
      为个别项显示是或否选择。如果表单包含多个复选框,用户通常可以根据需要选择。
    4. 数字签名域
      允许用户使用数字签名以电子形式对 PDF 文档进行签名。
    5. 下拉列表
      允许用户从弹出式菜单中选择项,或键入值。您可以设置表单域属性,以使用户可以输入自定义值。
    6. 列表框
      显示用户可以选择的选项列表。您可以设置表单域属性,以使用户可以按 Shift 键并单击来选择列表中的多个项。
    7. 单选钮
      显示一组选项,用户仅可以从中选择一项。名称相同的所有单选钮作为一个组一起工作。
    8. 文本域
      允许用户键入文本,例如名称、地址或电话号码。
  • 步骤如下:
    1. 建议先创建一个word,先绘制出来想要的表格或文档(在Adobe Acrobat XI Pro中编辑PDF中不太方便话表格,同时操作内容没有word丰富),然后将word导出PDF,个人使用的是WPS
    2. 用Adobe Acrobat XI Pro 打开,点击编辑图标,右边展示了编辑框,注意内容和表单是常用,如下:
    3. 编辑或新增域,点击表单-编辑;定义域的一般属性 名称 是否可见 只读 ,字体大小
    4. 在代码中通过获取该名称属性来进行对模板填值
    5. 域的属性里,可设置字体,和多行,多行可自动换行,注意域的宽高不够时显示不出来
    6. 重要: 最好将域的字体设置为TIme New Roman,然后代码使用宋体,这样就能兼容中午,即:一段文字,英文显示TIme New Roman,中文显示宋体

代码

  • 个人写了个工具类,
  • 注意:由于STSong-Light与simsun字体不一样,使用浏览器打开字体有差异,需要导入simsun,simsun就是我们使用WPS,Adobe Acrobat XI Pro选择的宋体
package com.test.business.util;import com.easipass.commoncore.exception.EasiServiceException;
import com.lowagie.text.pdf.*;
import lombok.extern.slf4j.Slf4j;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;/*** 描述:创建PDF 工具类*  * @author bpzhang* @date 2022/7/15 12:55*/
@Slf4j
public class CreatePdfUtil {private CreatePdfUtil() {throw new IllegalStateException("Utility class");}/*** 根据用Adobe Acrobat XI编辑好的PDF模板,生成pdf,放入输出流os,** @param templateFilePath 模板路径,一般在resources下,直接文件名即可* @param os               生成的pdf输出流,方便调用者自己管理,关闭流等* @param fieldMapList     需要生成pdf域的填充值,List.size就是多少页*/public static void createPdfByTemplate(String templateFilePath, OutputStream os, List<Map<String, String>> fieldMapList) {try (PdfReader reader = new PdfReader(templateFilePath)) {PdfCopyFields copy = new PdfCopyFields(os);fieldMapList.forEach(fieldMap -> {try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {PdfStamper stamp = new PdfStamper(reader, bos);AcroFields form = stamp.getAcroFields();BaseFont  bfChinese = BaseFont.createFont("fonts/simsun.ttc,0",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bfChinese);fieldMap.forEach((key, value) -> {try {form.setField(key, value);} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}});stamp.setFormFlattening(true);stamp.close();PdfReader pdfReader = new PdfReader(bos.toByteArray());pdfReader.close();copy.addDocument(pdfReader);} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}});copy.close();} catch (IOException e) {log.error(e.getMessage(), e);throw new EasiServiceException(e.getMessage());}}
}
  • 两种调用方式;templateFilePath=模板路径, os = 生成的pdf输出流,可以给目录加文件名outputPath,直接生成文件,或者自动保存到OS流中,自行处理,fieldMapList=key:域的名字,value:域值
  • ** 重点** 域中在value使用\n可换行
CreatePdfUtil.createPdfByTemplate("pdftmpl/EDS_DECL.pdf", os, fieldMapList);
CreatePdfUtil.createPdfByTemplate("pdftmpl/EDS_DECL.pdf", Files.newOutputStream(Paths.get(outputPath)), fieldMapList);

余留问题:

  1. 域中如果中英文同时存在,空格自动换行
  2. 域中行间距调节不了

解决方案:

  1. 问题一:可计算域的一行可放多少个字符,然后代码在固定的字符中增加\n换行符
  2. 问题二:暂时无解方案,只能调节字体大小

以上内容,问题有更好解决方案,欢迎评论区讨论

转载,或者引用请注明出处,已经看到要几个网站直接原原本本贴过去,过分了!

OpenPDF 或 itext5 根据pdf模板生成多页PDF相关推荐

  1. Java/web/jsp根据pdf模板生成荣誉证书PDF文件

    Java/web/jsp根据pdf模板生成荣誉证书PDF文件 1.前言 最近博主在开发一个大学生学分管理系统,按照对方用户的要求,他们需要一个生成PDF荣誉证书的功能. 于是Java根据pdf模板生成 ...

  2. java根据pdf模板生成新的pdf

    文章目录 第一步 制作模板 第二步 引入POM 第三步 根据模板生成PDF 如何填充图片数据 如何让填充的数据进行换行 总结 最近有需求要根据现有的PDF模板生成新的PDF出来,网上资料一大堆,主要总 ...

  3. 根据pdf模板生成新的pdf文件(Java)

    根据pdf模板生成新的pdf文件 一.项目依赖 二.所用工具类 三.其他资料 一.项目依赖 1.maven版本:3.5.x 2.pom文件依赖 <!--itext的依赖jar--> < ...

  4. Java使用Itext5与html模板生成pdf并支持下载

    Java使用Itext5与html模板生成pdf 文章目录 Java使用Itext5与html模板生成pdf 前言 一.引入依赖 二.相关使用说明 1.工具类 2.模板配置 3.模板的抽象类(定义了相 ...

  5. Java中操作pdf模板生成pdf

    [java] iText使用PDF模板生成输出PDF 项目需求涉及到操作pdf模板,根据生成好的模板向里面填充数据 用到的jar包是iText-5.0.6.jar 和iTextAsian.jar pd ...

  6. java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件

    Java 使用pdf 模板生成pdf文件 --制作流程 1.      使用工具 adobe acrobat dc.word 2015 2.      使用 word 繪制一個 3*5 的表格並保存, ...

  7. java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...

    Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...

  8. java根据pdf模板生成指定格式的pdf文件

    java根据pdf模板生成指定格式的pdf文件 一.工具准备 事先得准备好Adobe Acrobat DC,这是一款专门编辑pdf的工具,小编已经给大家准备好了. 链接:https://pan.bai ...

  9. itextpdf通过pdf模板生成pdf文件

    itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...

  10. 根据word模板生成word和PDF

    根据word模板生成word和PDF 需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容 我们使用的默认模板内容如图: 我们在前端填写的字段就是合同名称.项目名称和项目金额 ...

最新文章

  1. 从算法到硬件,一文读懂2019年 AI如何演进
  2. 微信公众平台开发 OAuth2.0网页授权认证
  3. 如何避免在IE内核时,按BackSpace时进行网页会进行回退
  4. Codeforces Round #515 (Div. 3)【未完结】
  5. 【Node】模块加载过程
  6. 声卡突然听不到监听_音乐人/键盘手伴侣物问题之:专业监听音箱的音质必须用独立声卡...
  7. php外卖系统源码单店,网上订餐系统 v3.1 单店版
  8. 黑客攻防技术宝典web实战篇:攻击应用程序逻辑习题
  9. 18春学期《计算机应用基础》,18春学期(1709、1803)《计算机应用基础》在线作业及答案.pdf...
  10. 为什么你成长这么慢?
  11. 注意!你手持身份证拍的照片,可能已经被炒到了上千元
  12. php dom怎么创建节点,前端必须掌握的DOM节点操作方法!
  13. c语言课设作业 计算器,C语言课程设计-计算器设计
  14. JavaWeb-HTML
  15. android 手机格式验证,android – 使用国家/地区代码验证手机号码
  16. easyUI双击事件,完整总结
  17. 【技术】怎么将PPT中的白底图片,白色部分变透明?
  18. 基于消息系统架构设计
  19. Java毕业设计-音乐管理系统
  20. MyBatis02:CRUD操作和配置解析

热门文章

  1. Python 人脸表情识别
  2. android 字符串 声波,识别成功率100%的声波配网,看完你也可以实现一个
  3. 简单步骤Centos7安装Tomcat 8 (yum安装)(ZT)
  4. 不只是地图应用 带你走进GIS的新世界
  5. 一些常用的资料_硬件/系统/等
  6. 推荐项目| 微信小程序富文本解析组件-wxParse
  7. 学习ios蓝牙技术,仿写lightblue
  8. pb 使用mysql_pb连接mySql数据库
  9. 地方时太阳时html源码,地方时和标准时(25页)-原创力文档
  10. 微软服务器探针产品,服务器云探针