Foxit PDF SDK — удаление страницы увеличивает размер документа

#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.