2017-01-12 2 views
1

что именно делает PdfPage.flush (true)? Изменяет ли SmartMode (или другие настройки) поведение? Во многих случаях я хочу оставить страницу редактируемой как можно дольше, поэтому никогда не беспокоился о том, что документ PDF был собран в памяти до document.close(). Но при создании очень больших файлов (десятки тысяч страниц) память становится ограниченной. Я наивно надеялся, что PdfPage.flush(true) напишет поток контента на диск и освободит память, но вызов flush(true) только, кажется, записывает пару байтов на диск.поведение PdfPage.flush()

Я полагаю, что более общая версия моего вопроса: «Как мы эффективно объединим много документов в один очень большой документ? (Itext7)», но не очень хорошо разбираемся в самой спецификации PDF, также хотелось бы лучше понять, что происходит на самом деле.

ответ

0

flush(), вызывающий объекты макета, заставляет эти объекты и их детей рисовать (== писать) их содержимое в выходной поток писателя. Причина, почему вы видите только несколько байт записываются при ручном вызове вровень(), потому что по умолчанию Document конструкторов уже установлены IText промывать агрессивно перегружать соответствующие конструктор:

/** 
* Creates a document from a {@link PdfDocument} with a manually set {@link 
* PageSize}. 
* 
* @param pdfDoc the in-memory representation of the PDF document 
* @param pageSize the page size 
*/ 
public Document(PdfDocument pdfDoc, PageSize pageSize) { 
    this(pdfDoc, pageSize, true); 
} 

/** 
* Creates a document from a {@link PdfDocument} with a manually set {@link 
* PageSize}. 
* 
* @param pdfDoc   the in-memory representation of the PDF document 
* @param pageSize  the page size 
* @param immediateFlush if true, write pages and page-related instructions 
*      to the {@link PdfDocument} as soon as possible. 
*/ 
public Document(PdfDocument pdfDoc, PageSize pageSize, boolean immediateFlush) 

Что касается рекомендаций по общему вопросу : На самом деле нет какой-либо функции iText или конфигурации iText, которая делает магический прогресс быстрее и эффективнее, но есть некоторые трюки, которые вы можете сделать за пределами iText:

1) Выделите больше ресурсов, очевидно и часто не представляется возможным.

2) Многоступенчатая пакетная обработка: объединить 10-файлов в 1 на шаге X, продолжить слияние этих файлов на этапе X + 1. В общем случае 1 большой файл будет меньше, чем 10 файлов отдельно, из-за возможного повторного использования ресурсов, таких как шрифты и изображения.

3) Запустите процесс объединения в разы ресурсы она занимает не нужны нигде, например, в ночное время, во время обеда и т.д.

Edit: А почему PdfPage # флеша() пишет только пара байтов для содержимого, которая зависит от входного документа, но, скорее всего, указывает на очистку страницы, которая либо имеет в основном текстовый контент, либо много общих ресурсов. SmartMode должен ограничить количество, записанное в выходном потоке, чтобы страница сбрасывалась, пока страница содержит ресурсы, которые были скопированы ранее.

+0

для ясности, я вижу только пару байтов, записанных в TOTAL (т. Е. InstantFlush не делает ничего проще ... выходной файл _entire_ составляет всего пару байтов вместо Mb). Я благодарен за попытку ответа, но я не думаю, что он обращается к моему вопросу 'PdfPage.flush (boolean flushContentStream). Попытка следовать пути кода до PdfObject.flush(), похоже, что может быть другое поведение с сбросом косвенных ссылок (но я не могу сшить все вместе в моей голове). –

+0

@jameygraham * «для ясности, ...» * - вы должны действительно обновить вопрос, поскольку в настоящее время он говорит что-то другое. И если в файле PDF есть только несколько байтов, я бы предположил, что процедура либо остановлена ​​исключением, либо ваш код делает что-то не так, как захват PDF, прежде чем его 'PdfDocument' будет закрыт. – mkl

+0

@jameygraham Я попытался ответить на ваш первоначальный вопрос о 'PdfPage.flush'. Внутри есть несколько сложных взаимодействий из-за различных оптимизаций, поэтому я, возможно, пропустил некоторые вещи. Если вы объединяете большие файлы, а ваш вывод - всего пару байт, у вас может быть другая проблема. Возможно, поскольку эти файлы на 1000 страниц могут быть ужасно неэффективными монстрами, но без доступа к обоим входам и выходам я больше не могу помочь вам. Тем не менее, мои общие замечания по второму, более общему вопросу все еще сохраняются. –