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 [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下面有很多字体可以使用)

时间: 2024-12-24 01:55:26

Java iText使用PDF模板生成PDF文档的相关文章

使用模板生成word文档

使用poi-tl根据模板生成word文档,在porm.xml中添加poi-tl依赖,直接上代码 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.render.RenderAPI; import com.thinkge

java通过word模板生成word文档

介绍 上次公司项目需要一个生成word文档的功能,有固定的模板根据业务填充数据即可,由于从来没做过,项目也比较着急于是去网上找有没有合适的工具类,找了好几种,看到其中有freeMark模板生成比较靠谱于是采用这个,正常生成成功了还挺高兴的于是修改优化部署测试,出问题了,由于我一直使用wps可以正常打开,但是同事使用office打不开,于是各种查找原因都没好,于是只能转变思路又试了两种还是不好用,直到发现这款模板生成 poi-tl 真的做的很不错,而且是国人写的,关于学习这个东西还是看官方文档的好

读thinking in java的收获(二) --eclipse生成javadoc文档

最开始学习java语言的时候学过生成javadoc不过当时只是用windows命令行生成.读了这里的javadoc温故而知新发现其实我们做的项目就用到了一些注释,只是没有用eclipse 生成这份文档,通过查阅,最终补全了这份知识. 一.书中的代码: <pre name="code" class="java">//:object/HelloDate.java package unit2; import java.util.Date; /** * The

JAVA如何在eclipose中生成帮助文档

JAVA中注释有三种   1 单行注释 //+内容      2 多行注释  /* 内容 */  3 文档注释  /**内容*/       其中单行注释和多行注释是用于方法里面的注释 ,文档注释是用来注释类的成员和方法.   帮助文件是用多行注释实现的,用的程序是JAVA中jdk目录下bin目录JAVAdoc.exe. 首先 打开eclipose,找到一个需要生成帮助文档的工程.工程里面的类都是用多行注释标记了方法和属性的.比如 package java4_10; /** * * @autho

java itextpdf使用HTML模板生成pdf文件,并设置table

我们这里是maven项目,导入相应jar包: <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> <dependency> <groupId>com.itextpdf</groupId>

Java实现web在线预览office文档与pdf文档实例

https://yq.aliyun.com/ziliao/1768?spm=5176.8246799.blogcont.24.1PxYoX 摘要: 本文讲的是Java实现web在线预览office文档与pdf文档实例, 1.首先我们需要找到可以把office转换成pdf的方法,查找资料发现有openoffice这一软件可以把office转换成pdf,这一软件先下载下来,然后记住自己安装的在那个位置.然后在cmd环境下进入安装目录的program目 云计算 云服务器ECS 大数据 建站 备案 文档

Java Web项目中使用Freemarker生成Word文档

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的内容放上${}占位符,就可以使用像Freemarker这样的模板引擎将出现占位符的地方替换成真实数据,这种方式较之其他的方案要更为简单. 下面举一个简单的例子,比如在Web页面中填写个人简历,然后点击保存下载到本地,效果图如下所示. 打开下

java使用freemarker 生成word文档

java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----feemarker基于word模板的导出方式, 这种方式非常简单而且导出的样式美观, 其原理就是先做一个word模板, 该模板中变量数据用${xxx}这种方式填写, 然后再导出时只需读取模板然后用相应的数据替换其中的${xxx}即可. 一,简单模板导出(不含图片, 不含

java通过freemarket生成word文档

1.使用freemarker的原因是:由于POI和ITEXT在处理复杂word文档格式时欠缺,尤其在生成WORD文档时,(其他处理word的工具需要动态加载windows动态链接库,有些还要收费),并且需求要在WORD指定位置插入图片,所以在参考了POI和ITEXT官网处理WORD和网络上其他处理WORD的工具后,发现freemarker可以通过设定WORD模板,经过处理生成ftl文件后,可直接通过freemarker的工具jar包可以生成指定位置的WORD文件.(不过用模板生成有个别缺点,一是