2012-03-07 27 views
3

私はitext pdfライブラリを使っています。私は既存のPDFの最後にコンテンツを追加したいと思います。既存のpdfにデータを追加する

セイは、例えば、既存のPDFが(Original.pdf言う)を有するさは4ページを言うので、私はコンテンツHello Worldの私は追加していたコンテンツで別のページ、すなわちページなし5を追加し、同じPDFファイルに保存したいですすなわちOriginal.pdf

だから私のOriginal.pdfを閉じた後ページは、私がコンテンツを追加していたコンテンツのHello Worldと(彼らはすでに持っているデフォルトの内容で)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非常に良い提案があります。 –

+0

私はこのページを見ましたが、私の要求より前には何も得ていませんでした。それは新しいpdfを作成するというより、更新しています...... –

+0

注釈などがこのようにサポートできないというマークの提案を見ましたか?また、上記のケースでは、同じファイルに2つのストリームを読み込み、もう一方の書き込みで問題が発生するという感覚があります。 –

答えて

4

私はこの問題が、FileOutputStreamFileInputStreamを同じファイルに使用しているという事実から来ていると思います。

私は、PDFのByteArrayOutputStreamに保存し、スタンパを閉じて、ByteArrayOutputStreamをファイルに保存することをお勧めします。

私はIOUtils.write(byte[] data, OutputStream output)の方法を使用してByteArrayOutputStreamFileOutputStreamに保存しました。

私はこれをテストしてみた、それが動作します:

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(); 
      } 
関連する問題