Wprowadzenie
Aspose.PDF FOSS for C++ to nowa otwarto‑źródłowa biblioteka do pracy z dokumentami PDF z kodu C++20. Została wydana na licencji MIT i nie ma żadnych zależności w czasie wykonywania poza standardową biblioteką C++ — enkodery BMP, JPEG i TIFF, rasteryzator stron oraz parser PDF są implementowane wewnętrznie, więc nie ma odwołań do komercyjnego silnika PDF, zewnętrznego kodeka obrazu ani zewnętrznej biblioteki kryptograficznej.
Biblioteka jest zorganizowana wokół klasy Aspose::Pdf::Document, która ładuje PDF z ścieżki pliku i udostępnia jego zawartość poprzez Document.Pages(), PageCollection pojedynczych obiektów Page. Stamtąd API obejmuje wyodrębnianie tekstu, rasteryzację stron, szyfrowanie dokumentu, adnotacje i pola AcroForm — operacje potrzebne do odczytu, przeglądania i modyfikacji istniejących plików PDF lub tworzenia nowych od podstaw.
To wydanie jest przeznaczone dla programistów, którzy potrzebują przetwarzania PDF w kodzie C++ bez dodawania komercyjnej licencji ani łańcucha zależności zewnętrznych: potoki dokumentów, usługi wyodrębniania treści, narzędzia konwersji PDF‑na‑obraz oraz aplikacje, które muszą szyfrować lub odczytywać dane formularzy jako część większego projektu.
Co zawiera
Ładowanie dokumentu i dostęp do stron
Otwarcie istniejącego PDF wymaga jednego wywołania konstruktora. Document parsuje plik i udostępnia jego strony poprzez Pages(), które zwraca PageCollection obsługującą indeksowanie od 1, Count() oraz Add()/Insert()/Delete() do zmiany kolejności stron.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
auto page = doc.Pages()[1];
std::cout << "First page number: " << page.Number() << "\n";
}
Ekstrakcja tekstu
Aspose::Pdf::Text::TextAbsorber przegląda Document lub pojedynczą Page i zbiera znalezioną treść tekstową. Wywołaj Visit() z dokumentem lub stroną, a następnie odczytaj wynik za pomocą Text(). HasErrors() informuje, czy absorber napotkał treść, której nie mógł przetworzyć.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
if (absorber.HasErrors()) {
std::cerr << "Some content could not be extracted\n";
}
}
Renderowanie do obrazów rastrowych
Strony renderują się do BMP, JPEG lub TIFF za pośrednictwem klas BmpDevice, JpegDevice i TiffDevice. Każde urządzenie jest konstruowane z Resolution i udostępnia metodę Process(page, output), która zapisuje wyrenderowany obraz do strumienia wyjściowego.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
Szyfrowanie
Document.Encrypt() chroni dokument przy użyciu hasła użytkownika, hasła właściciela, wartości uprawnień oraz wyboru CryptoAlgorithm. Enum obejmuje RC4-40 (RC4x40), RC4-128 (RC4x128), AES-128 (AESx128) oraz AES-256 (AESx256). Document.Decrypt() odwraca operację, a IsEncrypted() informuje, czy dokument jest aktualnie zaszyfrowany.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions::PrintDocument,
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
Adnotacje
Każda Page udostępnia AnnotationCollection poprzez Annotations(). TextAnnotation jest tworzona w odniesieniu do dokumentu macierzystego, pozycjonowana przy użyciu Rectangle i dodawana do kolekcji strony za pomocą Add().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Annotations::TextAnnotation note(doc);
note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed - see section 2");
doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");
}
Pola AcroForm
Document.Form() zwraca Form dokumentu, który udostępnia istniejące pola poprzez Fields() jako std::vector<Field*>. Każde Field podaje swoją nazwę i bieżącą wartość za pomocą PartialName() i Value(), a Form.Flatten() zapisuje wygląd każdego pola w treści strony, usuwając interaktywność.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("form.pdf");
auto& form = doc.Form();
std::cout << "Field count: " << form.Count() << "\n";
for (auto* field : form.Fields()) {
std::cout << field->PartialName() << " = " << field->Value() << "\n";
}
form.Flatten();
doc.Save("flattened.pdf");
}
Szybki start
Dodaj bibliotekę jako podkatalog CMake i połącz się z celem aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Otwórz dokument, wypisz liczbę stron, wyodrębnij jego tekst i wyrenderuj pierwszą stronę do pliku BMP:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Pages: " << doc.Pages().Count() << "\n";
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
Obsługiwane formaty
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG i TIFF są wyjściami renderującymi strony generowanymi przez ich odpowiednie klasy urządzeń. Tekst jest wyodrębniany z PDF za pomocą TextAbsorber. SVG jest importowane jako zawartość wektorowa poprzez ścieżkę ładowania SVG biblioteki.
Open Source i licencjonowanie
Aspose.PDF FOSS dla C++ jest dystrybuowane na licencji MIT, a pełne źródło dostępne jest pod adresem github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. Licencja zezwala na komercyjne użycie, modyfikację i redystrybucję bez osobnej umowy.