#pdf #pdf-generation #foxit
#PDF #pdf-генерация #foxit
Вопрос:
Функция DeletePage, найденная в Foxit SDK, позволяет удалять страницу из PDF. При удалении страницы и сохранении документа размер файла выходного документа (с меньшим количеством страниц) больше, чем у оригинала.
Это можно увидеть в примере приложения PDF, которое поставляется с SDK:
$ ./simple_sample/bin/rel_gcc/pdfpage_organization
...
Success: Use <rb> mode to open the file InsertPages.pdf and associate it with a stream.
Success: Create the file object.
Success: Open file successfully .
Success: Load PDF document successfully.
Success: Get page with index 1.
Success: Delete page with index 1.
Using extension implementation to open the file.
Success: Use <wb> mode to open the file SourcePage_delete.pdf and associate it with a stream.
Success: Create the file object.
Success: The PDF document save to SourcePage_delete.pdf.
Проверка выходных данных:
ll simple_sample/input_files/SourcePage.pdf -rw-r—r—@ 1 ричард стафф 92K 17 декабря 2013 simple_sample/input_files/SourcePage.pdf
ll simple_sample/output_files/pdfpage_organization/SourcePage_delete.pdf -rw-r—r—@ 1 ричард стафф 96K 23 июня 10:22 simple_sample/output_files/pdfpage_organization/SourcePage_delete.pdf
В файле SourcePage_delete.pdf на одну страницу меньше, чем ожидалось, но на 4k больше. Я могу получить тот же результат, удалив 99 страниц из 100-страничного документа, т. Е. Размер файла не отражает количество страниц.
Комментарии:
1. Мне было бы любопытно посмотреть, как выглядят внутренности документа. Можете ли вы где-нибудь размещать файлы до и после?
2. Да, вот они: dropbox.com/sh/9nx8j6v7421cg4f/AABpI1cbZoNmE4atTH8Hdb7sa
3. Возможно (я не знаю Foxit SDK), что операции удаления и сохранения выполняются в режиме инкрементного обновления. В этой ситуации страница помечается только как удаленная, и добавляются дополнительные структуры, поэтому конечный размер больше исходного.
4. Я могу себе представить, что это так. Существует ли другой режим, который принудительно удалял бы структуры, содержащиеся на странице?
5. Для этого может быть несколько причин. Возможно, в исходном PDF-файле отсутствовал какой-то необходимый элемент, и в процессе сохранения измененного PDF-файла этот недостающий элемент был добавлен в PDF, автоматически «восстанавливая» его. В качестве альтернативы, возможно, какой-то объект был сжат до удаления страницы, и во время / после удаления страницы объект больше не сжимается (хотя увеличение размера файла в этом сценарии, скорее всего, превысит 4k).
Ответ №1:
На основе предоставленных вами примеров документов и комментария @MihaiIancu вы сохраняете добавочное обновление PDF, которое в основном просто добавляет новую информацию в конец вашего существующего файла.
Согласно сайту Foxit SDK, функция FSPDF_Doc_StartSaveToFile
принимает флаг для третьего параметра, который является FSPDF_SAVEFLAG_INCREMENTAL
, FSPDF_SAVEFLAG_NOORIGINAL
, FSPDF_SAVEFLAG_REMOVESECURITY
или FSPDF_SAVEFLAG_OBJECTSTREAM
. В вашем случае я бы подумал, что FSPDF_SAVEFLAG_NOORIGINAL
это должно делать то, что вы ищете. Если вы не используете эту функцию напрямую, мы надеемся, что все равно должна быть оболочка, которая принимает один из этих параметров.
Комментарии:
1. Я подозреваю, что это правильно (у меня нет способа это доказать). Я приму это как ответ.
2. Можете ли вы изучить это подробнее? Я никогда раньше не использовал этот продукт, поэтому я только делаю обоснованное предположение. Если это неверно или вы нашли лучшее решение, сообществу было бы лучше, если бы они знали.
3. ОК. Я только что провел довольно обширное тестирование, и похоже, что передача FSPDF_SAVEFLAG_NOORIGINAL не решает проблему.
Ответ №2:
В последней версии Foxit PDF SDK 6.4 для Linux метод сохранения поддерживает e_SaveFlagRemoveRedundantObjects. Обычно, когда вы удаляете страницу, на нее просто ссылаются в структуре PDF. Если вы установите этот флаг, он просто удалит любой объект, на который нет ссылки в PDF.