需要工具

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

使用itext填充表单制作pdf,需要 itext 的jar包,itextpdf 开始使用的是 5.5.13 但存在bug,后面降到使用5.5.3解决问题,具体见“遇到的坑”。

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

制作pdf表单

需要使用软件 Acrobat Pro 制作表单,文字的大小和格式也可以使用该软件设置

填充表单代码

表单内容包括文本和图片

填充表单代码和插入图片(比如签名)

public static void commonFillPdfForm(Map<String, String> formMap, String templatePath, String outputFilePath,String signatureString) {//生成的新文件路径PdfReader reader;FileOutputStream out;ByteArrayOutputStream bos;PdfStamper stamper;Document doc = new Document();try {createDirectory(outputFilePath);//输出流out = new FileOutputStream(outputFilePath);//读取pdf模板reader = new PdfReader(templatePath);bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();form.addSubstitutionFont(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));java.util.Iterator<String> it = form.getFields().keySet().iterator();while (it.hasNext()) {String name = it.next().toString();if(StringUtils.isBlank(formMap.get(name))){continue;}form.setField(name, formMap.get(name));//处理 checkboxint type = form.getFieldType(name);System.out.println("key:" + name + ", type:" + type);if(type == 2){//注意版本问题,这个true必填,否则会变成x; 或者使用较低版本//form.setField(name, "On", true);//form.setField(name, formMap.get(name), true);form.setField(name, formMap.get(name));}}//处理签名if (StringUtils.isNotBlank(signatureString)) {// 通过域名获取所在页和坐标,左下角为起点int pageNo = form.getFieldPositions("sign").get(0).page;Rectangle signRect = form.getFieldPositions("sign").get(0).position;// 读图片BASE64Decoder decoder = new BASE64Decoder();Image image = Image.getInstance(decoder.decodeBuffer(signatureString));// 获取操作的页面PdfContentByte under = stamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(signRect.getLeft(), signRect.getBottom());under.addImage(image);}//如果为false那么生成的PDF文件还能编辑,一定要设为truestamper.setFormFlattening(true);stamper.close();PdfCopy copy = new PdfCopy(doc, out);doc.open();PdfImportedPage importPage;for(int i = 1; i <= reader.getNumberOfPages(); i++) {importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);copy.addPage(importPage);}doc.close();} catch (Exception e) {logger.error("error",e);}}

pdf内容勾选

上面代码中表单处理打勾场景

fields.setField(key, “On”, true); 

遇到的坑

  1. 中文乱码
    通过使用 text-asian 包解决中文问题,但发现仍不好使,怀疑是 Acrobat Pro 版本的问题,于是下载了一个新版本解决中文乱码。
  2. itextpdf 包的bug
    当时为了实现打勾的功能出现问题:勾形变成了打叉。查了下是版本问题,于是将itext的版本降到 5.5.3解决,参考:https://ithelp.ithome.com.tw/articles/10193321
方式一:(该方式对我没起作用)
fields.SetField(item.Key, item.Value, true);方式二:降低版本
5.5.4 以前的版本都正常,
5.5.5 開始出現此問題,但此版本沒有 saveAppearance 參數可以解決此問題,
5.5.7 之後才有 saveAppearance 參數,
所以除了 5.5.5 和 5.5.6 之外的版本都可以使用此方法解決此問題。

参考资料

Itext填写pdf中的复选框对勾问题解决

itext 填充PDF表单相关推荐

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

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

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

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

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

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

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

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

  5. python 自动填充表单,如何在Django / Python中自动填充PDF表单?

    I have PDF forms that I want to autopopulate with data from my Django web application and then offer ...

  6. java使用itext填充pdf模板,超简单教学,有手就行

    java使用itext填充pdf模板 1.先去建一个Word文件,设置好想要填充的地方,留好位置,设置好下划线 2.将Word另存为pdf 3.打开电脑中的Adobe Acrobat pro DC(这 ...

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

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

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

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

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

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

最新文章

  1. TCP性能和发送接收Buffer的关系
  2. pandas使用isin函数和all函数判断dataframe特定数列中是否包含指定列表中的全部内容
  3. 40年诞生7位诺奖得主,美国贝尔实验室做对了什么?
  4. android frida 检测_frida测试方法整理
  5. Android日期分组,按查询分组在列表视图android中显示一些意...
  6. CALL TRANSACTION 小节
  7. boost::log模块实现将日志记录初始化到远程 syslog 服务器
  8. Apache 配置虚拟目录、主机的疑惑及解决
  9. .net数据源控件绑定mysql_数据源控件与数据绑定控件的进一步简单讨论(1)
  10. Eugeny and Array(水题,注意题目描述即可)
  11. 青岛西海岸惠普大数据_青岛西海岸新区用好卫星大数据 为城市治理全面赋能...
  12. 顶级分布式开源项目,配上这款可视化工具,真香!
  13. 关于mybatis的association和collection主键映射问题
  14. intellij idea主题
  15. 基于NTT的循环码:RS码、BCH码、RM码
  16. 服务器网站gzip压缩,网站实现Gzip网页压缩的方法与步骤 提高网页浏览速度
  17. vi/vim显示行号
  18. pdf 转换为图片格式(可提高兼容性)
  19. https://pypi.tuna.tsinghua.edu.cn/packages/97/ae/0b08f53498417914f2274cc3b5576d2b83179b0cbb209457d0f
  20. GitHub Universe 2019 Keynote 回顾

热门文章

  1. 记录一次被挖矿的惨痛经历
  2. logback - 自定义日志脱敏组件,一种不错的脱敏方案
  3. 码农翻身——JDBC的诞生
  4. 【电子学会】2021年06月图形化二级 -- 小瓢虫找妈妈
  5. 32位系统能够识别多达内存_向多达17位用户学习
  6. 线下python培训班哪个好
  7. Microsoft Office for Mac最新版本安装教程。
  8. 自从用了这个刷步神器,我妈以为我每天都在跑马拉松
  9. 在html中怎么设置页面边距,在打印网页时怎么设置调整页边距
  10. 传递函数的离散化(以一阶低通RC滤波器为例)