對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();
}
}
}


}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM