2016-08-01 6 views
1

Мне нужно проанализировать PDF-файл через страницы и загрузить каждый отдельно в byte[]. Я использую библиотеку itext.как sohronit страница pdf файл в байтовом байте [] и восстановить обратно

загрузить файл, состоящий из одной страницы с этим кодом:

public Document addPageInTheDocument(String namePage, MultipartFile pdfData, Long documentId) throws IOException { 
     notNull(namePage, INVALID_PARAMETRE); 
     notNull(pdfData, INVALID_PARAMETRE); 
     notNull(documentId, INVALID_PARAMETRE); 
     byte[] in = pdfData.getBytes(); // size file 88747 
     Page page = new Page(namePage); 
     Document document = new Document(); 
     document.setId(documentId); 
     PdfReader reader = new PdfReader(new ByteArrayInputStream(pdfData.getBytes())); 
     PdfDocument pdfDocument = new PdfDocument(reader); 
     if (pdfDocument.getNumberOfPages() != 1) { 
      throw new IllegalArgumentException(); 
     } 
     byte[] transform = pdfDocument.getPage(1).getContentBytes(); // 1907 size page 
     page.setPageData(pdfDocument.getPage(1).getContentBytes()); 
     return addPageInTheDocument(document, page); 
    } 

Я пытаюсь восстановить файл с этим кодом:

ByteBuffer byteContent = new ByteBuffer() ; 
    for (Map.Entry<String, Page> page : pages.entrySet()) { 
     byteContent.append(page.getValue().getPageData()); 
    } 
    PdfWriter writer = new PdfWriter(new FileOutputStream(book.getName() + modification + FORMAT)); 
    byte[] df = byteContent.toByteArray(); 
    PdfReader reader = new PdfReader(new ByteArrayInputStream(byteContent.toByteArray())); 
    com.itextpdf.layout.Document itextDocument = new com.itextpdf.layout.Document(new PdfDocument(reader, writer)); 
    itextDocument.close(); 

Почему существует такая разница в размерах ? И почему файлы и страницы, а также byte[] для создания файла?

+0

Объясните: «Почему существует такая разница в размере?» Увеличивается или уменьшается размер? Чего вы пытаетесь достичь? Этот пост не квалифицируется как вопрос. Очень сложно понять, что здесь задают. –

+0

Мне нужно сохранить страницу страницы за страницей, которая затем создаст новый файл. В этом примере я загружаю файл, состоящий из одной страницы. Мой главный вопрос: сохраню ли я страницу (может быть, есть другой способ)? Потому что, когда вы создаете файл с байтами, сохранение файла страницы не может быть прочитано – vitaliy

+0

* Мне нужно сохранить файл по страницам: * другими словами, вы хотите * всплескать * файл PDF? Это верно? Ваш главный вопрос: * ли я сохраняю страницу *. Я не понимаю часть *, сохраняю ли я страницу. * Это не полное предложение на английском языке. Ваш комментарий также ничего не говорит о размере файла. Вы прочитали часть 1 этого ответа: http://stackoverflow.com/a/37131779/1622493 –

ответ

0

Давайте начнем с вашего размера вопрос:

byte[] in = pdfData.getBytes(); // size file 88747 
... 
byte[] transform = pdfDocument.getPage(1).getContentBytes(); // 1907 size page 

...

Почему существует такая разница в размерах?

Потому что PdfPage.getContentBytes() не возвращает то, что вы ожидаете.

Вы, кажется, ожидать, что она возвращает полное представление о содержании данной страницы, и Javadocs этого метода может быть истолковано («Получить декодируется байт для всего содержимого страницы.») означает, что.

Это не тот случай. PdfPage.getContentBytes() возвращает содержимое контента (-ов) страницы. Эти потоки контента содержат последовательность команд, которые создают страницу. Но эти команды принимают параметры, справочные данные вне потока контента, например:

  • когда текст рисуется на странице PDF, поток контента содержит операцию выбора шрифта, но данные, описывающие шрифт и в случае встроенных шрифтов сама программа шрифтов находится вне потока контента;
  • При рисовании растровых изображений поток контента обычно содержит операцию для него, которая ссылается на данные изображения вне потока контента;
  • есть операции, которые ссылаются на так называемые xobjects, которые по существу являются независимыми потоками контента, которые могут быть вызваны с любой страницы; эти xobject также не содержатся в потоке содержимого страницы.

Кроме того, есть аннотации (например, поля формы) с их собственными потоками контента, которые хранятся в отдельных структурах. И много свойств страницы тоже снаружи.

Таким образом, таких разниц в размере, потому что вы получаете только минутную часть определения страницы, используя getContentBytes.


Теперь давайте посмотрим на ваш код «Восстановление файла».

В качестве следствия вышесказанного очевидно, что ваш код просто объединяет некоторые потоки контента, но не предоставляет внешние ресурсы, на которые ссылаются эти потоки.

Но помимо этого ваш код также указывает на недоразумение в отношении характера страниц PDF: это не просто капли, которые вы можете разделить и объединить, как хотите. Это сборники PDF-объектов, которые распространяются по всему PDF-файлу; разные страницы могут совместно использовать некоторые из своих объектов (например, шрифты часто используемых изображений).


Что вы можете сделать вместо этого ...

Как представления одной страницы, вы должны использовать PDF, содержащий данные, на которые ссылается этой одной страницы. Пример iText Burst.java показывает, как это сделать.

Чтобы присоединиться к этим страницам PDF, вы можете использовать iText PdfMerger. Не забудьте установить интеллектуальный режим (PdfWriter.setSmartMode(true)), чтобы предотвратить дублирование ресурсов в результате.