Podofo - это бесплатная портативная библиотека C ++ для работы с форматом файла PDF.
Podofo предоставляет классы для анализа файла PDF и изменения своего контента в память. Изменения можно легко записать на диск. Помимо PDF -анализа PDF Podofo также предоставляет средства для создания собственных файлов PDF с нуля. В настоящее время он не поддерживает рендеринг контента PDF.
Для создания Podofo Lib вам понадобится компилятор C ++ 17, Cmake 3.16 и следующие библиотеки (указанные минимальные версии):
Для наиболее популярных инструментов Podofo требуется следующие минимальные версии:
Он регулярно проверяется со следующими версиями IDE/Toolchains:
Поддержка GCC 8.x недавно сломалась, но ее можно было восстановить.
Библиотека Podofo лицензирована в рамках LGPL 2.0 или более поздних условий. Инструменты Podofo лицензированы в рамках GPL 2.0 или более поздних условий.
Известно, что Podofo компилируется через множество менеджеров пакетов (включая apt-get , Brew, VCPKG, CONAN), и обладает общественной непрерывной интеграцией, работающей в Ubuntu Linux, MacOS и Windows, загружая проект Cmake, строительство и тестирование библиотеки. Настоятельно рекомендуется создавать Podofo, используя таких менеджеров пакетов.
В репозитории также есть игровая площадка, где вы можете иметь доступ к зависимостям предварительной сборки для некоторых популярных архитектур/операционных систем: Playground-это рекомендуемая настройка для разработки библиотеки и воспроизведения ошибок, в то время как она не рекомендуется для развертывания вашего приложения с помощью Podofo. Посмотрите на Readme там.
Предупреждение : известно, что Podofo работает в межкомпиляционных инструментах (например, разработка Android/IOS), но поддержка может не предоставлена в таких сценариях. Если вы решите вручную построить зависимости вручную, вы, как предполагаете, знать, как идентифицировать возможные библиотечные столкновения/несоответствия и как справиться с проблемами компиляции/связывания, которые могут возникнуть в вашей системе.
Из исходного корня прогона:
sudo apt-get install -y libfontconfig1-dev libfreetype-dev libxml2-dev libssl-dev libjpeg-dev libpng-dev libtiff-dev libidn11-dev
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Установите пиво, затем из Root Root Run:
brew install fontconfig freetype openssl libxml2 jpeg-turbo libpng libtiff libidn cmake
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_FIND_FRAMEWORK=NEVER -DCMAKE_PREFIX_PATH=`brew --prefix` -DFontconfig_INCLUDE_DIR=`brew --prefix fontconfig`/include -DOPENSSL_ROOT_DIR=`brew --prefix openssl@3` ..
cmake --build . --config Debug
Установите Conan, затем из Root Root Run:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Следуйте руководству QuickStart VCPKG, чтобы сначала настроить репозиторий диспетчера пакетов. В Windows также может быть полезно установить переменную среды VCPKG_DEFAULT_TRIPLET на x64-windows для установки 64-битных зависимостей и определения переменной VCPKG_INSTALLATION_ROOT с местоположением репрессия, созданной в QuickStart.
Затем из Root Root Rune:
vcpkg install fontconfig freetype libxml2 openssl libjpeg-turbo libpng tiff zlib
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=C:vcpkgscriptsbuildsystemsvcpkg.cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
PODOFO_BUILD_TEST : Создайте модульные тесты, по умолчанию TRUE;
PODOFO_BUILD_EXAMPLES : построить примеры, по умолчанию к истину;
PODOFO_BUILD_UNSUPPORTED_TOOLS : Создайте инструменты Podofo, по умолчанию. См. Соответствующий раздел в ReadMe;
PODOFO_BUILD_LIB_ONLY : Если true, он построит только компонент библиотеки. Это безоговорочно отключает строительные испытания, примеры и инструменты;
PODOFO_BUILD_STATIC : Если истина, создайте библиотеку в качестве статического объекта и используйте ее в тестах, примерах и инструментах. По умолчанию построена общая библиотека.
Если вы хотите использовать статическую сборку Podofo, и вы включаете проект Podofo Cmake, это очень просто. Сделайте что -то вроде следующего в своем проекте Cmake:
set(PODOFO_BUILD_LIB_ONLY TRUE CACHE BOOL "" FORCE)
set(PODOFO_BUILD_STATIC TRUE CACHE BOOL "" FORCE)
add_subdirectory(podofo)
# ...
target_link_libraries(MyTarget podofo::podofo)
Если вы ссылаетесь на предварительную статическую сборку Podofo, это сценарий, в котором поддержка ограничена, так как вы действительно должны быть в состоянии идентифицировать и исправлять ошибки связывания. Общие шаги:
PODOFO_STATIC в свой проект или до включения podofo.h ;podofo.a , podofo_private.a (или podofo.lib , podofo_private.lib с msvc) и все зависимые библиотеки. Документацию API можно найти по адресу https://podofo.github.io/podofo/documentation/.
Обязательное условие : убедитесь, что на вашем компьютере установлен Doxygen. Если нет, посетите официальный веб -сайт Doxygen, чтобы загрузить и установить его.
Генерация документации : После завершения процесса сборки, подробно описанной в главе Development QuickStart, перейдите к корневому каталогу исходного кода Podofo. Откройте терминал или командную строку и запустите следующую команду:
doxygen build/Doxyfile Просмотр документации : как только генерация документации завершится, вы найдете каталог documentation , который содержит сгенерированную документацию. Откройте index.html в вашем любимом веб -браузере, чтобы просмотреть документацию API.
cd build/doxygen/documentation
open index.html Все std::strings или std::string_view в библиотеке предназначены для хранения кодированного содержимого строки UTF-8. Конструкторы PdfString и PdfName принимают кодируемые строки UTF-8 по умолчанию (однако, PdfName принимает только символы в наборе PdfDocEncoding char). charbuff Abd bufferview вместо этого представляет общий буфер октета.
У Podofo есть нестабильный API, который является результатом обширного обзора API Podofo 0.9.x. По этой ссылке вы можете найти неполное руководство по миграции 0,9,8 кода до 0,10,0. Ожидается, что Podofo сходится к стабильному API, как только процесс обзора будет завершен. Смотрите стабильность API для более подробной информации.
Предупреждение : инструменты в настоящее время не поддерживаются , не проверены и не являются незамеченными .
Инструменты Podofo по -прежнему доступны в дереве источника, но их компиляция отключена по умолчанию, потому что они не являются неостановленными/невыносимыми и не будут получать поддержку до тех пор, пока их статус не будет очищен. Не рекомендуется включать их в распределения программного обеспечения. Если вы хотите построить их, обязательно загрузите проект Cmake с -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE . Инструменты удобно включены на игровой площадке, по крайней мере, чтобы убедиться, что изменения библиотеки не сломают их компиляцию.
Есть список Todo, или посмотрите на трекер выпуска.
В: Как мне подписать документ?
A: Head Podofo теперь обеспечивает процедуру подписания высокого уровня, которая очень мощная и позволяет подписывать документ без необходимости снабжения структуры CMS вручную. По умолчанию он поддерживает подписание документа с современными профилями соответствия PAdES-B , но есть также поддержка устаревших подписей PKCS7. При условии, что у вас есть как кодированный сертификат x509, так и закрытый ключ RSA, вы можете подписать документ со следующим кодом:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
auto & page = doc.GetPages().GetPageAt( 0 );
auto & signature = page.CreateField<PdfSignature>( " Signature " , Rect ());
auto signer = PdfSignerCms(x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);Существует также поддержка внешних служб подписания и/или подписания документа в буферах памяти. Смотрите различные примеры подписания в модульных тестах.
В: Могу ли я использовать процедуру, основанную на событиях, чтобы подписать документ?
Да, старая процедура низкого уровня не изменилась, и она все еще доступна. Чтобы кратко описать процедуру, необходимо полностью реализовать PdfSigner , извлечь или создать поле PdfSignature , создать устройство вывода (см. Следующий вопрос) и использовать PoDoFo::SignDocument(doc, device, signer, signature) . При подписании последовательность вызовов PdfSignature работает таким образом: Method PdfSigner::Reset() сначала называется, затем PdfSigner::ComputeSignature(buffer, dryrun) вызывается с пустым буфером, а аргумент dryrun устанавливается в true . В этом вызове можно просто изменить размер буфера, переоценивающего необходимый размер для подписи, или просто вычислить поддельную подпись, которая должна быть сохранена в буфере. Затем называется последовательность PdfSigner::AppendData(buffer) , получая все данные документа, которые будут подписаны. Последний PdfSigner::ComputeSignature(buffer, dryrun) вызывается, с параметром dryrun , установленным false . Буфер на этом вызове очищается (емкость не изменяется) или, соответственно, соответственно со значением PdfSigner::SkipBufferClear() .
Q: PdfMemDocument::SaveUpdate() или PoDoFo::SignDocument() Напишите только частичный файл: почему нет механизма для беспрепятственной обработки инкрементного обновления, как это было в Podofo 0.9.x? Что нужно сделать, чтобы правильно обновить/подписать документ?
A: Предыдущий механизм в Podofo 0.9.x требовал включения документа для постепенных обновлений, который является шагом принятия решения, который, как я считаю, должен быть ненужным. Также:
Альтернативная стратегия, которая делает более ясную тот факт, что инкрементное обновление должно выполняться в том же файле, из которого был загружен документ, или что базовый буфер будет увеличивать потребление памяти после последующих операций в случае документов, загруженных буфером. Он следует за несколькими примерами, показывающими правильные операции для обновления документа, загруженного из файла или буфера:
auto inputOutput = std::make_shared<FileStreamDevice>(filename, FileMode::Open);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);charbuff outputBuffer;
FileStreamDevice input (filepath);
auto inputOutput = std::make_shared<BufferStreamDevice>(outputBuffer);
input.CopyTo(*inputOutput);
PdfMemDocument doc;
doc.Load(inputOutput);
doc.SaveUpdate(*inputOutput);Подписание документов может быть сделано с той же техникой, прочитайте другие вопросы для получения дополнительных примеров.
В: Могу ли я подписать документ во второй раз?
A: Да, это проверяется, но чтобы убедиться, что это будет работать, вы будете повторно привести документ во второй раз, поскольку повторное использование уже загруженного документа все еще не проверен (это может измениться позже). Например, вы можете сделать, как это следует:
auto inputOutput = std::make_shared<FileStreamDevice>(filepath, FileMode::Open);
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature1 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}
{
PdfMemDocument doc;
doc. Load (inputOutput);
auto & page = doc. GetPages (). GetPageAt ( 0 );
auto & signature = page. CreateField <PdfSignature>( " Signature2 " , Rect ());
PdfSignerCms signer (x509certbuffer, pkeybuffer);
PoDoFo::SignDocument (doc, *inputOutput, signer, signature);
}Podofo может или не может работать для ваших потребностей и поставляется абсолютно без гарантии. Серьезные ошибки, включая недостатки безопасности, могут быть зафиксированы в произвольные сроки или не зафиксированы вообще. Приоритет реализации новых функций и исправления ошибок определяется в соответствии с интересами и личными предпочтениями сопровождающих. Если вам нужен Podofo, чтобы интегрировать функцию или исправление ошибок, которое имеет решающее значение для вашего рабочего процесса, наиболее желанным и быстрым подходом является внесение высококачественных патчей.
Пожалуйста, подпишитесь на список рассылки проекта, за которым все еще следует несколько оригинальных разработчиков Podofo. Сообщество погрузчиков также было создано, чтобы облегчить более неформальную болтовню. Если вы найдете ошибку и знаете, как ее исправить, или вы хотите добавить небольшую функцию, вы можете отправить запрос на привлечение, при условии, что он следует за стилем кодирования проекта. Как минимальный необходимый, любой вклад должен быть:
Другие причины отклонения или удержания запроса на тягу могут быть:
Если вам нужно реализовать более крупную функцию или рефактор, сначала спросите, было ли она уже запланирована. Эта функция может быть подлежит захвату, что означает, что она открыта для внешних вкладов. Пожалуйста, напишите в соответствующем выпуске, в котором вы начали работать над этим, чтобы получить некоторую отзыв/координацию. Если это не так, это означает, что рефактор/функция планируется реализовать позже сопровождающими. Если функция не указана в этих вопросах, добавьте ее и/или создайте обсуждение, чтобы получить некоторую отзыв и обсудить некоторые базовые варианты дизайна.
Предупреждение : Пожалуйста, не используйте личные адреса электронной почты для технической поддержки, но вместо этого создайте проблемы GitHub.
Podofo в настоящее время разрабатывается и поддерживается Francesco Pretto вместе с Домиком Сейхтером и другими. Смотрите файл outrors.md для более подробной информации.