Introducción

Aspose.PDF FOSS para C++ es una biblioteca de código abierto C++20 para trabajar con documentos PDF. La superficie API abarca la gestión de documentos y páginas, extracción de texto, renderizado raster, cifrado, anotaciones y campos interactivos AcroForm — las operaciones que se necesitan con mayor frecuencia cuando una aplicación C++ debe crear, inspeccionar o transformar archivos PDF sin depender de un motor PDF externo o un SDK comercial.

La biblioteca se vincula únicamente con la biblioteca estándar de C++. Los componentes internos, como los codificadores raster BMP, JPEG y TIFF y el rasterizador de páginas, están implementados desde cero dentro del proyecto, por lo que no hay dependencia de un renderizador PDF del sistema, un componente PDF comercial o cualquier códec de imagen de terceros. Esto mantiene la huella de dependencias en cero más allá de un compilador compatible con C++20 y la biblioteca estándar.

Aspose.PDF FOSS para C++ se publica bajo la licencia MIT. Esta publicación recorre las principales áreas de características expuestas por la clase Document y sus tipos de soporte, seguida de un ejemplo de inicio rápido y el soporte de formatos actualmente confirmado.


Características clave

Gestión de documentos y páginas

La clase Document es el punto de entrada para abrir, inspeccionar y guardar archivos PDF. Las páginas se acceden a través de Document.Pages(), que devuelve un PageCollection que admite Count(), Add(), Insert(pageNumber) y Delete(pageNumber). Los metadatos a nivel de documento se leen y actualizan mediante Document.Info() (una instancia de DocumentInfo) o se establecen directamente 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() y Document.OptimizeResources() reducen el tamaño del archivo de salida al consolidar y eliminar recursos no utilizados antes de guardar.

Extracción de texto

Aspose::Pdf::Text::TextAbsorber extrae el contenido de texto sin formato de un documento completo o de una sola página. Visit() recorre el objetivo y Text() devuelve la cadena acumulada. TextFragmentAbsorber funciona a una granularidad más fina, exponiendo ejecuciones de texto individuales a través de 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";
}

Renderizado a imágenes raster

Las páginas se renderizan a formatos raster mediante clases de dispositivo por formato — PngDevice, JpegDevice, BmpDevice y TiffDevice — cada una implementa Process(page, output). La resolución de salida se controla con la clase 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 sigue el mismo patrón Process(page, output) para la salida JPEG. TiffDevice además admite salida multipágina en una sola llamada a través de Process(document, fromPage, toPage, output), y expone RenderingOptions() para controlar cómo se renderizan los campos de formulario en la salida raster.

Cifrado y permisos de acceso

Document.Encrypt() protege un documento con una contraseña de usuario y de propietario, seleccionando el cifrado a través del enumerado CryptoAlgorithm: RC4x40, RC4x128, AESx128 o AESx256. Los permisos concedidos se describen con el tipo Permissions, cuyos valores de bandera incluyen PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument y 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 cifrado ya abierto se descifra in situ con Document.Decrypt(). Document.IsEncrypted() informa si un documento cargado lleva actualmente un diccionario de cifrado.

Anotaciones

Las anotaciones a nivel de página — notas de texto, formas y marcas — se acceden mediante Page.Anotaciones(), que devuelve un AnnotationCollection. Las entradas individuales exponen propiedades compartidas como Contents(), Rect(), Color(), Border() y AnnotationType(), y pueden eliminarse de la página o aplanarse en contenido estático.

#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");
}

Cualquier Annotation individual también puede convertirse directamente en contenido estático de página con su propio método Flatten(), independiente del flujo de trabajo de aplanado de formularios descrito a continuación.

Formularios Interactivos

Los campos AcroForm en un documento se gestionan a través de Document.Form(), que devuelve una instancia Form que admite Count(), HasField(fieldName), Delete(fieldName) y Flatten(). Los campos nuevos se añaden con Form.Add(field, pageNumber), donde field es un subtipo concreto de Field como 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");
}

Inicio Rápido

Agrega la biblioteca como un subdirectorio de CMake y enlaza contra el objetivo aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Abra un documento, extraiga su texto y renderice la primera página a 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);
}

Formatos compatibles

FormatoExtensiónLeerEscribir
BMPbmp—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓
SVGsvg✓—

Código abierto y licencias

Aspose.PDF FOSS para C++ se publica bajo la licencia MIT, lo que permite el uso comercial, la modificación y la redistribución sin royalties. El código fuente está disponible en github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.


Primeros pasos

Recursos relacionados