对pdf 表单域 或文本框的操作---动态填充PDF 文件内容
前提:需要pdf模板:并且模板内容以pdf 文本框的形式填写
package com.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
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 com.itextpdf.text.pdf.parser.PdfTextExtractor;
public class PdfTest {
@Test
public void testPdf() {
String inputFileName = "certificateModel.pdf";
String outputFileName = "833257_out.pdf";
OutputStream os = null;
PdfStamper ps = null;
PdfReader reader = null;
try {
os = new FileOutputStream(new File(outputFileName));
// 2 读入pdf表单
reader = new PdfReader(inputFileName);
// 3 根据表单生成一个新的pdf
ps = new PdfStamper(reader, os);
// 4 获取pdf表单
AcroFields form = ps.getAcroFields();
// 5给表单添加中文字体 这里采用系统字体。不设置的话,中文可能无法显示
// BaseFont bf = BaseFont.createFont("C:/Windows/Fonts/SIMYOU.TTF",
// BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// 方法二:使用iTextAsian.jar中的字体
// BaseFont baseFont =
// BaseFont.createFont("STSong-Light",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
BaseFont bf = BaseFont.createFont("d:/user/80004194/desktop/test/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(bf);
// 6查询数据================================================
Map<String, Object> data = new HashMap<String, Object>();
data.put("empName", "金星");
data.put("empNumber", "束带结发看电视");
data.put("empCompany", "顺丰科技");
data.put("empDepartment", "飞行部747");
data.put("empTrainingCenter", "顺丰安全中心");
data.put("empDateOfIssue", "2019-12-3");
data.put("empCertificateNo", "20190100833257");
data.put("empApprovalNo_2019", "ZN-TP-CSS-20180002");
data.put("empTrainingDate_2019", "2019-11-3");
data.put("empCategory_2019", "初训");
data.put("empResult_2019", "合格");
data.put("empSignature_2019", "露西");
//data.put("answer", "张三");
// 7遍历data 给pdf表单表格赋值
for (String key : data.keySet()) {
form.setField(key, data.get(key).toString());
}
ps.setFormFlattening(true);
System.out.println("===============PDF导出成功=============");
} catch (Exception e) {
System.out.println("===============PDF导出失败=============");
e.printStackTrace();
} finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Test
public void readPdf(){
String outputFileName = "2019_833257_out.pdf";
OutputStream os = null;
PdfStamper ps = null;
PdfReader reader = null;
PdfReader modelReader = null;
String inputFileName = "833257.pdf";
String modelUrl="certificateModel.pdf";
String pageContent="";
try {
os = new FileOutputStream(new File(outputFileName));
// 2 读入pdf表单
reader = new PdfReader(inputFileName);
modelReader = new PdfReader(modelUrl);
// 3 根据表单生成一个新的pdf
ps = new PdfStamper(modelReader, os);
// 4 获取pdf表单
AcroFields form = ps.getAcroFields();
BaseFont bf = BaseFont.createFont("d:/user/80004194/desktop/test/SIMYOU.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
form.addSubstitutionFont(bf);
//读取pdf数据
int pageNum = reader.getNumberOfPages();
for(int i=1;i<=pageNum;i++){
pageContent = PdfTextExtractor.getTextFromPage(reader, i);
}
Map<String, Object> data = new HashMap<String, Object>();
String[] content=pageContent.split("\n");
//获取所有的培训记录页:
List<String> record=new ArrayList<String>();
String empName="";
String empNumber="";
String empCompany="";
String empDepartment="";
String empTrainingCenter="";
String empDateOfIssue ="";
String empCertificateNo ="";
for(int i =0; i<content.length;i++){
if(content[i].contains("工号")){
String[] empNameAndNumber =content[i].split(" ");
empName = empNameAndNumber[1];
empNumber = empNameAndNumber[3];
}else if(content[i].contains("工作单位")){
String[] empCompanys =content[i].split(" ");
empCompany =empCompanys[1];
}else if(content[i].contains("工作部门")){
String[] empDepartments =content[i].split(" ");
empDepartment = empDepartments[1];
}else if(content[i].contains("培训机构")){
String[] empTrainingCenters =content[i].split(" ");
empTrainingCenter = empTrainingCenters[1];
}else if(content[i].contains("发证日期")){
String[] empDateOfIssues =content[i].split(" ");
empDateOfIssue = empDateOfIssues[1];
}else if(content[i].contains("证书编号")){
String[] empCertificateNos =content[i].split(" ");
empCertificateNo = empCertificateNos[1];
}else if((content[i].contains("初训") || content[i].contains("复训")) && !content[i].contains("有效期")){
record.add(content[i]);
}
}
data.put("empName", empName);
data.put("empNumber", empNumber);
data.put("empCompany", empCompany);
data.put("empDepartment", empDepartment);
data.put("empTrainingCenter", empTrainingCenter);
data.put("empDateOfIssue", empDateOfIssue);
data.put("empCertificateNo", empCertificateNo);
//写入历史详情数据
if(record.size()>0){
for (int i = 0; i < record.size(); i++) {
String[] records=record.get(i).split(" ");
data.put("empApprovalNo_"+(2019+2*i),records[0]);
data.put("empTrainingDate_"+(2019+2*i), records[1]);
data.put("empCategory_"+(2019+2*i),records[2]);
data.put("empResult_"+(2019+2*i), records[3]);
data.put("empSignature_"+(2019+2*i), records[4]);
}
}
//写入新的数据
data.put("empApprovalNo_"+2021, "ZN-GD-TP-0073");
data.put("empTrainingDate_"+2021, "2019-1-21");
data.put("empCategory_"+2021, "复训");
data.put("empResult_"+2021, "优秀");
data.put("empSignature_"+2021, "Jack");
//替换数据
for (String key : data.keySet()) {
form.setField(key, data.get(key).toString());
}
ps.setFormFlattening(true);
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
ps.close();
reader.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
对pdf 表单域 或文本框的操作---动态填充PDF 文件内容的更多相关文章
- HTML中让表单input等文本框为只读不可编辑但可以获取value值的方法;让文本域前面的内容显示在左上角,居中
HTML中让表单input等文本框为只读不可编辑的方法 有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使input text的内容,中国两个字不可以修改 有时候,我们希望 ...
- Java 创建、填充PDF表单域
表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...
- js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符
js中对arry数组的各种操作小结 最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...
- PDF表单域(FormField)在HTML显示与提交数据到服务器
1.Adobe Arobat Pro等可以编辑表单域,只有几种控件: 2.展示PDF,可用PdfObject.js,Chrome自带? @{ViewBag.Title = @ViewBag.aaa;} ...
- Jquery学习笔记:操作form表单元素之一(文本框和下拉框)
一.概述 在web页面开发中,经常需要获取和设置表单元素的值(如文本框中的内容),特别是在ajax应用中,更是常态.本文系统的介绍下如何操作. 同操作其它html元素一样,操作的过程差不多. 第一步, ...
- JQuery基础原理 与实例 验证表单 省市联动 文本框判空 单选 复选 判空 下拉判空 确认密码判等
JQuery 基础原理 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- HTML中让表单input等文本框为只读不可编辑的方法
有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...
- 让表单input等文本框为只读不可编辑的方法-转
有时候,我们希望表单中的文本框是只读的,让用户不能修改其中的信息,如使<input type="text" name="input1" value=&qu ...
- Form表单之复选框checkbox操作
input复选(checkbox): <label>input复选1组:</label> <input type="checkbox" name=&q ...
随机推荐
- 【csp模拟赛1】T1 心有灵犀
[题目描述] 爱玩游戏的小 Z 最近又换了一个新的游戏.这个游戏有点特别,需要两位玩 家心有灵犀通力合作才能拿到高分. 游戏开始时,两位玩家会得到同一个数字 N,假设这个数字共有 t 位数码, 然后两 ...
- mac使用php-version切换PHP版本
在开发过程中,有时候我们的程序对某个php版本有着极为重要的限制,特别是大型项目. 因此,我们就需要切换多个php版本来满足我们的需求. 我们使用php-version来达到这个目的. 首先我们先使用 ...
- mac使用brew安装mysql报RROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
使用mac安装mysql安装完后运行 mysql -uroot -p 报了 ERROR 2002 (HY000): Can't connect to local MySQL server throug ...
- 【SecureCRT】SecureCRT 护眼配色
终端有一个好的配色,不仅能保护自己的眼睛,也能给人一个好心情,本配色方案适合任意一种SSH客户端软件. 设置背景颜色 Options => Sessions options => ...
- MIME协议(二)
MIME协议 RFC822文档定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片.声音 ...
- HDU 1024 Max Sum Plus Plus ——(M段区间的最大和)
感觉有点奇怪的是这题明明是n^2的复杂度,n=1e6竟然能过= =.应该是数据水了. dp[i][j]表示前j个数,分成i段,且最后一段的最后一个为a[j]的答案.那么转移式是:dp[i][j] = ...
- Python2.x 里解决中文编码的万能钥匙
注意: Python2.x默认编码环境是ASCII,当和取回的数据编码格式不一致时,可能会造成乱码:我们可以指定保存内容的编码格式,一般情况下,我们可以在代码最上方添加 import sys relo ...
- Bootstrap视频教程
一.全局CSS样式 0.课件 001.概览_栅格系统 2.排版和代码 3.表格和按钮 4.表单 5.图片 6.辅助类 7.响应式工具 二.组件 8.图标_下拉菜单_按钮组 9.输入框组 10.导航 1 ...
- Fragment 和Activity的数据传递实例代码
package com.example.fragment; import android.os.Bundle; import android.support.v4.app.FragmentActivi ...
- manifest节点
xmlns:android属性——定义命名空间 这个属性定义了这个XML文件所使用的命名空间.如果需要指定特殊的命名空间,就需要手动编写代码,在Android Studio基本格式如下: xmlns: ...