Java iText使用PDF模板生成PDF文档
REF: https://blog.****.net/u012377333/article/details/51264122
第一步:下载AdobeAcrobat DC,必须使用这个来制作from域。
第二步:使用AdobeAcrobat DC将Word导成PDF文档。
第三步:由于还要加水印的效果,所以还是使用AdobeAcrobat DC来添加水印,非常方便;
添加水印的方法:使用AdobeAcrobat DC打开PDF文档,“工具”-》“编辑PDF”-》”水印”-》”添加”
添加水印的操作:
点击“确定”:
第四步:使用AdobeAcrobat DC添加From域;
添加From域方法:使用AdobeAcrobat DC打开文档,“工具”-》“准备表单”
点击“开始”:
点击“保存”:
添加“文本域”到我们想要添加内容的位置:
第五步:使用Java代码导出PDF文档;
主要三个类:功能类-PDFTempletTicket
- /**
- *@Title: PDFTempletTicket.java
- *@Package: org.csun.ns.util
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月27日上午11:29:52
- *@Version V1.0
- */
- package org.csun.ns.util;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.util.ArrayList;
- import org.csun.ns.entity.Ticket;
- import com.itextpdf.text.pdf.AcroFields;
- import com.itextpdf.text.pdf.BaseFont;
- import com.itextpdf.text.pdf.PdfReader;
- import com.itextpdf.text.pdf.PdfStamper;
- /**
- *@ClassName: PDFTempletTicket
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月27日上午11:29:52
- */
- public class PDFTempletTicket {
- privateString templatePdfPath;
- privateString ttcPath;
- privateString targetPdfpath;
- privateTicket ticket;
- publicPDFTempletTicket() {
- super();
- }
- publicPDFTempletTicket(String templatePdfPath, String ttcPath,
- StringtargetPdfpath, Ticket ticket) {
- this.templatePdfPath= templatePdfPath;
- this.ttcPath= ttcPath;
- this.targetPdfpath= targetPdfpath;
- this.ticket= ticket;
- }
- publicvoid templetTicket(File file) throws Exception {
- PdfReaderreader = new PdfReader(templatePdfPath);
- ByteArrayOutputStreambos = new ByteArrayOutputStream();
- PdfStamperps = new PdfStamper(reader, bos);
- /*使用中文字体 */
- BaseFontbf = BaseFont.createFont(PDFTicket.class.getResource("/") +"org/csun/ns/util/simsun.ttc,1",
- BaseFont.IDENTITY_H,BaseFont.EMBEDDED);
- ArrayList<BaseFont> fontList = newArrayList<BaseFont>();
- fontList.add(bf);
- AcroFieldss = ps.getAcroFields();
- s.setSubstitutionFonts(fontList);
- s.setField("ticketId",ticket.getTicketId());
- s.setField("ticketCreateTime",ticket.getTicketCreateTime());
- s.setField("ticketCompany",ticket.getTicketCompany());
- s.setField("sysName",ticket.getSysName());
- s.setField("moneyLittle",ticket.getMoneyLittle());
- s.setField("moneyBig",ticket.getMoneyBig());
- s.setField("accountCompany",ticket.getAccountCompany());
- s.setField("bedNumber",ticket.getBedNumber());
- s.setField("username",ticket.getUsername());
- s.setField("password",ticket.getPassword());
- ps.setFormFlattening(true);
- ps.close();
- FileOutputStreamfos = new FileOutputStream(file);
- fos.write(bos.toByteArray());
- fos.close();
- }
- /**
- * @return the templatePdfPath
- */
- publicString getTemplatePdfPath() {
- returntemplatePdfPath;
- }
- /**
- * @param templatePdfPath the templatePdfPathto set
- */
- publicvoid setTemplatePdfPath(String templatePdfPath) {
- this.templatePdfPath= templatePdfPath;
- }
- /**
- * @return the ttcPath
- */
- publicString getTtcPath() {
- returnttcPath;
- }
- /**
- * @param ttcPath the ttcPath to set
- */
- publicvoid setTtcPath(String ttcPath) {
- this.ttcPath= ttcPath;
- }
- /**
- * @return the targetPdfpath
- */
- publicString getTargetPdfpath() {
- returntargetPdfpath;
- }
- /**
- * @param targetPdfpath the targetPdfpath toset
- */
- publicvoid setTargetPdfpath(String targetPdfpath) {
- this.targetPdfpath= targetPdfpath;
- }
- /**
- * @return the ticket
- */
- publicTicket getTicket() {
- returnticket;
- }
- /**
- * @param ticket the ticket to set
- */
- publicvoid setTicket(Ticket ticket) {
- this.ticket= ticket;
- }
- }
数据类-Ticket
- /**
- *@Title: Ticket.java
- *@Package: org.csun.ns.entity
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月26日下午7:43:31
- *@Version V1.0
- */
- package org.csun.ns.entity;
- /**
- *@ClassName: Ticket
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月26日下午7:43:31
- */
- public class Ticket {
- privateString ticketId;
- privateString homesId;
- privateString ticketCreateTime;
- privateString ticketCompany;
- privateString sysName;
- privateString moneyLittle;
- privateString moneyBig;
- privateString accountCompany;
- privateString bedNumber;
- privateString username;
- privateString password;
- publicTicket() {
- super();
- }
- publicTicket(String ticketId, String homesId, String ticketCreateTime,
- StringticketCompany, String sysName, String moneyLittle,
- StringmoneyBig, String accountCompany, String bedNumber,
- Stringusername, String password) {
- this.ticketId= ticketId;
- this.homesId= homesId;
- this.ticketCreateTime= ticketCreateTime;
- this.ticketCompany= ticketCompany;
- this.sysName= sysName;
- this.moneyLittle= moneyLittle;
- this.moneyBig= moneyBig;
- this.accountCompany= accountCompany;
- this.bedNumber= bedNumber;
- this.username= username;
- this.password= password;
- }
- /**
- * @return the ticketId
- */
- publicString getTicketId() {
- returnticketId;
- }
- /**
- * @param ticketId the ticketId to set
- */
- publicvoid setTicketId(String ticketId) {
- this.ticketId= ticketId;
- }
- /**
- * @return the homesId
- */
- publicString getHomesId() {
- returnhomesId;
- }
- /**
- * @param homesId the homesId to set
- */
- publicvoid setHomesId(String homesId) {
- this.homesId= homesId;
- }
- /**
- * @return the ticketCreateTime
- */
- publicString getTicketCreateTime() {
- returnticketCreateTime;
- }
- /**
- * @param ticketCreateTime the ticketCreateTimeto set
- */
- publicvoid setTicketCreateTime(String ticketCreateTime) {
- this.ticketCreateTime= ticketCreateTime;
- }
- /**
- * @return the ticketCompany
- */
- publicString getTicketCompany() {
- returnticketCompany;
- }
- /**
- * @param ticketCompany the ticketCompany toset
- */
- publicvoid setTicketCompany(String ticketCompany) {
- this.ticketCompany= ticketCompany;
- }
- /**
- * @return the sysName
- */
- publicString getSysName() {
- returnsysName;
- }
- /**
- * @param sysName the sysName to set
- */
- publicvoid setSysName(String sysName) {
- this.sysName= sysName;
- }
- /**
- * @return the moneyLittle
- */
- publicString getMoneyLittle() {
- returnmoneyLittle;
- }
- /**
- * @param moneyLittle the moneyLittle to set
- */
- publicvoid setMoneyLittle(String moneyLittle) {
- this.moneyLittle= moneyLittle;
- }
- /**
- * @return the moneyBig
- */
- publicString getMoneyBig() {
- returnmoneyBig;
- }
- /**
- * @param moneyBig the moneyBig to set
- */
- publicvoid setMoneyBig(String moneyBig) {
- this.moneyBig= moneyBig;
- }
- /**
- * @return the accountCompany
- */
- publicString getAccountCompany() {
- returnaccountCompany;
- }
- /**
- * @param accountCompany the accountCompany toset
- */
- publicvoid setAccountCompany(String accountCompany) {
- this.accountCompany= accountCompany;
- }
- /**
- * @return the bedNumber
- */
- publicString getBedNumber() {
- returnbedNumber;
- }
- /**
- * @param bedNumber the bedNumber to set
- */
- publicvoid setBedNumber(String bedNumber) {
- this.bedNumber= bedNumber;
- }
- /**
- * @return the username
- */
- publicString getUsername() {
- returnusername;
- }
- /**
- * @param username the username to set
- */
- publicvoid setUsername(String username) {
- this.username= username;
- }
- /**
- * @return the password
- */
- publicString getPassword() {
- returnpassword;
- }
- /**
- * @param password the password to set
- */
- publicvoid setPassword(String password) {
- this.password= password;
- }
- }
测试类-TestTempletTicket
- /**
- *@Title: TestTempletTicket.java
- *@Package: org.csun.ns.util
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月27日下午1:31:23
- *@Version V1.0
- */
- package org.csun.ns.util;
- import java.io.File;
- import org.csun.ns.client.OSSConfigure;
- import org.csun.ns.client.OSSUtil;
- import org.csun.ns.entity.Ticket;
- /**
- *@ClassName: TestTempletTicket
- *@Description: TODO
- *@Author: chisj [email protected]
- *@Date: 2016年4月27日下午1:31:23
- */
- public class TestTempletTicket {
- publicstatic void main(String[] args) throws Exception {
- Ticketticket = new Ticket();
- ticket.setTicketId("2016042710000");
- ticket.setTicketCreateTime("2016年4月27日");
- ticket.setTicketCompany("武汉日创科技有限公司");
- ticket.setSysName("智能看护系统");
- ticket.setMoneyLittle("50,000.00");
- ticket.setMoneyBig("伍万元整");
- ticket.setAccountCompany("洪山福利院");
- ticket.setBedNumber("500床位");
- ticket.setUsername("qiu");
- ticket.setPassword("123456");
- PDFTempletTicketpdfTT = new PDFTempletTicket();
- pdfTT.setTemplatePdfPath("D:\\ticket_from.pdf");
- pdfTT.setTargetPdfpath("D:\\aaabbbccc.pdf");
- pdfTT.setTicket(ticket);
- Filefile = new File("D:\\aaabbbccc.pdf");
- file.createNewFile();
- pdfTT.templetTicket(file);
- //OSSConfigureconfig = OSSUtil.getOSSConfigure();
- //OSSManageUtil.uploadFile(config, file, "aaabbbccc.pdf","pdf", "ticket/" + "aaabbbccc");
- //System.out.println("path = " + config.getAccessUrl());
- }
- }
导出来后的结果:
备注:导出PDF文档,From域的内容不可见问题;iText找不到字体;
问题1:我开始导出的From域内容看不到,将ps.setFormFlattening(true);设置为flase后,可以看到From域,还是看不到内容,我点击进入From后可以看到内容,该方法是将From域隐藏;后来看到有人设置From域内容的字体:BaseFontbf = BaseFont.createFont(PDFTicket.class.getResource("/") + "org/csun/ns/util/simsun.ttc,1",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
以及:
s.setSubstitutionFonts(fontList);
问题2:别人的代码:
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
会报找不到字体的错误,这里的解决方式就是通过使用自己的字体就好,simsun.ttc是Windows下面自带的字体(简体宋体:C:\Windows\Fonts下面有很多字体可以使用)