Introdução

Aspose.PDF FOSS for C++ é uma biblioteca open-source C++20 para trabalhar com documentos PDF. A superfície API abrange gerenciamento de documentos e páginas, extração de texto, renderização raster, criptografia, anotações e campos interativos AcroForm — as operações mais comumente necessárias quando uma aplicação C++ precisa criar, inspecionar ou transformar arquivos PDF sem depender de um motor PDF externo ou de um SDK comercial.

A biblioteca vincula-se apenas à biblioteca padrão do C++. Componentes internos, como os codificadores raster BMP, JPEG e TIFF e o rasterizador de páginas, são implementados do zero dentro do projeto, portanto não há dependência de um renderizador PDF do sistema, de um componente PDF comercial ou de qualquer codec de imagem de terceiros. Isso mantém a pegada de dependências em zero, além de um compilador compatível com C++20 e da biblioteca padrão.

Aspose.PDF FOSS for C++ é lançado sob a licença MIT. Este post percorre as principais áreas de recursos expostas pela classe Document e seus tipos de suporte, seguido de um exemplo de Início Rápido e do suporte de formatos atualmente confirmados.


Principais Recursos

Gerenciamento de Documentos e Páginas

A classe Document é o ponto de entrada para abrir, inspecionar e salvar arquivos PDF. As páginas são acessadas através de Document.Pages(), que devolve um PageCollection que suporta Count(), Add(), Insert(pageNumber) e Delete(pageNumber). Metadados a nível de documento são lidos e atualizados através de Document.Info() (uma instância de DocumentInfo) ou definidos diretamente com 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() reduzem o tamanho do arquivo de saída ao consolidar e eliminar recursos não utilizados antes de salvar.

Extração de Texto

Aspose::Pdf::Text::TextAbsorber extrai o conteúdo em texto puro de um documento inteiro ou de uma única página. Visit() percorre o alvo e Text() devolve a string acumulada. TextFragmentAbsorber funciona em uma granularidade mais fina, expondo trechos individuais de texto através de um 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";
}

Renderização para Imagens Raster

As páginas são renderizadas em formatos raster por meio de classes de dispositivo específicas para cada formato — PngDevice, JpegDevice, BmpDevice e TiffDevice — cada uma implementando Process(page, output). A resolução de saída é controlada pela 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 o mesmo padrão Process(page, output) para saída JPEG. TiffDevice também oferece suporte a saída de múltiplas páginas em uma única chamada através de Process(document, fromPage, toPage, output), e expõe RenderingOptions() para controlar como os campos de formulário são renderizados na saída raster.

Criptografia e Permissões de Acesso

Document.Encrypt() protege um documento com senha de usuário e de proprietário, selecionando o algoritmo de cifra através do enum CryptoAlgorithm: RC4x40, RC4x128, AESx128 ou AESx256. As permissões concedidas são descritas com o tipo Permissions, cujos valores de bandeira incluem 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");
}

Um documento criptografado já aberto é descriptografado no local com Document.Decrypt(). Document.IsEncrypted() informa se um documento carregado atualmente possui um dicionário de criptografia.

Anotações

Anotações em nível de página — notas de texto, formas e marcações — são acessadas via Page.Annotations(), que devolve um AnnotationCollection. Entradas individuais expõem propriedades compartilhadas como Contents(), Rect(), Color(), Border() e AnnotationType(), e podem ser removidas da página ou achatadas em conteúdo 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");
}

Qualquer Annotation único também pode ser convertido em conteúdo estático de página diretamente com seu próprio método Flatten(), independentemente do fluxo de trabalho de achatamento de formulários descrito abaixo.

Formulários Interativos

Campos AcroForm em um documento são gerenciados via Document.Form(), que devolve uma instância Form que suporta Count(), HasField(fieldName), Delete(fieldName) e Flatten(). Novos campos são anexados com Form.Add(field, pageNumber), onde field é um subtipo concreto de Field, como TextBoxField, CheckboxField, ChoiceField ou 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");
}

Início Rápido

Adicione a biblioteca como um subdiretório CMake e vincule ao alvo aspose_pdf_foss:

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

Abra um documento, extraia seu texto e renderize a primeira página em 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 suportados

FormatoExtensãoLerEscrever
BMPbmp—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓
SVGsvg✓—

Código aberto e licenciamento

Aspose.PDF FOSS para C++ é lançado sob a licença MIT, permitindo uso comercial, modificação e redistribuição sem royalties. O código-fonte está disponível em github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.

O uso comercial é permitido sob os termos da licença MIT. Se o seu projeto requer suporte de nível empresarial, cobertura ampliada de formatos ou integração em nuvem, o Aspose.PDF — Enterprise Product Family é uma oferta comercial separada.


Começando

Recursos Relacionados