2012-03-07 2 views
3

Я работаю с itext pdf библиотека. Я хочу добавить контент в конец существующего pdf.Добавление данных в itext в существующий pdf

Скажем, например, существующий pdf (скажем, Original.pdf) скажет 4 страницы, поэтому я хочу добавить другую страницу, т.е. страницу № 5 с контентом Hello World Я добавил контент и сохранил его в том же формате pdf т.е. Original.pdf

Таким образом, после закрытия моего Original.pdf будет содержать страниц, т.е. 4 страниц (с содержанием по умолчанию они уже есть) + 1 страница с содержанием Hello World я добавил содержание

Я использую этот код, но изображающий исключение

 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

Я думаю, проблема связана с тем, что вы используете FileOutputStream и FileInputStream в том же файле.

Я бы рекомендовал сэкономить на 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(); 
      } 
Смежные вопросы