2012-03-07 58 views
3

我正在使用itext pdf库。我想在现有pdf的末尾添加一个内容。在itext中以现有pdf添加数据

例如说现有的pdf(比如说Original.pdf)有4页说,所以我想添加另一个页面,即页面号为5的内容Hello World我添加了内容并保存在同一pdf中即Original.pdf

所以关闭我的Original.pdf后,将包含页即4页(他们已经有默认的内容)+ 1页面内容世界您好,我添加的内容

我使用此代码,但显示异常

 String in="Original.pdf"; 
     String out="Original.pdf";   

     PdfReader reader = new PdfReader(in); 
     PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(out)); 

     int totalPages=reader.getNumberOfPages(); 
     stamper.insertPage(totalPages+1, PageSize.A4); 
     stamper.addAnnotation(
           PdfAnnotation.createText(
                  stamper.getWriter(), 
                  new Rectangle(30f, 750f, 80f, 800f), 
                  "inserted page", "This page is the title page.", 
                  true, 
                  null) 
           , 
           reader.getNumberOfPages() 
          ); 
     stamper.close(); 

java.io.EOFException的

在此先感谢。

+0

http://stackoverflow.com/questions/3335126/itext-add-content-to-existing-pdf-file非常好的建议礼物! – 2012-03-07 07:32:00

+0

我看到这个页面,但没有得到任何东西之前,我的要求它说创建新的PDF,而不是更新...... – 2012-03-07 07:35:07

+0

你看到马克的建议,他说注释等不能以这种方式支持?此外,在上述情况下,我有一种感觉,即一次读取和另一次写入的同一个文件流2会产生问题。 – 2012-03-07 07:37:06

回答

4

我认为问题来自于您在同一个文件上使用了FileOutputStreamFileInputStream

我会建议保存ByteArrayOutputStream PDF,关闭压模,然后将ByteArrayOutputStream保存在您的文件中。

我用IOUtils.write(byte[] data, OutputStream output)方法将ByteArrayOutputStream保存在FileOutputStream

我测试过这一点,它的工作原理:

String in = "Original.pdf"; 
    String out = "Original.pdf"; 

    PdfReader reader = new PdfReader(in); 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    PdfStamper stamper = new PdfStamper(reader, baos); 

    int totalPages = reader.getNumberOfPages(); 
    stamper.insertPage(totalPages + 1, PageSize.A4); 
    stamper.addAnnotation(PdfAnnotation.createText(stamper.getWriter(), new Rectangle(30f, 750f, 80f, 800f), "inserted page", "This page is the title page.", true, null), 
      reader.getNumberOfPages()); 
    stamper.close(); 

    FileOutputStream fileOutputStream = new FileOutputStream(out); 
    IOUtils.write(baos.toByteArray(), fileOutputStream); 
0

那么你可以做这样的事情。

  String out="Original.pdf"; 
      File oldFile = new File(out); 
      try { 
       Document document = new Document(); 
       PdfCopy filePdfCopy = new PdfCopy(document, 
         new FileOutputStream(oldFile, true)); 
       document.open(); 
       PdfReader reader = new PdfReader(newFile.getAbsolutePath()); 
       PdfReader reader_old = new PdfReader(
         oldFile.getAbsolutePath()); 
       filePdfCopy.addDocument(reader); 
       filePdfCopy.addDocument(reader_old); 
       filePdfCopy.close(); 
       reader.close(); 
       reader_old.close(); 
       document.close(); 
       stats.addMergedPdf(); 
      } catch (FileNotFoundException e) { 
       logger.error("FileNotFoundException: ", e); 
       stats.addError(); 
      } catch (DocumentException e) { 
       logger.error("DocumentException: ", e); 
       stats.addError(); 
      } catch (IOException e) { 
       logger.error("IOException: ", e); 
       stats.addError(); 
      }