Hur man arbetar med PDF-dokument i C++

Hur man arbetar med PDF-dokument i C++

Aspose.PDF FOSS för C++ är ett MIT-licensierat, beroende-fritt C++20-bibliotek byggt och länkat med CMake — det finns ingen paket-hanterarimport att lägga till. Den här guiden går igenom det centrala Document-baserade arbetsflödet: öppna en befintlig PDF, inspektera dess sidor och metadata, extrahera text och rendera en sida till en rasterbild.

Steg-för-steg guide

Steg 1: Installera paketet

Klona repot och lägg till det i ditt CMake-projekt som en underkatalog:

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)

Eller konfigurera och bygg det fristående:

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

Verifiera att verktygskedjan löser genom att kompilera ett minimalt program mot huvudfilerna:

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

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

En lyckad build som skriver ut pages: 0 för den nykonstruerade, tomma Document 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>
#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>

Steg 3: Öppna ett PDF-dokument och räkna dess sidor

Konstruera en Document från en filsökväg för att öppna en befintlig PDF. Document::Pages() returnerar PageCollection, och Count() rapporterar hur många sidor den innehåller:

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

Steg 4: Läs dokumentmetadata

Document::Info() returnerar ett DocumentInfo-objekt med typade läs/skriv-accessorer för de standard /Info ordboksposterna:

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

Steg 5: Extrahera text från en sida

Aspose::Pdf::Text::TextAbsorber går igenom en Document eller en enskild Page och samlar den text den stöter på; Text() returnerar resultatet därefter. PageCollection är 1-indexerad, så Pages()[1] är den första sidan:

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

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

Visit() accepterar också hela Document direkt (absorber.Visit(doc)) när du vill att all sidors text ska sammanfogas istället för en enskild sida.


Steg 6: Rendera sidan till en rasterbild

BmpDevice renderar en Page till en okomprimerad BMP-bild. Dess konstruktor tar en Resolution som styr utdata-DPI, och Process() skriver de renderade bytena till någon std::ostream:

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

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

Steg 7: Uppdatera metadata och spara dokumentet

Setters på DocumentInfo förbereder förändringar som rensas nästa gång Save() körs på den ägande Document:

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

Vanliga problem och lösningar

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

PageCollection är 1-indexerad och följer den kanoniska Aspose.PDF-semantiken — den första sidan är Pages()[1]. Ett index under 1 eller över Count() ger ett fel.

TextAbsorber::Text() returnerar en tom sträng

Text() returnerar vad som samlats av det senaste Visit()-anropet. Bekräfta att Visit() faktiskt anropades innan du läser Text(), och att sidan eller dokumentet du besökte innehåller extraherbar text snarare än endast skannade bilder.

Den renderade BMP-filen är oväntat liten eller ser tom ut

Ett lågt Resolution-värde ger en liten rasterbild. Öka DPI:n som skickas till Resolution — till exempel Resolution(300) för utskriftskvalitet — och bekräfta att sidindexet som skickas till Process() är det du avsåg.

DocumentInfo fält läses tillbaka som tomma strängar

Inte varje PDF-producent skriver standard-/Info-poster. Kontrollera Producer() och Creator() för tomma värden innan du antar att metadataextraktion misslyckades — en tom sträng är det definierade resultatet för en frånvarande nyckel.

Ändringar gjorda med Info().Title(...) visas inte i den sparade filen

DocumentInfo mutationer samlas i minnet och skrivs endast permanent nästa gång Save() körs på samma Document-instans. Se till att metadataändringen sker före Save(), inte efter.

Vanliga frågor

Är sidindexering nollbaserad eller enbaserad i Aspose.PDF FOSS för C++?

Enbaserad. doc.Pages()[1] är alltid den första sidan.

Kan TextAbsorber extrahera text från en enskild sida istället för hela dokumentet?

Ja. Visit() är överlagrad för att acceptera antingen en Document — som extraherar varje sidas text — eller en enskild Page, som bara extraherar den sidans text.

Behöver jag anropa Save() om jag bara läser data från dokumentet?

Nej. Save() behövs endast efter ändringar som måste skrivas tillbaka till en fil, såsom redigering av DocumentInfo-fält. Att läsa sidantalet, extrahera text eller rendera en sida modifierar inte dokumentet.

Hur kontrollerar jag upplösningen på en renderad sida?

Skicka ett Resolution-värde till enhetens konstruktor — till exempel Resolution(150) för 150 DPI. Högre värden ger större rasterbilder med högre upplösning.

Vilket format producerar BmpDevice?

En okomprimerad BMP-bild skriven direkt till std::ostream som skickas till Process().

Se även

 Svenska