Introdução

Este guia mostra como ler e atualizar o estado ao nível do documento em Aspose.PDF FOSS para C++ — as partes de um PDF que descrevem o próprio documento em vez do que é desenhado em suas páginas. Aspose.PDF FOSS para C++ centra-se na classe Aspose::Pdf::Document, que carrega um PDF existente a partir de um caminho de arquivo e o expõe tanto para edição de conteúdo quanto para a contabilidade ao nível do documento. A contabilidade ao nível do documento abrange o dicionário /Info, o fluxo de metadados XMP, a árvore de marcadores (outline) exibida no painel de navegação de um visualizador, destinos nomeados usados por links internos, anexos de arquivo incorporados no PDF e as sequências personalizadas de numeração de páginas que um documento pode definir.

Este post percorre a superfície API para cada uma dessas áreas: DocumentInfo para os campos clássicos do dicionário /Info (title, author, creator, subject, keywords), Metadata para o fluxo de metadados XMP, Outlines e OutlineItemCollection para a árvore de marcadores, NamedDestinationCollection para links nomeados, EmbeddedFileCollection e FileSpecification para anexos, e PageLabelCollection para numeração de páginas por intervalo. Cada seção combina a classe relevante com um exemplo funcional construído a partir de um objeto Document carregado.

Aspose.PDF FOSS para C++ é distribuído sob a licença MIT e vincula apenas à biblioteca padrão C++, portanto cada operação descrita aqui é executada sem um motor PDF proprietário ou dependência de terceiros. A biblioteca é compilada como um alvo estático (aspose_pdf_foss) adicionado via CMake.


O que está incluído

O dicionário /InfoDocumentInfo

Document.Info() devolve uma referência DocumentInfo vinculada ao dicionário /Info do PDF. Possui acessadores tipados para os campos padrão — Title(), Author(), Creator(), Subject(), Keywords(), Producer() e Trapped() — cada um com um setter correspondente, além de um par genérico Add(key, value) / Remove(key) para chaves personalizadas e IsPredefinedKey(key) para verificar se o nome de uma chave é um dos campos padrão. Document.SetTitle() é um atalho que grava o título diretamente no documento.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& info = doc.Info();
    std::cout << "Title: " << info.Title() << "\n";
    std::cout << "Author: " << info.Author() << "\n";

    info.Author("Demo author");
    info.Creator("Aspose.PDF FOSS C++");
    info.Add("Generated-By", "document-management sample");

    doc.Save("output.pdf");
}

Metadados XMP — Metadata

Além do dicionário /Info, Document.Metadata() devolve um objeto Metadata sobre o fluxo de metadados XMP do documento. Ele se comporta como um contêiner associativo de entradas: Add(key, value), Contains(key), ContainsKey(key), TryGetValue(key, value), Remove(key), Keys(), Values() e Count(). Namespaces personalizados são registrados com RegisterNamespaceUri(prefix, namespaceUri) e resolvidos de ida e volta com GetNamespaceUriByPrefix() e GetPrefixByNamespaceUri().

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/metadata.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& metadata = doc.Metadata();
    metadata.RegisterNamespaceUri("myapp", "http://example.com/myapp/1.0/");
    metadata.Add("myapp:BatchId", "2026-07-run-42");

    std::cout << "XMP entries: " << metadata.Count() << "\n";
    doc.Save("output.pdf");
}

Marcadores e Contornos

Document.Outlines() retorna a OutlineCollection do documento — a raiz da árvore de marcadores exibida no painel de navegação de um visualizador. A coleção suporta Count(), Add(item), Clear(), Contains(item), Remove(item), Delete(), e os acessores de extremidade First() / Last(), que retornam nós OutlineItemCollection. Cada nó OutlineItemCollection contém um Title(), bandeiras de exibição Bold() / Italic(), um estado de expansão Open(), um Destination() ou Action(), e membros de travessia Next(), Prev(), HasNext(), Level(), e Parent() de volta à coleção Outlines proprietária.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/outlines.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& outlines = doc.Outlines();
    std::cout << "Top-level bookmarks: " << outlines.Count() << "\n";

    if (outlines.Count() > 0) {
        auto& first = outlines.First();
        std::cout << "First bookmark: " << first.Title()
                  << " (level " << first.Level() << ")\n";
    }
}

Destinos Nomeados

Document.NamedDestinations() retorna uma NamedDestinationCollection, uma tabela de consulta que mapeia nomes definidos pela aplicação para destinos dentro do documento. Novas entradas são registradas com Add(name, appointment), onde appointment é uma implementação de IAppointment — a mesma interface usada por destinos de itens de contorno e ações de link. Entradas existentes são removidas com Remove(name), contadas com Count(), e enumeradas com Names().

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/named_destination_collection.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& destinations = doc.NamedDestinations();
    std::cout << "Named destinations: " << destinations.Count() << "\n";

    for (const auto& name : destinations.Names()) {
        std::cout << "  " << name << "\n";
    }
}

Arquivos Incorporados e Anexos

Document.EmbeddedFiles() retorna uma EmbeddedFileCollection de anexos FileSpecification transportados dentro do PDF. Arquivos são adicionados com Add(file) ou Add(key, file), pesquisados por FindByName(name), removidos com Delete(name), DeleteByKey(key) ou Delete(), e enumerados através de Count() e Keys(). Cada FileSpecification informa seu Name(), Description(), MIMEType() e AFRelationship() — a classificação de relacionamento “Associated File” do PDF.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/file_specification.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& files = doc.EmbeddedFiles();
    std::cout << "Embedded files: " << files.Count() << "\n";

    for (const auto& key : files.Keys()) {
        auto spec = files.FindByName(key);
        std::cout << "  " << spec.Name() << " (" << spec.MIMEType() << ")\n";
    }
}

Rótulos de página

Document.PageLabels() retorna uma PageLabelCollection para as sequências de numeração de páginas personalizadas que um visualizador exibe em vez dos números de página físicos — por exemplo, numerais romanos para um prefácio seguidos de numerais arábicos para o corpo. GetLabel(pageIndex) recupera o PageLabel em vigor para uma página; PageLabel expõe StartingValue(), NumberingStyle() (um valor Aspose::Pdf::NumberingStyle como NumeralsArabic ou NumeralsRomanLowercase) e Prefix(). UpdateLabel(pageIndex, pageLabel) atribui um rótulo a partir daquela página, RemoveLabel(pageIndex) remove um, e GetPages() lista cada índice de página que possui um rótulo personalizado.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_label.hpp>
#include <aspose/pdf/page_label_collection.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& labels = doc.PageLabels();
    for (int pageIndex : labels.GetPages()) {
        auto label = labels.GetLabel(pageIndex);
        std::cout << "Page " << pageIndex << " prefix: " << label.Prefix()
                  << ", starts at " << label.StartingValue() << "\n";
    }

    auto preface = labels.GetLabel(1);
    preface.NumberingStyle(Aspose::Pdf::NumberingStyle::NumeralsRomanLowercase);
    preface.StartingValue(1);
    labels.UpdateLabel(1, preface);

    doc.Save("output.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, leia e atualize seus metadados /Info e salve o resultado:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc("input.pdf");

    auto& info = doc.Info();
    std::cout << "Title: " << info.Title() << "\n";
    std::cout << "Author: " << info.Author() << "\n";

    doc.SetTitle("Updated Report Title");
    info.Author("Report Generator");
    info.Add("Generated-By", "Aspose.PDF FOSS for C++");

    doc.Save("output.pdf");
    return 0;
}

Formatos suportados

FormatoExtensãoLerEscrever
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

BMP, JPEG e TIFF são saídas de renderização de página produzidas por suas respectivas classes de dispositivo, e o texto é extraído via TextAbsorber. SVG é importado como conteúdo vetorial através do caminho de carregamento SVG da biblioteca. Nenhum dos tipos de gerenciamento de documentos abordados acima são conversores de formato — eles leem e escrevem apenas a estrutura PDF.


Código aberto e licenciamento

Aspose.PDF FOSS para C++ é distribuído sob a licença MIT, com o código-fonte completo disponível em github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. A licença permite uso comercial, modificação e redistribuição sem um acordo separado.


Começando

Recursos Relacionados