本篇文章主要讲解的是如何采用itext7进行模板填充。
-
创建PdfReader PdfWriter,构造函数支持路径已经流的形式。
-
创建PDFDocument
-
创建并设置中文字体
-
获取文本域的信息
-
判断文本框长度是否够单行显示
-
填充信息
-
设置模板不可编辑
private static void fillParam(PdfReader pdfReader, PdfWriter pdfWriter,
Map<String, Object> map, List<PdfPositon> pdfPositons) throws MalformedURLException {
//1、创建pdf文件
PdfDocument pdf = new PdfDocument(pdfReader, pdfWriter);
//2、创建中文字体
PdfFont f2 = null;
try {
f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
} catch (IOException e) {
logger.error("create Font Error");
pdf.addFont(f2);
//3、获取pdf模板中的域值信息
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
Map<String, PdfFormField> fieldMap = form.getFormFields();
Iterator<String> paramIterator = map.keySet().iterator();
while (paramIterator.hasNext()) {
String key = paramIterator.next();
String value = map.get(key).toString();
PdfFormField formField = fieldMap.get(key);
if (formField == null) {
continue;
//4、判断文本域是否超出宽度 且文本域是单行
if (!compareWidth(f2, formField, value) && !formField.isMultiline()) {
logger.error("value width was out of text width fieldName:{}", key);
//5、填充信息
formField.setValue(value);
//6、设置文本不可编辑
form.flattenFields();
pdf.close();
- 需要设置中文字体否则填充中文信息时可能无法显示
- 需要对单行的文本域进行宽度判断,目前代码中是打印了异常日志
- 如果未设置文本不可编辑的话,会出现生成的文件仍然可以修改的情况
下面来梳理一下如何判断文本值超出文本框的最大长度(Adobe 默认是不展示的,而实际使用过程中肯定是要提示一下用户的)
实际比较对象是文本值的宽度和文本域的宽度,但是计算文本值的宽度是需要知道字体以及字体大小。
* 1、获取文本框的宽度 注意要减去左右的padding值 值为:PdfFormField.X_OFFSET 2、获取字符串宽度注意字体 需使用中文字体
* @param pdfFont 字体
* @param formField 文本域
* @param value 文本值
* @return textWidth >= valueWidth return true else false
public static boolean compareWidth(PdfFont pdfFont, PdfFormField formField, String value) {
//获取当前文本字体大小
float fontSize = getFontSize(formField);
PdfArray position = formField.getWidgets().get(0).getRectangle();
float width = (float) (position.getAsNumber(2).getValue() - position.getAsNumber(0).getValue())
- PdfFormField.X_OFFSET * 2;
//获取当前文本值的宽度
float strWidth = pdfFont.getWidth(value, fontSize);
return width >= strWidth;
* 获取adobe中设置的字体大小
* @param formField
* @return
private static float getFontSize(PdfFormField formField) {
String defaultAppearance = formField.getDefaultAppearance().toString();
String[] daTable = defaultAppearance.split(" ");
return Float.valueOf(daTable[PdfFormField.DA_SIZE]);
注意:实际文本域的边框和字之间还是存在间隙了,类似于html中的padding,所以文本框的实际宽度还要减去两边的padding值
本篇文章主要讲解的是如何采用itext7进行模板填充。创建PdfReader PdfWriter,构造函数支持路径已经流的形式。 创建PDFDocument 创建并设置中文字体 获取文本域的信息 判断文本框长度是否够单行显示 填充信息 设置模板不可编辑 private static void fillParam(PdfReader pdfReader, PdfWriter...
日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态、批量向Pdf模板中填充内容。
这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf Form表单进行内容填充。
Pdf模板制作
1、word中制作表格
使用Office word 或 WPS word,制作出一个表格,通过表格底色,颜色、字体设置、对齐等方式美化一下表格。
效果图如下:
2、word导出为pdf
可以使用WPS的另存为功能,将word导出为pdf文件
导出完的pdf文件,效果
iTextPdf填写Pdf表格出现Field空白现象
最近在帮客户做一个简单的report。用户提供了一个pdf文件作为模板,需要从特定的文件中读取数据然后填写到模板中。 很简单的一个程序使用iTextPdf就能实现。但是就在我给客户email一个样板的时候,发现在我的机子上,填写的内容是正常的显示,但是通过email传输之后内容全都不见了。Debug没有出现任何错误。
code:
public void fillDateInPDfFile(ReportData reportData, String o
对itext的使用也是从itext 5开始,一点一点的拼凑出来的。做到后面发现业务上需要对图片进行处理,一直没有找到比较好的解决办法,最后入了itext 7的坑。
先说一说 itext 7的优点吧。代码量比较少,很简洁。对于图片的处理也比较优雅。哈哈哈哈哈哈哈哈说的太闷骚了
废话不多说,开干吧。刚吧嘚
首先pom导入itext 7大礼包:
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId
最近工作中用到了pdf模板填充的功能,主要的应用场景是生成各种协议已经合同,需要对文件中进行一些已知信息的填充以及加盖印章。本章节主要讲解是如何使用Adobe Acrobat Pro DC设置模板文件,已经其中的一些注意事项。整个流程分为3大步骤:
采用Adobe Acrobat Pro DC 设置合同模板
填充已经设置好的模板
设置印章位置
第一步、使用Adobe Acrobat Pro ...
直接开始需要两个jar包 itext-asian-5.2.0.jar和 itextpdf-5.5.6.jar ,我的业务逻辑可能比较复杂,在这里我就简单的提供一个demo ,需要的人自己按照自己的业务逻辑来改。
首先我们要用 Adobe Acrobat 来编辑pdf
简单讲讲思路
1 .读取到要填充的pdf 地址
2. 然后转成PdfReader对象,代表一个pdf
3. 然后转成PdfStam...
项目中有个需求,对于已有的数据生成对应的发票pdf或者合同pdf,这些pdf具有一些特性,就是pdf有固定的格式,类似于表格,我们只要往表格里面填充数据即可。当然,也会涉及到签章,二维码等需求。
总体思路:
1.得到需要生成的pdf的初始模板,包含格式,只是不含数据
2.使用工具Adobe Acrobat,编辑pdf模板,在对应区域生成文本域,每个域都有自己的name
3.java中使用itext...
用word导出
pdf文件格式
在线生成
pdf模板文件表单,网址:https://www.
pdfescape.com上传刚刚保存的
pdf文件在下拉中选择自己需要的类型选中文本框点击鼠标右键选择 object Properties
在name框中输入你要
填充的字段名称,其他请根据自身需要选择,做完表单
模板后点击
下载该
模板。
3. 使用iText来
填充表单,在pom文件中加入
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
下面简单的整理几个操作pdf相关实例。
1.PDF模版填充
首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模...
之前我写的第一篇文章就是关于我给客户开发一个自动生成pdf报表的程序,之后得到的报表在我的电脑上一切如常,但是用email发给他之后,所有填充的数据就木有了。我之后从iTextPdf从5升级到了7,然后发给我自己的邮箱进行测试。觉得问题解决了,完全木有问题。但是客户休假回来,看到了我发的报表,一句开头的sorry,我的心就又悬起来啦,他还是只收到了没有数据的pdf template。
到底是什么问题,经过我发邮件给几个同事做实验,我发现用新版的MS E’dge,Chrome,或是teams直接打开都没有问题
java使用itext填充pdf模板1、先去建一个Word文件,设置好想要填充的地方,留好位置,设置好下划线2、将Word另存为pdf3、打开电脑中的Adobe Acrobat pro DC(这个应该win10 都有,搜索一下就出来了),点击 文件→创建→创建表单4、然后导入刚刚生成的pdf会出来这个页面双击这个阴影部分,将名称改成你要设置的名称,后面要根据这个名称来给他赋值全部设置好以后就可以另存为了5、前期的pdf模板准备好了,就开始上代码!1、首先导入我们所需要的依赖
1、先去建一个Word文件,设