Podofo est une bibliothèque C ++ portable libre pour travailler avec le format de fichier PDF.
Podofo fournit des classes pour analyser un fichier PDF et modifier son contenu en mémoire. Les modifications peuvent être écrites facilement sur le disque. En outre, PDF l'analyse Podofo fournit également des installations pour créer vos propres fichiers PDF à partir de zéro. Il ne prend actuellement pas en charge le rendu du contenu PDF.
Pour construire du podofo lib, vous aurez besoin d'un compilateur C ++ 17, CMake 3.16 et les bibliothèques suivantes (versions minimales provisoires indiquées):
Pour les chaînes d'outils les plus populaires, Podofo nécessite les versions minimales suivantes:
Il est régulièrement testé avec les versions IDE / Toolkains suivantes:
Le support GCC 8.x a brisé récemment, mais il pourrait être rétabli.
La bibliothèque Podofo est sous licence en vertu des termes LGPL 2.0 ou ultérieurs. Les outils Podofo sont sous licence dans les termes GPL 2.0 ou ultérieurs.
Podofo est connu pour compiler une multitude de gestionnaires de packages (y compris apt-get , Brew, VCPKG, Conan), et a une intégration continue publique en travaillant dans Ubuntu Linux, MacOS et Windows, en constructif du projet CMake, en construisant et en testant la bibliothèque. Il est fortement recommandé de créer du podofo à l'aide de ces gestionnaires de packages.
Il y a aussi une aire de jeux dans le référentiel où vous pouvez avoir accès à des dépendances pré-construction pour certaines architectures / systèmes d'exploitation populaires: le terrain de jeu est le paramètre recommandé pour développer la bibliothèque et reproduire des bogues, bien qu'il ne soit pas recommandé pour le déploiement de votre application à l'aide de Podofo. Jetez un œil à la lecture là-bas.
AVERTISSEMENT : Podofo est connu pour travailler dans des chaînes d'outils croisées (par exemple, le développement d'Android / IOS), mais le support peut ne pas être fourni dans de tels scénarios. Si vous décidez de construire manuellement les dépendances, vous êtes supposé savoir comment identifier les affrontements / décalages de bibliothèque possibles et comment faire face aux problèmes de compilation / de liaison qui peuvent survenir dans votre système.
De la course de racine source:
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
Installez Brew, puis à partir de l'exécution de la racine source:
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
Installez Conan, puis à partir de la course de la racine source:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Suivez le guide VCPKG QuickStart pour configurer d'abord le référentiel du gestionnaire de packages. Dans Windows, il peut également être utile de définir la variable d'environnement VCPKG_DEFAULT_TRIPLET sur x64-windows sur l'installation par défaut des dépendances 64 bits et définir une variable VCPKG_INSTALLATION_ROOT avec l'emplacement du référentiel comme créé dans le start.
Puis à partir de la course de la racine source:
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 : construire les tests unitaires, par défaut true;
PODOFO_BUILD_EXAMPLES : construire les exemples, par défaut true;
PODOFO_BUILD_UNSUPPORTED_TOOLS : créez les outils de podofo, par défaut est faux. Voir la section pertinente dans le Readme;
PODOFO_BUILD_LIB_ONLY : si vrai, il ne construira que le composant de la bibliothèque. Cela désactive inconditionnellement des tests de construction, des exemples et des outils;
PODOFO_BUILD_STATIC : si vrai, créez la bibliothèque en tant qu'objet statique et utilisez-les dans des tests, des exemples et des outils. Par défaut, une bibliothèque partagée est construite.
Si vous souhaitez utiliser une construction statique de podofo et que vous incluez le projet Podofo Cmake, c'est très simple. Faites quelque chose comme ce qui suit dans votre projet 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)
Si vous liez avec une version statique précompilée de podofo, c'est un scénario où le support est limité, car vous êtes vraiment censé être en mesure d'identifier et de corriger les erreurs de liaison. Les étapes générales sont:
PODOFO_STATIC à votre projet, ou avant d'inclure podofo.h ;podofo.a , podofo_private.a (ou podofo.lib , podofo_private.lib avec msvc) et toutes les bibliothèques dépendantes. La documentation de l'API se trouve sur https://podofo.github.io/podofo/documentation/.
Préalable : assurez-vous que le doxygen est installé sur votre machine. Sinon, visitez le site officiel de Doxygen pour le télécharger et l'installer.
Génération de documentation : Après avoir terminé le processus de construction détaillé dans le chapitre de développement QuickStart, accédez au répertoire racine du code source de Podofo. Ouvrez un terminal ou une invite de commande et exécutez la commande suivante:
doxygen build/Doxyfile Affichage de la documentation : Une fois la génération de documentation terminée, vous trouverez un répertoire documentation qui contient la documentation générée. Ouvrez index.html dans votre navigateur Web préféré pour afficher la documentation de l'API.
cd build/doxygen/documentation
open index.html Toutes std::strings ou std::string_view de la bibliothèque sont destinées à contenir du contenu de chaîne codé UTF-8. Les constructeurs PdfString et PdfName acceptent les chaînes codées UTF-8 par défaut ( PdfName accepte uniquement les caractères dans le jeu de char PdfDocEncoding , cependant). charbuff ABD bufferview représente à la place un tampon octet générique.
Podofo a une API instable qui est le résultat d'une revue API approfondie de Podofo 0.9.x. Sur ce lien, vous pouvez trouver un guide incomplet sur la migration de 0,9,8 code à 0,10.0. Il est prévu que Podofo convergera vers une API stable dès la fin du processus d'examen. Voir la stabilité de l'API pour plus de détails.
AVERTISSEMENT : Les outils ne sont actuellement pas pris en charge , non testés et non entretenus .
Les outils Podofo sont toujours disponibles dans l'arborescence source, mais leur compilation est désactivée par défaut car elles ne sont pas mises / non cachées et ne recevront pas l'assistance tant que leur statut n'est pas effacé. Il n'est pas recommandé de les inclure dans les distributions de logiciels. Si vous souhaitez les construire, assurez-vous de bootstrap le projet CMake avec -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE . Les outils sont facilement activés dans le terrain de jeu au moins pour s'assurer que les modifications de la bibliothèque ne briseront pas leur compilation.
Il y a une liste de TODO ou regardez le tracker du problème.
Q: Comment signer un document?
R: Podofo Head fournit désormais une procédure de signature de haut niveau qui est très puissante et qui permet de signer un document sans avoir à fournir une structure CMS manuellement. Par défaut, il prend en charge la signature d'un document avec les profils de conformité PAdES-B modernes, mais il y a également un support pour les signatures héritées PKCS7. À condition que vous ayez à la fois un certificat X509 encodé ASN.1 et une clé privée RSA, vous pouvez signer un document avec le code suivant:
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);Il existe également une prise en charge des services de signature externes et / ou de la signature du document dans des tampons de mémoire. Voir les différents exemples de signature dans les tests unitaires.
Q: Puis-je toujours utiliser une procédure basée sur des événements pour signer le document?
Oui, l'ancienne procédure de bas niveau n'a pas changé et elle est toujours disponible. Pour décrire la procédure brièvement, il faut implémenter pleinement un PdfSigner , récupérer ou créer un champ PdfSignature , créer un périphérique de sortie (voir la question suivante) et utiliser PoDoFo::SignDocument(doc, device, signer, signature) . Lors de la signature, la séquence des appels de PdfSignature fonctionne de cette manière: la méthode PdfSigner::Reset() est appelée d'abord, alors le PdfSigner::ComputeSignature(buffer, dryrun) est appelé avec un tampon vide et l'argument dryrun défini sur true . Dans cet appel, on peut simplement redimensionner le tampon surestimant la taille requise pour la signature, ou simplement calculer une fausse signature qui doit être enregistrée sur le tampon. Ensuite, une séquence de PdfSigner::AppendData(buffer) est appelée, recevant toutes les données de document à signer. Un PdfSigner::ComputeSignature(buffer, dryrun) est appelé, avec le paramètre dryrun défini sur false . Le tampon de cet appel est effacé (la capacité n'est pas modifiée) ou non en conséquence à la valeur de PdfSigner::SkipBufferClear() .
Q: PdfMemDocument::SaveUpdate() ou PoDoFo::SignDocument() Écrivez uniquement un fichier partiel: pourquoi il n'y a pas de mécanisme pour gérer de manière transparente la mise à jour incrémentielle telle qu'elle était dans Podofo 0.9.x? Que faire pour mettre à jour / signer correctement le document?
R: Le mécanisme précédent de Podofo 0.9.x a nécessité une activité de document pour les mises à jour incrémentielles, qui est une étape de décision qui, je pense, devrait être inutile. Aussi:
Une autre stratégie qui montre clairement le fait que la mise à jour incrémentielle doit être effectuée sur le même fichier à partir de la charge du document, ou que le tampon sous-jacent augmentera sa consommation dememoire après des opérations ultérieures en cas de documents chargés de tampons, est disponible. Il suit quelques exemples montrant les opérations correctes pour mettre à jour un document, chargé à partir du fichier ou du tampon:
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);La signature des documents peut être effectuée avec la même technique, lisez les autres questions pour plus d'exemples.
Q: Puis-je signer un document une deuxième fois?
R: Oui, ceci est testé, mais pour vous assurer que cela fonctionnera, vous vous révèlera pour recommencer le document une deuxième fois, car la réutilisation du document déjà chargé est toujours non testée (cela peut changer plus tard). Par exemple, vous pouvez faire ce qu'il suit:
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 peut fonctionner ou non pour vos besoins et ne comporte absolument aucune garantie. Les bogues graves, y compris les défauts de sécurité, peuvent être corrigées à des délais arbitraires ou non corrigées. La priorité de la mise en œuvre de nouvelles fonctionnalités et de la fixation de bogues est décidée en fonction des intérêts et des préférences personnelles des responsables. Si vous avez besoin de podofo pour intégrer une fonction ou une correction de bogue qui est essentielle à votre flux de travail, l'approche la plus bienvenue et la plus rapide est de contribuer des correctifs de haute qualité.
Veuillez vous abonner à la liste de diffusion du projet qui est toujours suivie par plusieurs des développeurs originaux de Podofo. Une communauté Gitter a également été créée pour soulager des bavardages plus informels. Si vous trouvez un bogue et savez comment le corriger, ou si vous souhaitez ajouter une petite fonctionnalité, vous êtes invités à envoyer une demande de traction, à condition qu'il suit le style de codage du projet. En tant que minimum requis, toute contribution doit être:
D'autres raisons du rejet, ou de la main, d'une demande de traction peuvent être:
Si vous devez implémenter une fonctionnalité ou un refactor plus important, demandez d'abord si elle était déjà prévue. La fonctionnalité peut être à gagner, ce qui signifie qu'elle est ouverte pour les contributions externes. Veuillez écrire dans la question pertinente sur laquelle vous avez commencé à travailler sur cela, pour recevoir des commentaires / coordination. Si ce n'est pas le cas, cela signifie que le refactor / fonctionnalité devrait être mis en œuvre plus tard par le (s) responsable (s). Si la fonctionnalité n'est pas répertoriée dans les problèmes, ajoutez-le et / ou créez une discussion pour recevoir des commentaires et discutez de certains choix de conception de base.
AVERTISSEMENT : Veuillez ne pas utiliser d'adresses e-mail personnelles pour les inquurries de support technique, mais créez des problèmes GitHub à la place.
Podofo est actuellement développé et entretenu par Francesco Pretto, avec Dominik Seichter et autres. Voir le fichier auteurs.md pour plus de détails.