Hur man laddar ett dokument i C++

Hur man laddar ett dokument i C++

Aspose.PDF FOSS för C++ öppnar en befintlig PDF via Document-klassen — från en enkel filsökväg, eller med ett lösenord när källan är krypterad — och exponerar filens /Info-metadata via DocumentInfo. Denna guide täcker inläsning av ett dokument, upptäckt och öppning av lösenordsskyddade filer, läsning och uppdatering av titel/author/producer-metadata, och sparande av resultatet. Biblioteket läggs till i ett projekt via CMake; det finns inget installationssteg med paket-hanterare.

Steg-för-steg-guide

Steg 1: Installera paketet

Lägg till biblioteket som en CMake-undermapp och länka mot aspose_pdf_foss-målet:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Verifiera att verktygskedjan och header-filerna löser sig genom att kompilera ett minimalt program:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}

En lyckad byggnad som skriver ut pages: 0 bekräftar att biblioteket är korrekt länkat.


Steg 2: Importera nödvändiga klasser

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>

using namespace Aspose::Pdf;

Document och DocumentInfo deklareras båda direkt under Aspose::Pdf-namnutrymmet.


Steg 3: Öppna ett PDF-dokument från en filsökväg

Konstruktorn Document(filename) läser filen, tolkar dess korsreferenstabell och sidträd, och bygger den minnesbaserade modellen. Den kastar std::system_error när filen inte finns eller inte kan läsas, och std::runtime_error när filen inte är en giltig PDF:

#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";
}

Steg 4: Öppna ett lösenordsskyddat dokument

Den enkla-argumentkonstruktorn från Steg 3 autentiserar aldrig ett lösenord eller granskar trailer-/Encrypt-posten, så IsEncrypted() på ett dokument som öppnas på det sättet rapporterar alltid false — även när källfilen faktiskt är krypterad. För att upptäcka och öppna en krypterad PDF, använd två-argumentkonstruktorn, som läser /Encrypt och autentiserar det lösenord du anger:

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";
}

Om käll-PDF:en inte är krypterad ignoreras lösenordsargumentet helt enkelt och dokumentet öppnas normalt — så det är säkert att använda två-argumentkonstruktorn även när du inte är säker på om en fil är skyddad.


Steg 5: Läs dokumentmetadata med DocumentInfo

Document.Info() returnerar en DocumentInfo& bunden till dokumentets /Info ordbok. Varje fördefinierat fält har sin egen läsaccessor, som returnerar en tom sträng när nyckeln saknas i källfilen:

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 rapporterar huruvida ett givet /Info nyckelnamn är ett av dessa inbyggda fält, snarare än en anpassad nyckel som lagts till med Add:

bool builtin = DocumentInfo::IsPredefinedKey("Title");   // true
bool custom  = DocumentInfo::IsPredefinedKey("MyKey");   // false

Steg 6: Uppdatera metadata och spara dokumentet

Ställ in metadata via de matchande setter-överladdningarna, eller via SetTitle bekvämlighetsmetod på Document, och spara sedan ändringen med Save:

Document doc("input.pdf");
doc.Info().Author("Report Generator");
doc.SetTitle("Quarterly Report");   // equivalent to doc.Info().Title(title)

doc.Save("output.pdf");

Metadata-ändringar hålls i minnet och skrivs först ut vid nästa Save-anrop. Anropa Save(outputFileName) för att skriva till en ny sökväg, eller den argumentlösa Save() för att skriva över filen som dokumentet ursprungligen öppnades från:

Document doc("input.pdf");
doc.SetTitle("Updated In Place");
doc.Save();   // writes back to "input.pdf"

Vanliga problem och lösningar

IsEncrypted() returns false för en PDF som jag vet är lösenordsskyddad

Den enkla-argument Document(path)-konstruktorn autentiserar aldrig mot filens /Encrypt-lexikon, så IsEncrypted() rapporterar alltid false på ett dokument som öppnas på detta sätt, oavsett om källan faktiskt är krypterad. Öppna filen med den två-argument Document(path, password)-konstruktorn istället — den är den enda överlagringen som fyller i krypteringsstatusen.

Den två-argumentskonstruktorn kastar std::runtime_error

Detta betyder att käll-PDF:en har en /Encrypt-post i sin trailer och det angivna lösenordet matchade varken användar- eller ägarlösenordet som är lagrat där. Fånga std::runtime_error och be om rätt lösenord, eller bekräfta lösenordet utanför kanalen innan du försöker igen.

Save() kastar “no source filename to save to”

Den utan-argument Save() skriver tillbaka till sökvägen som ett dokument konstruerades från. En Document skapad med utan-argument-konstruktorn — ett färskt, minnes-dokument utan källfil — har ingen sökväg att skriva tillbaka till, så Save() kastar. Anropa Save(outputFileName) istället.

Decrypt() verkar inte producera en oskyddad fil

Decrypt() rensar den minnes-IsEncrypted()-flaggan så att efterföljande läsningar behandlar dokumentet som klartext, men i den nuvarande versionen skriver den inte om trailerens /Encrypt-lexikon eller återkodar krypterade strängar och strömmar. Ett Save()-anrop efter Decrypt() skriver fortfarande tillbaka de ursprungliga byten, inklusive den ursprungliga krypteringen — den här metoden producerar ännu inte en klartextkopia på disken.

Titel/Författare/etc. skrivs ut som tomma strängar

DocumentInfo accessors returnerar en tom sträng, inte ett fel, när motsvarande /Info nyckel saknas i käll-PDF-filen. Ett tomt resultat betyder att fältet aldrig har satts i det dokumentet, inte att läsningen misslyckades.

Vanliga frågor

Fungerar Document(path) på en krypterad PDF?

Den analyserar vanligtvis sidträdet utan att kasta ett undantag, men den autentiserar aldrig ett lösenord och lämnar alltid IsEncrypted() på false. Använd two-argument constructor när källan eventuellt kan vara krypterad.

Är det säkert att skicka ett lösenord till Document(path, password) för en fil som visar sig inte vara krypterad?

Ja. När trailern har ingen /Encrypt-post ignoreras lösenordsargumentet och dokumentet öppnas på samma sätt som med single-argument constructor.

Hur kan jag skilja en anpassad /Info-nyckel från en inbyggd?

Anropa den statiska DocumentInfo::IsPredefinedKey(key). Den returnerar true för Title, Author, Subject, Keywords, Creator, Producer och Trapped, och false för allt annat.

Kan jag skriva över filen jag just laddade istället för att skriva till en ny sökväg?

Ja — anropa den argumentlösa Save() på en Document som konstruerades från en filsökväg; den skriver tillbaka till samma källsökväg. Den kastar ett undantag för dokument som byggts med den argumentlösa konstruktorn, vilka saknar källsökväg.

Tar sparande efter Decrypt() bort PDF:ens lösenordsskydd?

Nej, inte i den aktuella versionen — se Vanliga problem ovan. Decrypt() påverkar endast minnesstatus som används av innehållsläsare; filen som skrivs av Save() behåller fortfarande den ursprungliga /Encrypt-ordboken.

Se även

 Svenska