java在原有pdf模板上添加文字重新生成pdf

公司最近需要实现pdf套打功能,翻了很多资料,发现坑巨多,一个一个的填坑。

首先,需要你需要下载一个adobe acrobat,,不是阅读器,是一个很大的adobe的工具箱大概有500M,下载好了以后需要把套打的pdf上面添加表单元素,itext.jar可以读取到这些表单元素,从而完成填充。怎么添加表单,自行百度一下就O了。

下面贴demo的代码,很多也是copy而来的。


public static void main(String args[]) throws ParseException, Exception{

    // 模板路径  
     String templatePath = "D:/workSpaceNew/Ylbj/WebRoot/mm.pdf";  
     // 生成的新文件路径  
     String newPDFPath = "E:/pdf/mmm.pdf";  
     PdfReader reader;  
     FileOutputStream out;  
     ByteArrayOutputStream bos;  
     PdfStamper stamper;  
     try {  
         out = new FileOutputStream(newPDFPath);// 输出流  
         reader = new PdfReader(templatePath);// 读取pdf模板  
         bos = new ByteArrayOutputStream();  
         stamper = new PdfStamper(reader, bos);  
         AcroFields form = stamper.getAcroFields(); 
//      BaseFont bf  = BaseFont.createFont("/SIMYOU.TTF", BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);   
         BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",    BaseFont.EMBEDDED); 
//      BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);  
// BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//       Font font = new Font(bf, 12, Font.NORMAL); 
         form.addSubstitutionFont(bf);
         
         int i = 0;  
         java.util.Iterator it = form.getFields().keySet().iterator();  
         while (it.hasNext()) {  
             String name = it.next().toString();  
             System.out.println(name);  
             form.setFieldProperty(name,"textfont",bf,null); 
             String html = "ccc";
             form.setField(name, html); 
         }  
         stamper.setFormFlattening(false);// 如果为false那么生成的PDF文件还能编辑,一定要设为true  
         stamper.close();  


         Document doc = new Document();  
         PdfCopy copy = new PdfCopy(doc, out); 
         doc.open();  
//         
//         PdfPTable table = new PdfPTable(3);
//         table.setWidthPercentage(100); 
//         PdfPCell cell1 = new PdfPCell(new Phrase("Cell 1"));
//         cell1.setUseBorderPadding(true);
//         cell1.setBorderWidth(200f);
//         cell1.setBorderColor(BaseColor.BLUE);
//         table.addCell(cell1);
//         
//         PdfPCell cell2 = new PdfPCell(new Phrase("Cell 2"));
//         cell2.setUseBorderPadding(true);
//         cell2.setBackgroundColor(BaseColor.GRAY);
//         
//         cell2.setBorderWidthTop(200f);
//         cell2.setBorderColorTop(BaseColor.RED);
//         cell2.setBorderColorRight(BaseColor.GREEN);
//         cell2.setBorderColorBottom(BaseColor.BLUE);
//         cell2.setBorderColorLeft(BaseColor.BLACK);
//         table.addCell(cell2);
//         
//         PdfPCell cell3 = new PdfPCell(new Phrase("Cell 3"));
//         cell3.setUseBorderPadding(true);
//         cell3.setBorderWidthTop(2f);
//         cell3.setBorderWidthRight(1f);
//         cell3.setBorderWidthBottom(2f);
//         cell3.setBorderWidthLeft(1f);
//         table.addCell(cell3);
//        // table.completeRow();
//         doc.add(table);
         
         PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);  
         copy.addPage(importPage);  
         doc.close();  


     } catch (IOException e) {  
     } catch (DocumentException e) {  
     } }


其中踩了几个坑,就是这里

         BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",    BaseFont.EMBEDDED); 
//      BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);  

// BaseFont bf = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

第一次我写这个的时候,并没设置字体,然后生成的pdf打不开,应该是报错了。然后度娘说,因为在抠那个模板的时候,表单元素使用的是宋体中文(添加表单元素里面的属性默认的就是中文),所以打pdf时候会报错。于是乎添加上了以上代码,但是,画重点:BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",    BaseFont.EMBEDDED); 我使用的时候发现添加了这个依然没用,就是报错,然后就用了下面那个使用电脑本地自带的语言库,,然后发现o了,能生成了。

然后我又度娘了一番,发现有可能是因为没有引入语言类包itext-asian。jar包导致的,- -因为写的demo,也不知道需要哪些jar。然后添加上去以后发现还是不行,再一百度,发现,有可能是因为版本的问题,之前使用的itextpdf-5.5.8.jar,语言类包使用的是5.1.1版本的。然后换了一个jar,,OK了,,就生成了,,

然后后面需求还需要在套打的pdf模板上添加表格,写了代码发现并没出现在生成的pdf上,这个下次更新应该会有解决办法


你可能感兴趣的:(java在原有pdf模板上添加文字重新生成pdf)