2013-11-08 3 views
1

Насколько я знаю, PDF-файлы поддерживают ссылки на объекты. Так, например, если я использую одно и то же изображение 100 раз в документе - его можно оптимизировать для использования одного и того же изображения в каждом месте, что значительно снижает размер PDF.Вставка нескольких копий страницы в PDF

Поддерживает ли PDF то же самое с полными страницами данных? Если да, как я могу это сделать с помощью библиотеки iText?

Моя проблема заключается в том, что у меня есть огромный документ размером ~ 500 страниц, и каждые 2-3 страницы мне нужно вставить ту же страницу шаблона, которая читается из другого документа PDF. Код выглядит это нравится:

protected static void addAppendix(PdfWriter writer, Document document, InputStream appendixStream) 
      throws IOException { 
     PdfContentByte cb = writer.getDirectContent(); 
     PdfReader reader = new PdfReader(appendixStream); 
     for (int idx = 1; idx <= reader.getNumberOfPages(); ++idx) { 
      document.newPage(); 
      PdfImportedPage imported = writer.getImportedPage(reader, idx); 
      cb.addTemplate(imported, 0, 0); 
     } 
     writer.freeReader(); 
    } 

Однако это увеличивает размер PDF значительно, особенно если приложение содержит некоторые большие изображения и прочее. Есть ли способ как-то оптимизировать размер моего документа?

ответ

3

Не уничтожайте PdfReader, а используйте его повторно.

Шаги:
1 - создать документ и PDFWriter указывая на output.pdf
2 - открыть PdfReader, указывающие на ваш appendix.pdf
3 - добавить содержимое на страницы
4 - добавить аппендикс страниц чтения образуют PdfReader
5 - повторите шаг 3 и 4, как вам нужно
6 - закрыть PdfRerader
7 - закрыть PDFWriter и документ

+0

Спасибо, я попробую это и посмотрю, не имеет ли значения размер. – bezmax

2

ответ Фабрицио правильно: если вы не е читатель, добавленная страница не будет добавлена ​​избыточно.

Я хочу добавить дополнительный комментарий/ответ: если вы говорите о добавлении дополнительных страниц в существующий PDF-файл, вы не хотите использовать PdfWriter для этого. Я знаю: в Интернете есть много примеров, которые говорят вам об этом, но это не одобрение оригинального разработчика iText (бытия: меня).

Если вы хотите добавить страницы в существующий PDF, вы должны использовать PdfCopy или PdfSmartCopy. Преимущество использования PdfCopy заключается в том, что вы сохраняете интерактивный контент, такой как ссылки и аннотации. Преимущество использования своего подкласса PdfSmartCopy заключается в том, что избыточные объекты удаляются. Например: если один и тот же поток страниц присутствует 100 раз избыточно в одном документе, PdfSmartCopy удалит 99 экземпляров и обратится к одному и только оставшемуся объекту потока.

+0

Спасибо за ответ, но я создаю документ «на лету» и добавляю статические страницы PDF после некоторых разделов. Поэтому PdfCopy мне не очень-то нравится. – bezmax

+0

В этом случае я отвечу ответом Фабрицио ;-) –

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