iText 操作Pdf 简单整理

转自:  https://zhuchengzzcc.iteye.com/blog/1603671

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

     下面简单的整理几个操作pdf相关实例。

1.PDF模版填充

     首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模版完成后的部分截图。



 

Java代码 

 收藏代码

  1. /** 
  2.  * @throws IOException 
  3.  * @throws DocumentException 
  4.  */  
  5. @SuppressWarnings("unchecked")  
  6. @Test  
  7. public void fillTemplate()  
  8.         throws IOException, DocumentException {  
  9.     PdfReader reader = new PdfReader(templateFile); // 模版文件目录  
  10.     PdfStamper ps = new PdfStamper(reader, new FileOutputStream(  
  11.             "f:/fillTemplate.pdf")); // 生成的输出流  
  12.     // ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  13.     // PdfStamper ps = new PdfStamper(reader, bos);  
  14.   
  15.     AcroFields s = ps.getAcroFields();  
  16.   
  17.     Map<String, Object> fieldMap = s.getFields(); // pdf表单相关信息展示  
  18.     for (Map.Entry<String, Object> entry : fieldMap.entrySet()) {  
  19.         String name = entry.getKey(); // name就是pdf模版中各个文本域的名字  
  20.         Item item = (Item) entry.getValue();  
  21.         System.out.println("[name]:" + name + ", [value]: " + item);  
  22.     }  
  23.   
  24.     s.setField("CUSTOMERNAME", "as该多好公司");  
  25.     s.setField("TEL", "123456asdzxc");  
  26.     s.setField("CONTACT", "我是联系人123");  
  27.   
  28.     ps.setFormFlattening(true); // 这句不能少  
  29.     ps.close();  
  30.     reader.close();  
  31. }  

效果如下所示:

[name]:CUSTOMERNAME, [value]: com.lowagie.text.pdf.AcroFields$Item@1690726
[name]:CONTACT, [value]: com.lowagie.text.pdf.AcroFields$Item@5483cd
[name]:TEL, [value]: com.lowagie.text.pdf.AcroFields$Item@1befab0

输出的pdf文件内容:

 

注:默认情况下如果填充的字段值含中文时,将提示报错,这是因为没有IText相应的中文语言包,需要下载亚洲语言包,ITextAsian.jar。

如不想生成文件流(临时文件),可用ByteArrayOutputStream代替。

2.多个PDF合并

Java代码 

 收藏代码

  1. /** 
  2.  * 多个PDF合并功能 
  3.  *  
  4.  * @param files 
  5.  *            多个PDF的文件路径 
  6.  * @param os 
  7.  *            生成的输出流 
  8.  */  
  9. public static void mergePdfFiles(String[] files, OutputStream os) {  
  10.     try {  
  11.         Document document = new Document(  
  12.                 new PdfReader(files[0]).getPageSize(1));  
  13.         PdfCopy copy = new PdfCopy(document, os);  
  14.         document.open();  
  15.         for (int i = 0; i < files.length; i++) {  
  16.             PdfReader reader = new PdfReader(files[i]);  
  17.             int n = reader.getNumberOfPages();  
  18.             for (int j = 1; j <= n; j++) {  
  19.                 document.newPage();  
  20.                 PdfImportedPage page = copy.getImportedPage(reader, j);  
  21.                 copy.addPage(page);  
  22.             }  
  23.         }  
  24.         document.close();  
  25.     } catch (IOException e) {  
  26.         e.printStackTrace();  
  27.     } catch (DocumentException e) {  
  28.         e.printStackTrace();  
  29.     }  
  30. }  

如果想要直接合并输出流,可以换成输出流的集合

Java代码 

 收藏代码

  1. /** 
  2.  * 多个PDF合并功能 
  3.  *  
  4.  * @param osList 
  5.  * @param os 
  6.  */  
  7. public static void mergePdfFiles(List<ByteArrayOutputStream> osList,  
  8.         OutputStream os) {  
  9.     try {  
  10.         Document document = new Document(new PdfReader(osList.get(0)  
  11.                 .toByteArray()).getPageSize(1));  
  12.         PdfCopy copy = new PdfCopy(document, os);  
  13.         document.open();  
  14.         for (int i = 0; i < osList.size(); i++) {  
  15.             PdfReader reader = new PdfReader(osList.get(i).toByteArray());  
  16.             int n = reader.getNumberOfPages();  
  17.             for (int j = 1; j <= n; j++) {  
  18.                 document.newPage();  
  19.                 PdfImportedPage page = copy.getImportedPage(reader, j);  
  20.                 copy.addPage(page);  
  21.             }  
  22.         }  
  23.         document.close();  
  24.     } catch (IOException e) {  
  25.         e.printStackTrace();  
  26.     } catch (DocumentException e) {  
  27.         e.printStackTrace();  
  28.     }  
  29. }  

3.PDF分割

Java代码 

 收藏代码

  1. /** 
  2.  * 单个Pdf文件分割成N个文件 
  3.  *  
  4.  * @param filepath 
  5.  * @param N 
  6.  */  
  7. public static void partitionPdfFile(String filepath, int N) {  
  8.     Document document = ;  
  9.     PdfCopy copy = ;  
  10.   
  11.     try {  
  12.         PdfReader reader = new PdfReader(filepath);  
  13.         int n = reader.getNumberOfPages();  
  14.         if (n < N) {  
  15.             System.out.println("The document does not have " + N  
  16.                     + " pages to partition !");  
  17.             return;  
  18.         }  
  19.         int size = n / N;  
  20.         String staticpath = filepath.substring(0,  
  21.                 filepath.lastIndexOf("\\") + 1);  
  22.         String savepath = ;  
  23.         List<String> savepaths = new ArrayList<String>();  
  24.         for (int i = 1; i <= N; i++) {  
  25.             if (i < 10) {  
  26.                 savepath = filepath.substring(  
  27.                         filepath.lastIndexOf("\\") + 1,  
  28.                         filepath.length() - 4);  
  29.                 savepath = staticpath + savepath + "0" + i + ".pdf";  
  30.                 savepaths.add(savepath);  
  31.             } else {  
  32.                 savepath = filepath.substring(  
  33.                         filepath.lastIndexOf("\\") + 1,  
  34.                         filepath.length() - 4);  
  35.                 savepath = staticpath + savepath + i + ".pdf";  
  36.                 savepaths.add(savepath);  
  37.             }  
  38.         }  
  39.   
  40.         for (int i = 0; i < N - 1; i++) {  
  41.             document = new Document(reader.getPageSize(1));  
  42.             copy = new PdfCopy(document, new FileOutputStream(  
  43.                     savepaths.get(i)));  
  44.             document.open();  
  45.             for (int j = size * i + 1; j <= size * (i + 1); j++) {  
  46.                 document.newPage();  
  47.                 PdfImportedPage page = copy.getImportedPage(reader, j);  
  48.                 copy.addPage(page);  
  49.             }  
  50.             document.close();  
  51.         }  
  52.   
  53.         document = new Document(reader.getPageSize(1));  
  54.         copy = new PdfCopy(document, new FileOutputStream(  
  55.                 savepaths.get(N - 1)));  
  56.         document.open();  
  57.         for (int j = size * (N - 1) + 1; j <= n; j++) {  
  58.             document.newPage();  
  59.             PdfImportedPage page = copy.getImportedPage(reader, j);  
  60.             copy.addPage(page);  
  61.         }  
  62.         document.close();  
  63.   
  64.     } catch (IOException e) {  
  65.         e.printStackTrace();  
  66.     } catch (DocumentException e) {  
  67.         e.printStackTrace();  
  68.     }  
  69. }  

4.在Servlet中调用IText返回给客户端

a.将文件流直接返回给客户端

Java代码 

 收藏代码

  1. @Override  
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  3.         throws ServletException, IOException {  
  4.     resp.setContentType("application/pdf");  
  5.     ServletOutputStream sos = resp.getOutputStream();  
  6.     FileInputStream in = new FileInputStream("f:/fillTemplate.pdf");  
  7.     byte data[] = new byte[1024];  
  8.   
  9.     int len = 0;  
  10.     while ((len = in.read(data)) != -1) {  
  11.         sos.write(data, 0, len);  
  12.     }  
  13.   
  14.     sos.flush();  
  15.     in.close();  
  16.     sos.close();  
  17. }  

b.填充模版文件后将输出流返回给客户端

Java代码 

 收藏代码

  1. @Override  
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  3.         throws ServletException, IOException {  
  4.     resp.setContentType("application/pdf");  
  5.   
  6.     ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  7.     PdfReader reader = ;  
  8.     PdfStamper ps = ;  
  9.     try {  
  10.         reader = new PdfReader(""); // 模版文件目录  
  11.         ps = new PdfStamper(reader, baos);  
  12.         AcroFields s = ps.getAcroFields();  
  13.         s.setField("CUSTOMERNAME", "as该多好公司");  
  14.         s.setField("TEL", "123456asdzxc");  
  15.         s.setField("CONTACT", "我是联系人123");  
  16.   
  17.         ps.setFormFlattening(true); // 这句不能少  
  18.         ps.close();  
  19.         reader.close();  
  20.     } catch (DocumentException e) {  
  21.         e.printStackTrace();  
  22.     }  
  23.   
  24.     ServletOutputStream sos = resp.getOutputStream();  
  25.     baos.writeTo(sos);  
  26.     sos.flush();  
  27.     sos.close();  
  28. }  

猜你喜欢

转载自blog.csdn.net/cxws110/article/details/88355791