Hoe te werken met PDF-documenten in C++

Hoe te werken met PDF-documenten in C++

Aspose.PDF FOSS for C++ is een MIT-gelicentieerde, afhankelijkheidsvrije C++20-bibliotheek gebouwd en gekoppeld met CMake — er is geen package-manager import toe te voegen. Deze gids loopt door de kern-Document-gecentreerde workflow: een bestaand PDF openen, de pagina’s en metadata inspecteren, tekst extraheren, en een pagina renderen naar een rasterafbeelding.

Stapsgewijze handleiding

Stap 1: Installeer het pakket

Kloon de repository en voeg deze toe aan je CMake-project als een subdirectory:

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.git
add_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Of configureer en bouw het standalone:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

Controleer of de toolchain oplost door een minimaal programma te compileren tegen de headers:

#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 voor de net geconstrueerde, lege Document bevestigt dat de bibliotheek correct is gekoppeld.


Stap 2: Vereiste klassen importeren

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <aspose/pdf/page.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>

Stap 3: Open een PDF-document en tel het aantal pagina’s

Construeer een Document vanuit een bestandspad om een bestaande PDF te openen. Document::Pages() retourneert de PageCollection, en Count() meldt hoeveel pagina’s deze bevat:

Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";

Stap 4: Documentmetadata lezen

Document::Info() retourneert een DocumentInfo object met getypeerde lees-/schrijftoegang voor de standaard /Info woordenboekvermeldingen:

auto& info = doc.Info();
std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Producer: " << info.Producer() << "\n";

Stap 5: Tekst extraheren van een pagina

Aspose::Pdf::Text::TextAbsorber doorloopt een Document of een enkele Page en verzamelt de tekst die het tegenkomt; Text() retourneert daarna het resultaat. PageCollection is 1-geïndexeerd, dus Pages()[1] is de eerste pagina:

auto page = doc.Pages()[1];

Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";

Visit() accepteert ook de volledige Document direct (absorber.Visit(doc)) wanneer je alle paginatekst wilt samenvoegen in plaats van een enkele pagina.


Stap 6: Render de pagina naar een rasterafbeelding

BmpDevice rendert een Page naar een ongecomprimeerde BMP-afbeelding. De constructor neemt een Resolution die de output-DPI regelt, en Process() schrijft de gerenderde bytes naar elke std::ostream:

Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));

std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);

Stap 7: Werk metadata bij en sla het document op

Setters op DocumentInfo plannen wijzigingen die worden weggeschreven de volgende keer dat Save() wordt uitgevoerd op de bijbehorende Document:

doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");

Veelvoorkomende problemen en oplossingen

Accessing Pages()[0] throws std::out_of_range

PageCollection is 1-geïndexeerd, overeenkomstig de canonieke Aspose.PDF semantiek — de eerste pagina is Pages()[1]. Een index lager dan 1 of hoger dan Count() gooit een fout.

TextAbsorber::Text() geeft een lege string terug

Text() retourneert wat er door de meest recente Visit()-aanroep is verzameld. Bevestig dat Visit() daadwerkelijk is aangeroepen voordat je Text() leest, en dat de pagina of het document dat je hebt bezocht extracteerbare tekst bevat in plaats van alleen gescande afbeeldingen.

Het gerenderde BMP-bestand is onverwacht klein of lijkt leeg

Een lage Resolution-waarde produceert een klein rasterbeeld. Verhoog de DPI die aan Resolution wordt doorgegeven — bijvoorbeeld Resolution(300) voor afdrukkwaliteit — en bevestig dat de pagina-index die aan Process() wordt doorgegeven degene is die je bedoeld had.

DocumentInfo velden worden teruggelezen als lege strings

Niet elke PDF-producent schrijft standaard /Info-vermeldingen. Controleer Producer() en Creator() op lege waarden voordat je aanneemt dat metadata-extractie is mislukt — een lege string is het gedefinieerde resultaat voor een ontbrekende sleutel.

Wijzigingen gemaakt met Info().Title(...) verschijnen niet in het opgeslagen bestand

DocumentInfo mutaties worden in het geheugen voorbereid en pas opgeslagen de volgende keer dat Save() wordt uitgevoerd op dezelfde Document instantie. Zorg ervoor dat de metagegevensbewerking plaatsvindt vóór Save(), niet erna.

Veelgestelde vragen

Is paginering nul-gebaseerd of één-gebaseerd in Aspose.PDF FOSS voor C++?

Eén-gebaseerd. doc.Pages()[1] is altijd de eerste pagina.

Kan TextAbsorber tekst extraheren van één enkele pagina in plaats van van het hele document?

Ja. Visit() is overladen om ofwel een Document — die de tekst van elke pagina extraheert — of een enkele Page te accepteren, die alleen de tekst van die pagina extraheert.

Moet ik Save() aanroepen als ik alleen gegevens uit het document lees?

Nee. Save() is alleen vereist na wijzigingen die teruggeschreven moeten worden naar een bestand, zoals het bewerken van DocumentInfo velden. Het lezen van het paginacount, het extraheren van tekst, of het renderen van een pagina wijzigt het document niet.

Hoe controleer ik de resolutie van een gerenderde pagina?

Geef een Resolution-waarde door aan de constructor van het apparaat — bijvoorbeeld Resolution(150) voor 150 DPI. Hogere waarden produceren grotere rasterafbeeldingen met hogere nauwkeurigheid.

Welk formaat produceert BmpDevice?

Een ongecomprimeerde BMP-afbeelding die rechtstreeks naar de std::ostream wordt geschreven die aan Process() wordt doorgegeven.

Zie ook

 Nederlands