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 должен ограничить количество, записанное в выходном потоке, чтобы страница сбрасывалась, пока страница содержит ресурсы, которые были скопированы ранее.
для ясности, я вижу только пару байтов, записанных в TOTAL (т. Е. InstantFlush не делает ничего проще ... выходной файл _entire_ составляет всего пару байтов вместо Mb). Я благодарен за попытку ответа, но я не думаю, что он обращается к моему вопросу 'PdfPage.flush (boolean flushContentStream). Попытка следовать пути кода до PdfObject.flush(), похоже, что может быть другое поведение с сбросом косвенных ссылок (но я не могу сшить все вместе в моей голове). –
@jameygraham * «для ясности, ...» * - вы должны действительно обновить вопрос, поскольку в настоящее время он говорит что-то другое. И если в файле PDF есть только несколько байтов, я бы предположил, что процедура либо остановлена исключением, либо ваш код делает что-то не так, как захват PDF, прежде чем его 'PdfDocument' будет закрыт. – mkl
@jameygraham Я попытался ответить на ваш первоначальный вопрос о 'PdfPage.flush'. Внутри есть несколько сложных взаимодействий из-за различных оптимизаций, поэтому я, возможно, пропустил некоторые вещи. Если вы объединяете большие файлы, а ваш вывод - всего пару байт, у вас может быть другая проблема. Возможно, поскольку эти файлы на 1000 страниц могут быть ужасно неэффективными монстрами, но без доступа к обоим входам и выходам я больше не могу помочь вам. Тем не менее, мои общие замечания по второму, более общему вопросу все еще сохраняются. –