Hoe een document te laden in C++
Aspose.PDF FOSS voor C++ opent een bestaande PDF via de Document klasse — vanaf een gewoon bestandspad, of met een wachtwoord wanneer de bron versleuteld is — en maakt de /Info metadata van het bestand beschikbaar via DocumentInfo. Deze gids behandelt het laden van een document, het detecteren en openen van met wachtwoord beveiligde bestanden, het lezen en bijwerken van title/author/producer metadata, en het opslaan van het resultaat. De bibliotheek wordt aan een project toegevoegd via CMake; er is geen package-manager installatiestap.
Stapsgewijze gids
Stap 1: Installeer het pakket
Voeg de bibliotheek toe als een CMake-subdirectory en link tegen de aspose_pdf_foss target:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)Controleer of de toolchain en headers worden gevonden door een minimaal programma te compileren:
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc;
std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}Een succesvolle build die pages: 0 afdrukt bevestigt dat de bibliotheek correct is gelinkt.
Stap 2: Vereiste klassen importeren
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
using namespace Aspose::Pdf;Document en DocumentInfo zijn beide direct gedeclareerd onder de Aspose::Pdf namespace.
Stap 3: Open een PDF-document via een bestandspad
De Document(filename) constructor leest het bestand, parseert de kruisverwijzingstabel en paginaboom, en bouwt het in-memory model op. Hij gooit std::system_error wanneer het bestand niet bestaat of niet gelezen kan worden, en std::runtime_error wanneer het bestand geen geldige PDF is:
#include <iostream>
#include <stdexcept>
try {
Document doc("input.pdf");
std::cout << "Pages: " << doc.Pages().Count() << "\n";
} catch (const std::runtime_error& e) {
std::cerr << "Not a valid PDF: " << e.what() << "\n";
} catch (const std::system_error& e) {
std::cerr << "Could not read file: " << e.what() << "\n";
}Stap 4: Open een wachtwoordbeveiligd document
De één-argument constructor uit Stap 3 verifieert nooit een wachtwoord of inspecteert de /Encrypt entry van de trailer, waardoor IsEncrypted() op een op die manier geopend document altijd false rapporteert — zelfs wanneer het bronbestand daadwerkelijk versleuteld is. Om een versleutelde PDF te detecteren en te openen, gebruik de twee-argument constructor, die /Encrypt leest en het door jou opgegeven wachtwoord authenticeert:
try {
Document doc("input.pdf", "user-password");
if (doc.IsEncrypted()) {
std::cout << "Opened an encrypted document.\n";
}
} catch (const std::runtime_error& e) {
// Thrown when /Encrypt is present and the password matches
// neither the user nor the owner entry in the trailer.
std::cerr << "Wrong password or unreadable /Encrypt dictionary: "
<< e.what() << "\n";
}Als de bron-PDF niet versleuteld is, wordt het wachtwoordargument simpelweg genegeerd en opent het document normaal — dus het is veilig om de twee-argument constructor te gebruiken, zelfs als je niet zeker weet of een bestand beschermd is.
Stap 5: Lees documentmetadata met DocumentInfo
Document.Info() retourneert een DocumentInfo& gebonden aan de /Info woordenboek van het document. Elk vooraf gedefinieerd veld heeft zijn eigen leestoegang, die een lege string teruggeeft wanneer de sleutel afwezig is in het bronbestand:
Document doc("input.pdf");
DocumentInfo& info = doc.Info();
std::cout << "Title: " << info.Title() << "\n";
std::cout << "Author: " << info.Author() << "\n";
std::cout << "Subject: " << info.Subject() << "\n";
std::cout << "Producer: " << info.Producer() << "\n";
std::cout << "Creator: " << info.Creator() << "\n";
std::cout << "Keywords: " << info.Keywords() << "\n";DocumentInfo::IsPredefinedKey geeft aan of een gegeven /Info sleutelwaarde een van deze ingebouwde velden is, in tegenstelling tot een aangepaste sleutel die is toegevoegd met Add:
bool builtin = DocumentInfo::IsPredefinedKey("Title"); // true
bool custom = DocumentInfo::IsPredefinedKey("MyKey"); // false
Stap 6: Metagegevens bijwerken en het document opslaan
Stel metagegevens in via de overeenkomende setter-overloads, of via de SetTitle gebruiksmethode op Document, en sla vervolgens de wijziging op met Save:
Document doc("input.pdf");
doc.Info().Author("Report Generator");
doc.SetTitle("Quarterly Report"); // equivalent to doc.Info().Title(title)
doc.Save("output.pdf");Metagegevensbewerkingen worden in het geheugen klaargezet en pas weggeschreven bij de volgende Save-aanroep. Roep Save(outputFileName) aan om naar een nieuw pad te schrijven, of de argumentloze Save() om het bestand te overschrijven waar het document oorspronkelijk van werd geopend:
Document doc("input.pdf");
doc.SetTitle("Updated In Place");
doc.Save(); // writes back to "input.pdf"
Veelvoorkomende problemen en oplossingen
IsEncrypted() returns false voor een PDF waarvan ik weet dat deze met een wachtwoord is beveiligd
De single-argument Document(path) constructor authenticert nooit tegen het /Encrypt woordenboek van het bestand, dus IsEncrypted() meldt altijd false op een op deze manier geopend document, ongeacht of de bron daadwerkelijk versleuteld is. Open het bestand in plaats daarvan met de two-argument Document(path, password) constructor — dit is de enige overload die de versleutelingsstatus invult.
De twee-argumentenconstructor gooit std::runtime_error
Dit betekent dat de bron-PDF een /Encrypt entry in zijn trailer heeft en het opgegeven wachtwoord overeenkwam met noch het gebruikers- noch het eigenaren-wachtwoord dat daar is vastgelegd. Vang std::runtime_error op en vraag om het juiste wachtwoord, of bevestig het wachtwoord buiten de band voordat u het opnieuw probeert.
Save() gooit “no source filename to save to”
De no-argument Save() schrijft terug naar het pad waaruit een document is geconstrueerd. Een Document gemaakt met de no-argument constructor — een nieuw, in-memory document zonder bronbestand — heeft geen pad om naar terug te schrijven, waardoor Save() gooit. Roep in plaats daarvan Save(outputFileName) aan.
Decrypt() lijkt geen onbeveiligd bestand te produceren
Decrypt() wist de in-memory IsEncrypted() vlag zodat downstream lezers het document als platte tekst behandelen, maar in de huidige release herschrijft het de /Encrypt woordenboek van de trailer niet of codeert versleutelde strings en streams niet opnieuw. Een Save() oproep na Decrypt() schrijft nog steeds de oorspronkelijke bytes terug, inclusief de oorspronkelijke versleuteling — deze methode produceert nog geen platte-tekst kopie op schijf.
Titel/Auteur/etc. worden afgedrukt als lege strings
DocumentInfo accessors retourneren een lege string, niet een fout, wanneer de overeenkomstige /Info-sleutel ontbreekt in de bron-PDF. Een leeg resultaat betekent dat het veld nooit op dat document is ingesteld, niet dat het lezen is mislukt.
Veelgestelde vragen
Werkt Document(path) op een versleutelde PDF?
Het parseert doorgaans de paginaboom zonder een uitzondering te gooien, maar het authenticeert nooit een wachtwoord en laat IsEncrypted() altijd op false staan. Gebruik de constructor met twee argumenten wanneer de bron mogelijk versleuteld is.
Is het veilig om een wachtwoord door te geven aan Document(path, password) voor een bestand dat uiteindelijk niet versleuteld blijkt te zijn?
Ja. Wanneer de trailer geen /Encrypt-vermelding heeft, wordt het wachtwoordargument genegeerd en wordt het document op dezelfde manier geopend als met de constructor met één argument.
Hoe onderscheid ik een aangepaste /Info-sleutel van een ingebouwde?
Roep de statische DocumentInfo::IsPredefinedKey(key) aan. Het retourneert true voor Title, Author, Subject, Keywords, Creator, Producer en Trapped, en false voor alles anders.
Kan ik het bestand dat ik zojuist heb geladen overschrijven in plaats van naar een nieuw pad te schrijven?
Ja — roep de argumentloze Save() aan op een Document die is geconstrueerd vanuit een bestandspad; hij schrijft terug naar datzelfde bronpad. Het gooit een uitzondering voor documenten die zijn gebouwd met de argumentloze constructor, die geen bronpad hebben.
Verwijdert opslaan na Decrypt() de wachtwoordbeveiliging van de PDF?
Nee, niet in de huidige release — zie Common Issues hierboven. Decrypt() beïnvloedt alleen de in-memory-status die door contentreaders wordt gebruikt; het bestand dat door Save() wordt geschreven, bevat nog steeds het oorspronkelijke /Encrypt-woordenboek.