Introduzione
Aspose.PDF FOSS per C++ è una libreria open-source C++20 per lavorare con documenti PDF. La superficie API copre la gestione di documenti e pagine, l’estrazione di testo, il rendering raster, la crittografia, le annotazioni e i campi AcroForm interattivi — le operazioni più comunemente necessarie quando un’applicazione C++ deve creare, ispezionare o trasformare file PDF senza dipendere da un motore PDF esterno o da un SDK commerciale.
La libreria si collega solo alla libreria standard C++. Componenti interni come i codificatori raster BMP, JPEG e TIFF e il rasterizzatore di pagine sono implementati da zero all’interno del progetto, quindi non vi è alcuna dipendenza da un renderer PDF di sistema, da un componente PDF commerciale o da qualsiasi codec di immagine di terze parti. Questo mantiene l’impronta delle dipendenze a zero, oltre a un compilatore conforme a C++20 e alla libreria standard.
Aspose.PDF FOSS per C++ è rilasciato sotto licenza MIT. Questo post illustra le principali aree funzionali esposte dalla classe Document e dai suoi tipi di supporto, seguito da un esempio Avvio rapido e dal supporto ai formati attualmente confermato.
Caratteristiche principali
Gestione di documenti e pagine
La classe Document è il punto d’ingresso per aprire, ispezionare e salvare file PDF. Le pagine sono accessibili tramite Document.Pages(), che restituisce un PageCollection che supporta Count(), Add(), Insert(pageNumber) e Delete(pageNumber). I metadati a livello di documento vengono letti e aggiornati tramite Document.Info() (un’istanza DocumentInfo) oppure impostati direttamente con 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() e Document.OptimizeResources() riducono le dimensioni del file di output consolidando e potando le risorse inutilizzate prima del salvataggio.
Estrazione del testo
Aspose::Pdf::Text::TextAbsorber estrae il contenuto plain-text di un intero documento o di una singola pagina. Visit() attraversa il target e Text() restituisce la stringa accumulata. TextFragmentAbsorber opera a una granularità più fine, esponendo le singole sequenze di testo tramite un 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";
}
Rendering in immagini raster
Le pagine vengono renderizzate in formati raster tramite classi dispositivo per formato — PngDevice, JpegDevice, BmpDevice e TiffDevice — ognuna implementa Process(page, output). La risoluzione di output è controllata dalla classe 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 segue lo stesso modello Process(page, output) per l’output JPEG. TiffDevice supporta inoltre l’output multi-pagina in una singola chiamata tramite Process(document, fromPage, toPage, output), ed espone RenderingOptions() per controllare come i campi modulo sono renderizzati nell’output raster.
Crittografia e permessi di accesso
Document.Encrypt() protegge un documento con una password utente e proprietario, selezionando il cifrario tramite l’enum CryptoAlgorithm: RC4x40, RC4x128, AESx128 o AESx256. I permessi concessi sono descritti con il tipo Permissions, i cui valori di flag includono PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument e 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");
}
Un documento crittografato già aperto viene decrittato in loco con Document.Decrypt(). Document.IsEncrypted() segnala se un documento caricato attualmente contiene un dizionario di crittografia.
Annotazioni
Le annotazioni a livello di pagina — note testuali, forme e markup — sono accessibili tramite Page.Annotazioni(), che restituisce un AnnotationCollection. Le voci individuali espongono proprietà comuni come Contents(), Rect(), Color(), Border() e AnnotationType(), e possono essere rimosse dalla pagina o appiattite in contenuto statico.
#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");
}
Qualsiasi singolo Annotation può anche essere convertito direttamente in contenuto di pagina statico con il proprio metodo Flatten(), indipendente dal flusso di lavoro di appiattimento dei moduli descritto di seguito.
Moduli interattivi
I campi AcroForm su un documento sono gestiti tramite Document.Form(), che restituisce un’istanza Form che supporta Count(), HasField(fieldName), Delete(fieldName) e Flatten(). I nuovi campi vengono aggiunti con Form.Add(field, pageNumber), dove field è un sottotipo concreto Field come TextBoxField, CheckboxField, ChoiceField o 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");
}
Avvio rapido
Aggiungi la libreria come sottodirectory CMake e collega contro il target aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Apri un documento, estrai il suo testo e rendi la prima pagina in 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);
}
Formati supportati
| Formato | Estensione | Leggi | Scrivi |
|---|---|---|---|
| BMP | bmp | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
| SVG | svg | ✓ | — |
Open Source e Licenze
Aspose.PDF FOSS per C++ è rilasciato sotto licenza MIT, consentendo l’uso commerciale, la modifica e la redistribuzione senza royalty. Il codice sorgente è disponibile su github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.
L’uso commerciale è consentito secondo i termini della licenza MIT. Se il tuo progetto richiede supporto di livello enterprise, copertura estesa dei formati o integrazione cloud, il Aspose.PDF — Enterprise Product Family è un’offerta commerciale separata.