Hogyan töltsünk be egy dokumentumot C++-ban

Hogyan töltsünk be egy dokumentumot C++-ban

Aspose.PDF FOSS for C++ meglévő PDF-et nyit meg a Document osztályon keresztül — egy egyszerű fájlúton, vagy jelszóval, ha a forrás titkosított — és elérhetővé teszi a fájl /Info metaadatait a DocumentInfo segítségével. Ez az útmutató a dokumentum betöltését, a jelszóval védett fájlok felismerését és megnyitását, a cím/szerző/producer metaadatok olvasását és frissítését, valamint az eredmény mentését tárgyalja. A könyvtárat CMake-en keresztül adjuk a projekthez; nincs csomagkezelő-telepítési lépés.

Lépésről-lépésre útmutató

1. lépés: A csomag telepítése

Add a könyvtárat CMake alkönyvtárként, és linkeld a aspose_pdf_foss targethez:

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

Ellenőrizd, hogy a toolchain és a fejlécek feloldódnak-e egy minimális program lefordításával:

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

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

Egy sikeres build, amely kiírja a(z) pages: 0 értéket, megerősíti, hogy a könyvtár helyesen van összekapcsolva.


2. lépés: A szükséges osztályok importálása

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

using namespace Aspose::Pdf;

Document és DocumentInfo mindkettő közvetlenül a Aspose::Pdf névtér alatt van deklarálva.


3. lépés: PDF-dokumentum megnyitása fájl útvonalról

A Document(filename) konstruktor beolvassa a fájlt, feldolgozza a keresztreferencia táblát és az oldalfát, és felépíti a memóriában lévő modellt. std::system_error kivételt dob, ha a fájl nem létezik vagy nem olvasható, és std::runtime_error kivételt, ha a fájl nem érvényes 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";
}

4. lépés: Jelszóval védett dokumentum megnyitása

A 3. lépésből származó egyargumentumos konstruktor soha nem hitelesít jelszót, és nem vizsgálja meg a trailer /Encrypt bejegyzését, ezért a így megnyitott dokumentumon a IsEncrypted() mindig false értéket jelent — még akkor is, ha a forrásfájl valóban titkosított. Titkosított PDF felismeréséhez és megnyitásához használd a kétargumentumos konstruktort, amely beolvassa a /Encrypt értéket, és hitelesíti a megadott jelszót:

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

Ha a forrás PDF nincs titkosítva, a jelszó argumentum egyszerűen figyelmen kívül marad, és a dokumentum normál módon nyílik meg — ezért biztonságos a kétargumentumos konstruktor használata, még akkor is, ha nem vagy biztos benne, hogy a fájl védett.


5. lépés: Dokumentum metaadatok olvasása a DocumentInfo segítségével

Document.Info() visszaad egy DocumentInfo&-t, amely a dokumentum /Info szótárához kötődik. Minden előre definiált mezőnek saját olvasó accessor-ára van, amely üres karakterláncot ad vissza, ha a kulcs hiányzik a forrásfájlból:

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 jelzi, hogy egy adott /Info kulcsnév ezek közül a beépített mezők közé tartozik-e, szemben egy Add segítségével hozzáadott egyéni kulccsal:

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

6. lépés: Metaadatok frissítése és a dokumentum mentése

Állítsd be a metaadatokat a megfelelő setter túlterheléseken keresztül, vagy a SetTitle kényelmi metóduson keresztül a Document objektumon, majd mentsd el a változást a Save segítségével:

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

doc.Save("output.pdf");

A metaadat-szerkesztések memóriában kerülnek előkészítésre, és csak a következő Save híváskor íródnak ki. Hívd meg a Save(outputFileName) függvényt egy új útvonalra íráshoz, vagy a argumentum nélküli Save()-t a fájl felülírásához, ahonnan a dokumentum eredetileg meg lett nyitva:

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

Gyakori problémák és megoldások

IsEncrypted() returns false egy PDF-hez, amelyről tudom, hogy jelszóval védett

Az egyargumentumos Document(path) konstruktor soha nem hitelesíti a fájl /Encrypt szótárát, ezért a IsEncrypted() mindig false jelent egy ilyen módon megnyitott dokumentum esetén, függetlenül attól, hogy a forrás valójában titkosított-e. Nyissa meg a fájlt a kétargumentumos Document(path, password) konstruktorral — ez az egyetlen overload, amely feltölti a titkosítási állapotot.

A két argumentumú konstruktor dob std::runtime_error

Ez azt jelenti, hogy a forrás PDF-nek van egy /Encrypt bejegyzése a trailer-ben, és a megadott jelszó sem a felhasználói, sem a tulajdonosi jelszónak nem felelt meg, amely ott van rögzítve. Fogja el a std::runtime_error-t, és kérje be a helyes jelszót, vagy a próbálkozás előtt külső módon erősítse meg a jelszót.

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

Az argumentum nélküli Save() visszaír a dokumentumot létrehozó útvonalra. A Document, amelyet az argumentum nélküli konstruktorral hoztak létre – egy friss, memóriában lévő dokumentum, amelynek nincs forrásfájlja – nem rendelkezik írási úttal, ezért a Save() hibát dob. Hívja inkább a Save(outputFileName)-t.

Decrypt() úgy tűnik, nem hoz létre védtelen fájlt

Decrypt() törli a memóriában lévő IsEncrypted() jelzőt, így a későbbi olvasások a dokumentumot egyszerű szövegként kezelik, de a jelenlegi kiadásban nem írja újra a trailer /Encrypt szótárát, és nem kódolja újra a titkosított karakterláncokat és adatfolyamokat. A Save() hívás a Decrypt() után továbbra is az eredeti bájtokat írja vissza, beleértve az eredeti titkosítást – ez a módszer még nem állít elő egyszerű szöveges másolatot a lemezen.

A cím/szerző/ stb. üres karakterláncokként jelenik meg

DocumentInfo accessorok üres stringet adnak vissza, nem hibát, ha a megfelelő /Info kulcs hiányzik a forrás PDF-ből. Az üres eredmény azt jelenti, hogy a mező soha nem lett beállítva az adott dokumentumban, nem pedig hogy az olvasás sikertelen volt.

Gyakran Ismételt Kérdések

Működik a Document(path) titkosított PDF-en?

Általában a lapfát elemzi hibakivétel nélkül, de soha nem hitelesít jelszót, és mindig IsEncrypted()-t false értéken hagy. Használd a kétparaméteres konstruktorát, ha a forrás titkosított lehet.

Biztonságos a jelszó átadása a Document(path, password) számára egy olyan fájlhoz, amely kiderül, hogy nincs titkosítva?

Igen. Ha a trailerben nincs /Encrypt bejegyzés, a jelszó argumentum figyelmen kívül marad, és a dokumentum ugyanúgy nyílik meg, mint az egyparaméteres konstruktor használatával.

Hogyan tudom megkülönböztetni egy egyéni /Info kulcsot a beépítettől?

Hívd meg a statikus DocumentInfo::IsPredefinedKey(key). true értéket ad vissza Title, Author, Subject, Keywords, Creator, Producer és Trapped esetén, egyébként false értéket.

Felülírhatom a most betöltött fájlt ahelyett, hogy új útvonalra írnám?

Igen — hívja a paraméter nélküli Save()-t egy Document-on, amelyet egy fájl útvonalból hoztak létre; ugyanarra a forrásútvonalra ír vissza. Kivételt dob azoknál a dokumentumoknál, amelyeket a paraméter nélküli konstruktorral hoztak létre, és amelyeknek nincs forrásútvonaluk.

A Decrypt() után mentés eltávolítja a PDF jelszóvédelmét?

Nem, a jelenlegi kiadásban nem — lásd a fenti Gyakori problémákat. A Decrypt() csak a tartalomolvasók által használt memóriabeli állapotra van hatással; a Save() által írt fájl továbbra is tartalmazza az eredeti /Encrypt szótárat.

Lásd még:

 Magyar