2012-03-07 3 views
3

itext pdf 라이브러리로 작업 중입니다. 기존 PDF 끝에 콘텐츠를 추가하고 싶습니다.기존 pdf에 데이터 추가하기

예를 들어 기존 pdf (예 : Original.pdf)가 4 페이지로되어 있다고 가정하면 페이지 5에 콘텐츠가 추가됩니다. 안녕하세요. 콘텐츠를 추가하고 같은 PDF 파일로 저장합니다. 즉 Original.pdf

그래서 내 Original.pdf을 닫은 후 5 페이지 나 콘텐츠를 추가하고 내용 안녕하세요과 (그들이 이미 가지고있는 기본 콘텐츠 포함) 4 페이지 + 1 페이지을 즉 포함

이 코드를 사용하지만 java.io.EOFException 사전에

감사 예외

 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(); 

을 표시하고 있습니다.

+0

http://stackoverflow.com/questions/3335126/itext-add-content-to-existing-pdf-file 아주 좋은 제안! –

+0

이 페이지를 보았지만 요구 사항 이전에 아무것도 얻지 못했습니다. 업데이트하는 대신 새 PDF를 작성하는 것입니다 ...... –

+0

주석 등이 이런 방식으로 지원 될 수 없다고 말하는 Mark의 제안을 보았습니까? 또한, 위의 경우에 나는 같은 파일에 2 개의 스트림을 하나의 읽기와 다른 쓰기가 문제를 일으킨다는 느낌이 들었다. –

답변

4

나는이 문제가 동일한 파일에 FileOutputStreamFileInputStream을 사용하고 있다는 사실에서 비롯된 것이라고 생각합니다.

나는 ByteArrayOutputStream에 PDF를 저장하고, 스탬퍼를 닫은 다음 파일에 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(); 
      } 
관련 문제