java itext根据模板生成pdf

很久没有更新过了,稍微闲一点,顺势总结下N久之前用到的小技巧。

这里生成pdf主要使用itext.jar。如想生成一个pdf,其实很简单的啦!第一种:全部使用代码生成;第二种:根据pdf模板生成。当前,个人还是偏向第二种。

使用工具

1.Adobe Acrobat软件(制作pdf模板)

2.iText.jar

3.iTextAsian.jar(解决中文输出问题)

pdf模板

使用ADobe Acrobat软件制作一个简易的pdf模板,效果如下:

注:pdf模板中的文本域(xm、pxxj、rq)是为后期填充数据做准备,其中,若发现填充数据之后数据显示不全,或不显示,可重新制作文本域,或文本框设置大一点即可(使数据能完全填充进去)。

import java.io.ByteArrayOutputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.util.ArrayList;  
import java.util.HashMap;  
import java.util.Map;  
 
import com.lowagie.text.DocumentException;  
import com.lowagie.text.pdf.AcroFields;  
import com.lowagie.text.pdf.BaseFont;  
import com.lowagie.text.pdf.PdfContentByte;  
import com.lowagie.text.pdf.PdfReader;  
import com.lowagie.text.pdf.PdfStamper;  
 
public class Test {  
   public static void main(String[] args) throws Exception {  
       test();  
       System.out.println("success");  
   }  
     
   public static void test() throws IOException, DocumentException { 
       // pdf模板 
       String fileName = "D:/test.pdf";  
       PdfReader reader = new PdfReader(fileName);  
       ByteArrayOutputStream bos = new ByteArrayOutputStream();  
       /* 将要生成的目标PDF文件名称 */   
       PdfStamper ps = new PdfStamper(reader, bos);  
       PdfContentByte under = ps.getUnderContent(1);     
         
         /* 使用中文字体 */    
       BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);  
       ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();  
       fontList.add(bf);  
         
       /* 取出报表模板中的所有字段 */    
       AcroFields fields = ps.getAcroFields();  
       fields.setSubstitutionFonts(fontList);  
       fillData(fields, data());  
         
       /* 必须要调用这个,否则文档不会生成的 */    
       ps.setFormFlattening(true);  
       ps.close();  
         
       //生成pdf路径  
       OutputStream fos = new FileOutputStream("D:/result.pdf");  
       fos.write(bos.toByteArray());  
       fos.flush();  
       fos.close();  
       bos.close();  
   }  
 
   /**
    * 填充模板
    * */
   public static void fillData(AcroFields fields, Map<String, String> data)  
           throws IOException, DocumentException {  
       for (String key : data.keySet()) {  
           String value = data.get(key);  
           fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的  
       }  
   }  
 
   /**
    * 填充数据源
    * 其中data存放的key值与pdf模板中的文本域值相对应
    * */
   public static Map<String, String> data() {  
       Map<String, String> data = new HashMap<String, String>();  
       data.put("xm", "李磊");  
       data.put("pxsj", "2018年1月12日-2018年5月12日");  
       data.put("rq", "2018年5月18日");  
       return data;  
   }  
}  

效果

生成pdf效果如下所示:

样式不好看,重在生成pdf的方法。俗话说:好记性不如烂笔头,以此方法记录,以后回顾也方便!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值