2013-07-09 2 views
2

Я создаю систему, которая динамически создает PDF с помощью IText для Java внутри сервлета с помощью ByteArrayOutputStream и PDFWriter, чтобы предотвратить использование файловой системы.Append PDF в IText PDF в памяти в сервлет

Я хотел бы иметь возможность добавлять некоторые существующие файлы PDF-файлов в конец динамически создаваемого PDF после завершения динамического содержимого.

Я рассмотрел пример кода, чтобы объединить PDF-файлы с помощью iText, и они используют PdfCopy, чтобы выполнить это. Большое предположение для PdfCopy состоит в том, что все файлы, которые являются конкатенированными, существуют в файловой системе.

Можно ли объединить существующие файлы в конец PDF-файла, который существует как ByteArrayOutputStream?

В то же время я использовал временный файл для исходного динамического документа, но хотел бы удалить эту зависимость, если это возможно.

Спасибо,

Allen

ответ

3

Вы полагаете, что вы можете создать экземпляр PdfReader, используя путь к файлу. Это предположение неверно. См. the API documentation. Если baos ваш ByteArrayOutputStream, вы можете легко создать свой экземпляр читателя, как это:

PdfReader reader = new PdfReader(baos.toByteArray()); 
+0

Отлично. Именно то, что я искал. Я скоро это сделаю, надеюсь, завтра. Спасибо Бруно. – ahillman3

+0

Работал отлично, спасибо. – ahillman3

1

Имея список InputStream (различные документы), вы можете добавить их в OutputStream таким образом (на основе в this):

private void doMerge(List<InputStream> list, OutputStream outputStream) 
     throws DocumentException, IOException { 
    Document document = new Document(); 
    PdfCopy copy = new PdfCopy(document, outputStream); 
    document.open(); 
    int n; 
    for (InputStream in : list) { 
     PdfReader reader = new PdfReader(in); 
     for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
      n = reader.getNumberOfPages(); 
      // loop over the pages in that document 
      for (int page = 0; page < n;) { 
       copy.addPage(copy.getImportedPage(reader, ++page)); 
      } 
      copy.freeReader(reader); 
      reader.close(); 
     } 
    } 
    outputStream.flush(); 
    document.close(); 
    outputStream.close(); 
} 
+1

Как упоминалось много раз, это * не *, как следует сцепить PDF-файлы. С помощью 'new Document()' вы создаете документ, на котором все страницы имеют размер A4 в портрете. Как вы знаете, размер каждого PdfImportedPage также A4 в портрете? Что делать, если исходные документы содержат аннотации? Они будут потеряны при использовании комбинации «PdfWriter» и «PdfImportedPage». Примените свой пример так, чтобы он использовал 'PdfCopy', как указано в вопросе. –

+0

Я просто предоставил ответ на основе кода, который у меня на самом деле есть, хорошо знать новые вещи ;-) –

+0

Обновленный ответ. –

Смежные вопросы