Wprowadzenie
Aspose.PDF FOSS for C++ jest otwartoźródłową biblioteką C++20 do pracy z dokumentami PDF. Powierzchnia API obejmuje zarządzanie dokumentem i stronami, wyodrębnianie tekstu, renderowanie rastrowe, szyfrowanie, adnotacje oraz interaktywne pola AcroForm — operacje najczęściej potrzebne, gdy aplikacja C++ musi tworzyć, przeglądać lub przekształcać pliki PDF bez zależności od zewnętrznego silnika PDF lub komercyjnego SDK.
Biblioteka linkuje się wyłącznie z biblioteką standardową C++. Wewnętrzne komponenty, takie jak enkodery rastrowe BMP, JPEG i TIFF oraz rasteryzator stron, są implementowane od podstaw w projekcie, więc nie ma zależności od systemowego renderera PDF, komercyjnego komponentu PDF ani żadnego kodeka obrazu firm trzecich. Dzięki temu ślad zależności pozostaje zerowy, poza kompilatorem zgodnym z C++20 i biblioteką standardową.
Aspose.PDF FOSS for C++ jest udostępniany na licencji MIT. Ten wpis przechodzi przez główne obszary funkcji udostępnione przez klasę Document oraz jej typy pomocnicze, po czym następuje przykład Szybki start oraz aktualnie potwierdzone wsparcie formatów.
Kluczowe funkcje
Zarządzanie dokumentem i stroną
Klasa Document jest punktem wejścia do otwierania, przeglądania i zapisywania plików PDF. Strony są dostępne poprzez Document.Pages(), który zwraca PageCollection obsługujący Count(), Add(), Insert(pageNumber) i Delete(pageNumber). Metadane na poziomie dokumentu są odczytywane i aktualizowane za pomocą Document.Info() (instancja DocumentInfo) lub ustawiane bezpośrednio przy użyciu Document.SetTitle().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
// Insert a blank page after page 1, then drop the last page
doc.Pages().Insert(2);
doc.Pages().Delete(doc.Pages().Count());
doc.SetTitle("Generated Report");
doc.Save("output.pdf");
}
Document.Optimize() i Document.OptimizeResources() zmniejszają rozmiar pliku wyjściowego poprzez konsolidację i usuwanie nieużywanych zasobów przed zapisaniem.
Ekstrakcja tekstu
Aspose::Pdf::Text::TextAbsorber wyodrębnia zawartość tekstową całego dokumentu lub pojedynczej strony. Visit() przegląda cel i Text() zwraca zgromadzony ciąg znaków. TextFragmentAbsorber działa na bardziej szczegółowym poziomie, udostępniając poszczególne fragmenty tekstu poprzez TextFragmentCollection.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/text_fragment_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
// Extract all text from the document
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
// Extract text fragments from page 1
Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
fragmentAbsorber.Visit(doc.Pages()[1]);
auto fragments = fragmentAbsorber.TextFragments();
std::cout << "Fragments on page 1: " << fragments.Count() << "\n";
}
Renderowanie do obrazów rastrowych
Strony renderują się do formatów rastrowych przy użyciu klas urządzeń specyficznych dla formatu — PngDevice, JpegDevice, BmpDevice i TiffDevice — z których każda implementuje Process(page, output). Rozdzielczość wyjściowa jest kontrolowana przez klasę Resolution.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream pngOut("page1.png", std::ios::binary);
png.Process(page, pngOut);
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream bmpOut("page1.bmp", std::ios::binary);
bmp.Process(page, bmpOut);
}
JpegDevice stosuje ten sam wzorzec Process(page, output) dla wyjścia JPEG. TiffDevice dodatkowo obsługuje wyjście wielostronicowe w pojedynczym wywołaniu za pośrednictwem Process(document, fromPage, toPage, output) i udostępnia RenderingOptions() do kontrolowania, w jaki sposób pola formularza są renderowane w obrazie rastrowym.
Szyfrowanie i uprawnienia dostępu
Document.Encrypt() chroni dokument hasłem użytkownika i właściciela, wybierając szyfr poprzez wyliczenie CryptoAlgorithm: RC4x40, RC4x128, AESx128 lub AESx256. Przyznane uprawnienia są opisane przy użyciu typu Permissions, którego wartości flag obejmują PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument i PrintingQuality.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions(),
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
Już otwarty zaszyfrowany dokument jest odszyfrowywany w miejscu przy użyciu Document.Decrypt(). Document.IsEncrypted() informuje, czy załadowany dokument aktualnie posiada słownik szyfrowania.
Adnotacje
Adnotacje na poziomie strony — notatki tekstowe, kształty i znaczniki — są dostępne poprzez Page.Adnotacje(), który zwraca AnnotationCollection. Poszczególne wpisy udostępniają wspólne właściwości, takie jak Contents(), Rect(), Color(), Border() i AnnotationType(), i mogą być usunięte ze strony lub spłaszczone do treści statycznej.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < static_cast<int>(annotations.Count()); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
// Remove the first annotation on the page
if (annotations.Count() > 0) {
annotations.Delete(annotations[0]);
}
doc.Save("output.pdf");
}
Każdy pojedynczy Annotation może również zostać bezpośrednio przekształcony w statyczną treść strony przy użyciu własnej metody Flatten(), niezależnie od opisanego poniżej przepływu pracy spłaszczania formularzy.
Formularze interaktywne
AcroForm pola w dokumencie są zarządzane poprzez Document.Form(), który zwraca instancję Form obsługującą Count(), HasField(fieldName), Delete(fieldName) i Flatten(). Nowe pola są dołączane przy pomocy Form.Add(field, pageNumber), gdzie field jest konkretnym podtypem Field, takim jak TextBoxField, CheckboxField, ChoiceField lub ButtonField.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& form = doc.Form();
std::cout << "Form fields: " << form.Count() << "\n";
if (form.HasField("Signature1")) {
form.Delete("Signature1");
}
// Convert every remaining field into static page content
form.Flatten();
doc.Save("flattened.pdf");
}
Szybki start
Dodaj bibliotekę jako podkatalog CMake i połącz ją z celem aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Otwórz dokument, wyodrębnij jego tekst i wyrenderuj pierwszą stronę do formatu PNG:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/png_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::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.png", std::ios::binary);
png.Process(doc.Pages()[1], out);
}
Obsługiwane formaty
| Format | Rozszerzenie | Odczyt | Zapis |
|---|---|---|---|
| BMP | bmp | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
| SVG | svg | ✓ | — |
Open Source i licencjonowanie
Aspose.PDF FOSS dla C++ jest wydany na licencji MIT, umożliwiając komercyjne użycie, modyfikację i redystrybucję bez opłat licencyjnych. Źródło jest dostępne pod adresem github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.
Komercyjne użycie jest dozwolone na warunkach licencji MIT. Jeśli Twój projekt wymaga wsparcia na poziomie przedsiębiorstwa, rozszerzonego zakresu formatów lub integracji z chmurą, Aspose.PDF — Enterprise Product Family jest oddzielną ofertą komercyjną.