Podofo ist eine kostenlose tragbare C ++ - Bibliothek für die Arbeit mit dem PDF -Dateiformat.
Podofo bietet Klassen, um eine PDF -Datei zu analysieren und seinen Inhalt in den Speicher zu ändern. Die Änderungen können leicht auf die Festplatte zurückgeschrieben werden. Neben dem PDF -Parsing Podofo bietet auch Möglichkeiten, Ihre eigenen PDF -Dateien von Grund auf neu zu erstellen. Derzeit unterstützt es keine Rendern von PDF -Inhalten.
Um Podofo Lib zu erstellen, benötigen Sie einen C ++ 17 Compiler, CMake 3.16 und die folgenden Bibliotheken (vorliegende Mindestversionen angegeben):
Für die beliebtesten Toolchains benötigt Podofo die folgenden Mindestversionen:
Es wird regelmäßig mit den folgenden IDE/Toolchains -Versionen getestet:
Die Unterstützung von GCC 8.x ist in letzter Zeit bekannt, aber sie könnte wieder festgelegt werden.
Die Podofo -Bibliothek ist unter den LGPL 2.0 oder späteren Begriffen lizenziert. Podofo -Tools sind unter den GPL 2.0 oder späteren Begriffen lizenziert.
Es ist bekannt, dass Podofo durch eine Vielzahl von Paketmanagern (einschließlich apt-get , Brew, VCPKG, Conan) kompiliert wird und die öffentliche kontinuierliche Integration in Ubuntu Linux, MacOS und Windows hat, das CMake-Projekt startet, die Bibliothek erstellt und testen. Es wird dringend empfohlen, Podofo mit solchen Paketmanagern zu erstellen.
Es gibt auch einen Spielplatzbereich im Repository, in dem Sie Zugang zu Abhängigkeiten vor dem Gebäude für einige beliebte Architekturen/Betriebssysteme haben können: Der Spielplatz ist die empfohlene Einstellung zur Entwicklung der Bibliothek und zur Reproduzierung von Fehlern, während sie für die Bereitstellung Ihrer Anwendung mithilfe von Podofo nicht empfohlen wird. Schauen Sie sich dort auf die Readme.
WARNUNG : Podofo arbeitet bekanntermaßen in Cross-Compilation-Toolchains (z. B. Android/iOS-Entwicklung), aber die Unterstützung ist jedoch möglicherweise nicht in solchen Szenarien bereitgestellt. Wenn Sie sich entscheiden, Abhängigkeiten manuell zu erstellen, wird davon ausgegangen, dass Sie wissen, wie mögliche Bibliotheksübereinstimmungen/Fehlanpassungen identifiziert werden und wie Sie mit Kompilierungs-/Verknüpfungsproblemen umgehen können, die in Ihrem System auftreten können.
Aus dem Quell -Root -Lauf:
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
Installieren Sie Brew und dann aus dem Quell -Root -Lauf:
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
Installieren Sie Conan und dann vom Quell -Root -Lauf:
mkdir build
cd build
conan install ..
cmake -DCMAKE_BUILD_TYPE=Debug ..
cmake --build . --config Debug
Folgen Sie dem VCPKG QuickStart -Handbuch, um das Paket -Manager -Repository zuerst einzurichten. In Windows kann es auch nützlich sein, die Umgebungsvariable VCPKG_DEFAULT_TRIPLET auf x64-windows so zu setzen, dass sie 64-Bit-Abhängigkeiten standardmäßig installiert und eine VCPKG_INSTALLATION_ROOT Variable mit der Position des Repositorys definiert, wie im QuickStart erstellt.
Dann aus Queller -Root -Lauf:
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 : Erstellen Sie die Unit -Tests, standardmäßig auf wahr;
PODOFO_BUILD_EXAMPLES : Erstellen Sie die Beispiele, standardmäßig zu true;
PODOFO_BUILD_UNSUPPORTED_TOOLS : Erstellen Sie die Podofo -Tools, standardmäßig auf False. Siehe den relevanten Abschnitt im Readme;
PODOFO_BUILD_LIB_ONLY : Wenn wahr, wird nur die Bibliothekskomponente erstellt. Dies deaktiviert bedingungslos Gebäudetests, Beispiele und Werkzeuge;
PODOFO_BUILD_STATIC : Wenn wahr, erstellen Sie die Bibliothek als statisches Objekt und verwenden Sie sie in Tests, Beispielen und Tools. Standardmäßig wird eine freigegebene Bibliothek erstellt.
Wenn Sie einen statischen Aufbau von Podofo verwenden möchten und das Podofo -Cmake -Projekt einbeziehen, ist dies sehr einfach. Machen Sie in Ihrem CMAKE -Projekt so etwas wie Folgendes:
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)
Wenn Sie mit einem vorkompilierten statischen Aufbau von Podofo verknüpfen, ist dies ein Szenario, in dem die Unterstützung begrenzt ist, da Sie wirklich in der Lage sein sollen, Verknüpfungsfehler zu identifizieren und zu beheben. Die allgemeinen Schritte sind:
podofo.h PODOFO_STATIC Compilation Definition hinzu;podofo.a , podofo_private.a (oder podofo.lib , podofo_private.lib mit MSVC) und allen abhängigen Bibliotheken. Die API -Dokumentation finden Sie unter https://podofo.github.io/podofo/documentation/.
Voraussetzung : Stellen Sie sicher, dass Sie Doxygen auf Ihrem Computer installiert haben. Wenn nicht, besuchen Sie die offizielle Website von Doxygen, um sie herunterzuladen und zu installieren.
Dokumentation generieren : Navigieren Sie nach Abschluss des im Kapitels von Development QuickStart beschriebenen Build -Prozess zum Quellcode von Podofo. Öffnen Sie eine Terminal- oder Eingabeaufforderung und führen Sie den folgenden Befehl aus:
doxygen build/Doxyfile Anzeigen der Dokumentation : Nach Abschluss der Dokumentationsgenerierung finden Sie ein documentation , das die generierte Dokumentation enthält. Öffnen Sie index.html in Ihrem bevorzugten Webbrowser, um die API -Dokumentation anzuzeigen.
cd build/doxygen/documentation
open index.html Alle std::strings oder std::string_view in der Bibliothek sollen UTF-8-codierter String-Inhalt halten. PdfString und PdfName Konstruktoren akzeptieren standardmäßig UTF-8-codierte Zeichenfolgen ( PdfName akzeptieren jedoch nur Zeichen im PdfDocEncoding -Zeichensatz). charbuff ABD bufferview stellt stattdessen einen generischen Oktettpuffer dar.
Podofo hat eine instabile API, die das Ergebnis einer umfassenden API -Überprüfung von Podofo 0.9.x. ist. Bei diesem Link finden Sie eine unvollständige Anleitung zum Migrieren von 0.9.8 Code auf 0.10.0. Es wird erwartet, dass Podofo zu einer stabilen API konvergieren wird, sobald der Überprüfungsprozess abgeschlossen ist. Weitere Informationen finden Sie unter API -Stabilität.
WARNUNG : Die Werkzeuge sind derzeit nicht unterstützt , ungetestet und nicht gehört .
Podofo -Tools sind im Quellbaum weiterhin verfügbar, aber ihre Zusammenstellung ist standardmäßig deaktiviert, da sie nicht mehr und nicht berücksichtigt sind und erst dann Unterstützung erhalten, wenn ihr Status gelöscht wird. Es wird nicht empfohlen, sie in Softwareverteilungen aufzunehmen. Wenn Sie sie erstellen möchten, stellen Sie sicher, dass Sie das CMAKE -Projekt mit -DPODOFO_BUILD_UNSUPPORTED_TOOLS=TRUE starten. Tools werden zumindest auf dem Spielplatz bequem aktiviert, um sicherzustellen, dass sich die Änderungen der Bibliothek nicht über ihre Zusammenstellung auswirken.
Es gibt eine TODO -Liste oder schauen Sie sich den Ausgabe -Tracker an.
F: Wie unterschreibe ich ein Dokument?
A: Der Podofo -Kopf liefert nun ein hochstufiges Unterschriftenverfahren, das sehr leistungsfähig ist und ein Dokument unterschreiben kann, ohne eine CMS -Struktur manuell liefern zu müssen. Standardmäßig unterstützt es die Unterzeichnung eines Dokuments mit den Modern PAdES-B Compliance-Profilen, aber es gibt auch eine Unterstützung für die älteren PKCS7-Signaturen. Vorausgesetzt, Sie haben sowohl einen codierten X509 -Zertifikat von ASN.1 als auch RSA Private Key, können Sie ein Dokument mit dem folgenden Code unterschreiben:
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);Es gibt auch eine Unterstützung für externe Unterzeichnungsdienste und/oder die Unterzeichnung des Dokuments in Speicherpuffer. Siehe die verschiedenen Unterzeichnungsbeispiele in den Unit -Tests.
F: Kann ich noch ein ereignisbasiertes Verfahren verwenden, um das Dokument zu unterschreiben?
Ja, das alte Verfahren mit niedriger Ebene hat sich nicht geändert und ist noch verfügbar. Um das Verfahren kurz zu beschreiben, muss man einen PdfSigner vollständig implementieren, ein PdfSignature -Feld abrufen oder erstellen, ein Ausgabegerät (siehe nächste Frage) erstellen und PoDoFo::SignDocument(doc, device, signer, signature) verwenden. Bei der Unterzeichnung funktioniert die Abfolge von Aufrufen PdfSignature auf diese Weise: Methode PdfSigner::Reset() wird zuerst aufgerufen, dann wird der PdfSigner::ComputeSignature(buffer, dryrun) mit einem leeren Puffer und dem dryrun -Argument true . In diesem Anruf kann man nur die Größe des Puffers ändern, der die erforderliche Größe für die Signatur überschätzt, oder einfach eine gefälschte Signatur berechnen, die auf dem Puffer gespeichert werden muss. Dann wird eine Abfolge von PdfSigner::AppendData(buffer) aufgerufen, die alle zu signierten Dokumentdaten empfangen. Ein endgültiger PdfSigner::ComputeSignature(buffer, dryrun) wird aufgerufen, wobei der dryrun -Parameter auf false eingestellt ist. Der Puffer dieses Anrufs wird gelöscht (die Kapazität wird nicht geändert) oder nicht dem Wert von PdfSigner::SkipBufferClear() .
F: PdfMemDocument::SaveUpdate() oder PoDoFo::SignDocument() Schreiben Sie nur eine Teildatei: Warum gibt es keinen Mechanismus, um das inkrementelle Update nahtlos wie in Podofo 0.9.x zu verarbeiten? Was sollte getan werden, um das Dokument richtig zu aktualisieren/zu unterschreiben?
A: Der vorherige Mechanismus in Podofo 0.9.x erforderte die Aktivierung des Dokuments für inkrementelle Aktualisierungen, was ein Entscheidungsschritt ist, von dem ich glaube, dass er nicht erforderlich sein sollte. Auch:
Eine alternative Strategie, die die Tatsache deutlicher macht, dass das inkrementelle Update in derselben Datei durchgeführt werden muss, aus der das Dokument geladen wurde oder dass der zugrunde liegende Puffer seinen mememorischen Verbrauch nach den nachfolgenden Operationen im Falle von Pufferladendokumenten erhöht, ist verfügbar. Es folgt einige Beispiele, die die richtigen Vorgänge zum Aktualisieren eines Dokuments aus Datei oder Puffer zeigen:
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);Unterzeichnungsdokumente können mit derselben Technik durchgeführt werden. Lesen Sie die anderen Fragen, um weitere Beispiele zu erhalten.
F: Kann ich ein Dokument ein zweites Mal unterschreiben?
A: Ja, dies wird getestet, aber um sicherzustellen, dass dies funktioniert, werden Sie das Dokument ein zweites Mal erneut ansprechen, da die Wiederverwendung des bereits geladenen Dokuments noch nicht getestet ist (dies kann sich später ändern). Zum Beispiel können Sie so tun, wie es folgt:
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 kann für Ihre Bedürfnisse funktionieren oder nicht und hat absolut keine Garantie. Schwerwiegende Fehler, einschließlich Sicherheitsfehler, können in willkürlichen Zeitrahmen oder gar nicht behoben werden. Die Priorität bei der Implementierung neuer Funktionen und Fehlerbehebung wird entsprechend den Interessen und persönlichen Vorlieben der Betreuungen entschieden. Wenn Sie Podofo benötigen, um eine Funktion oder eine Fehlerbehebung zu integrieren, die für Ihren Workflow von entscheidender Bedeutung ist, besteht der willkommenste und schnellste Ansatz darin, qualitativ hochwertige Patches beizutragen.
Bitte abonnieren Sie die Projekt -Mailingliste, auf die einige der ursprünglichen Entwickler von Podofo weiterhin folgen. Eine Gitter -Community wurde auch geschaffen, um ein informelleres Geschwätz zu erleichtern. Wenn Sie einen Fehler finden und wissen, wie Sie ihn beheben oder eine kleine Funktion hinzufügen möchten, können Sie gerne eine Pull -Anfrage senden, sofern sie dem Codierungsstil des Projekts folgt. Als Mindestanforderungen sollte jeder Beitrag sein:
Andere Gründe für die Ablehnung oder den Halten einer Pull -Anfrage können sein:
Wenn Sie eine größere Funktion oder einen Refaktor implementieren müssen, fragen Sie zuerst, ob es bereits geplant ist. Die Funktion kann zu gewinnen sein, was bedeutet, dass sie für externe Beiträge offen ist. Bitte schreiben Sie in das relevante Problem, das Sie damit begonnen haben, ein Feedback/eine Koordination zu erhalten. Wenn dies nicht der Fall ist, bedeutet dies, dass das Refactor/die Feature später von den Betreuer (en) implementiert werden soll. Wenn die Funktion nicht in den Problemen aufgeführt ist, fügen Sie sie hinzu und/oder erstellen Sie eine Diskussion, um Feedback zu erhalten und einige grundlegende Designoptionen zu besprechen.
Warnung : Bitte verwenden Sie keine persönlichen E -Mail -Adressen für technische Support -Inquries, sondern erstellen Sie stattdessen GitHub -Probleme.
Podofo wird derzeit von Francesco Pretto zusammen mit Dominik Seichter und anderen entwickelt und gepflegt. Weitere Informationen finden Sie in den Dateiautoren.md.