Java iText使用PDF模板生成PDF文档

Posted 一枪尽骚丶魂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java iText使用PDF模板生成PDF文档相关的知识,希望对你有一定的参考价值。

我们系统需要生成一个可以打印的PDF文档,老板给了我一个Word文档,按照这个Word文档的格式生成PDF文档。

第一步:下载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 chisj@foxmail.com
 *@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 chisj@foxmail.com
 *@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 chisj@foxmail.com
 *@Date: 2016年4月26日下午7:43:31
 *@Version V1.0
 */
package org.csun.ns.entity;
 
/**
 *@ClassName: Ticket
 *@Description: TODO
 *@Author: chisj chisj@foxmail.com
 *@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 chisj@foxmail.com
 *@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 chisj@foxmail.com
 *@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下面有很多字体可以使用)

以上是关于Java iText使用PDF模板生成PDF文档的主要内容,如果未能解决你的问题,请参考以下文章

java根据模板动态生成PDF

java根据模板HTML动态生成PDF

如何运用Java组件itext生成pdf

如何运用Java组件itext生成pdf

java中怎么利用poi和itext生成pdf文档

Java IText 生成PdF文档怎样设置黑体字体