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.