2012-03-07 60 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(); 
      }