Exemplo completo em funcionamento disponível no GitHub:
strip-pdf-metadata-dotnet

Introdução

A sanitização de metadados de PDF é um fluxo de trabalho do GroupDocs.Metadata para .NET que limpa o dicionário de informações do PDF e os campos de identidade XMP a partir de serviços C#. Quando um PDF de contrato sai de um disco interno, Autor, Criador, Produtor, Palavras‑chave e pacotes XMP costumam permanecer. Limpadores de navegador e uma rápida passagem pelo Acrobat podem parecer bem‑sucedidos enquanto o XMP ainda contém o nome do autor original. Encontrei esse problema quando um rascunho “limpo” ainda mostrava Alice Example como Autor depois que um parceiro abriu o arquivo em outro visualizador.

O GroupDocs.Metadata para .NET oferece aos serviços C# duas intensidades claras de limpeza no mesmo objeto Metadata: Sanitize() para uma remoção completa dos pacotes detectados e RemoveProperties quando Título e Assunto precisam permanecer, mas a identidade da pessoa não. Este artigo compara ambas as abordagens com as etapas de inspeção e verificação que tornam o resultado auditável.

Você sairá com exemplos funcionais para .NET 8, uma regra de decisão para limpeza de saída versus arquivamento, e um predicado de verificação que checa Autor / Person.Creator em vez de entrar em pânico com as impressões digitais de Criador/Produtor do motor PDF após Save.

Por que a limpeza de metadados de PDF importa

Compartilhamentos de arquivos externos, downloads multi‑tenant e arquivos regulados precisam de uma API de remoção de metadados repetível, em vez de um clique em desktop. Essa abordagem é particularmente valiosa para:

  • Portais de parceiros: remoção total antes que um PDF atravesse um limite de confiança
  • Busca em registros: manter Título/Assunto enquanto descarta campos do tipo Autor
  • Resposta a incidentes: provar que o Autor foi removido após um compartilhamento equivocado
  • Portões de CI: falhar a build quando a verificação retorna falso

Uma política de uma linha (“remover metadados”) oculta a escolha entre Sanitize e remoção seletiva. Nomear a intensidade na revisão de código impede exclusões silenciosas de Palavras‑chave que seu arquivo ainda precisa.

Pré‑requisitos

Antes de começar, certifique‑se de que você tem:

  • .NET 8 SDK
  • GroupDocs.Metadata 26.8.0 (licença temporária)
  • Um PDF que ainda contenha campos Info e/ou identidade XMP
  • Visual Studio 2022 ou VS Code (opcional)

Instalação

Instale o GroupDocs.Metadata via NuGet:

dotnet add package GroupDocs.Metadata --version 26.8.0

Ou restaure a partir do arquivo .csproj do projeto de exemplo. Para Save sem restrições, defina a variável de ambiente LIC_METADATA_VALID apontando para a pasta que contém GroupDocs.Metadata.Product.Family.lic.

Método 1 – Inspecionar antes de limpar

Comece com uma listagem somente leitura para saber quais campos o PDF realmente contém. Ferramentas de navegador costumam perder o XMP; essa listagem serve como linha de base para a verificação antes/depois.

using var metadata = new Metadata(inputPath);
var properties = metadata.FindProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Tool.Software) ||
    p.Tags.Contains(Tags.Content.Title) ||
    p.Tags.Contains(Tags.Content.Subject) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Keywords", StringComparison.OrdinalIgnoreCase));

foreach (var property in properties)
{
    Console.WriteLine($"{property.Name} = {property.Value}");
}

Pontos principais:

  • Tags mais nomes: combine verificações de tags com comparações de Author / Keywords para produtores que rotulam campos de forma diferente
  • Sem mutação: seguro para modos de execução a seco e tickets de suporte
  • Filtros compartilhados: reutilize as mesmas ideias nos predicados de remoção posteriores

Método 2 – Sanitize todos os metadados detectados

Use Sanitize() quando o PDF precisar sair sem nenhum rastro de autoria. A chamada limpa os pacotes reconhecidos, incluindo campos do dicionário Info e XMP quando a API os detecta, e então você salva um novo arquivo.

using var metadata = new Metadata(inputPath);
int removed = metadata.Sanitize();
Console.WriteLine(removed);
metadata.Save(outputPath);

Pontos principais:

  • Uma única chamada: superfície pequena para rotas de saída
  • Registre a contagem: operadores podem identificar entradas já limpas versus limpezas extensas
  • Espere carimbos de ferramenta: após Save, Criador/Produtor podem mostrar valores de Tool.Software do motor PDF

Melhor quando: downloads de parceiros, links públicos, troca entre tenants.

Método 3 – Remover apenas propriedades do tipo autor

Quando Título, Assunto e Palavras‑chave ainda alimentam a busca, elimine a identidade da pessoa com RemoveProperties em vez de apagar todo o pacote.

using var metadata = new Metadata(inputPath);
int removed = metadata.RemoveProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Person.Editor) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
    string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(removed);
metadata.Save(outputPath);

Pontos principais:

  • Predicado revisável: a revisão de código pode ver exatamente quais campos de identidade são descartados
  • Campos descritivos permanecem: Título/Assunto/Palavras‑chave permanecem com este filtro de exemplo
  • Mesmo SDK: sem necessidade de segunda biblioteca para o caminho seletivo

Melhor quando: arquivos de arquivo internos, rascunhos circulantes, políticas que proíbem Autor mas permitem palavras‑chave.

Como provar a remoção do Autor após o Save?

Reabra o PDF limpo e procure apenas por Autor / Person.Creator / Person.Editor. Imprima True quando nenhum permanecer. Não trate impressões digitais residuais de Criador/Produtor (Tool.Software) como falha de limpeza – Save pode reescrevê‑las com o nome do motor PDF. Essa distinção mantém as verificações de conformidade honestas no CI e evita alarmes falsos quando o motor grava seus próprios campos de ferramenta.

using var metadata = new Metadata(inputPath);
var leftovers = metadata.FindProperties(p =>
    p.Tags.Contains(Tags.Person.Creator) ||
    p.Tags.Contains(Tags.Person.Editor) ||
    string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase));

Console.WriteLine(!leftovers.Any());

Pontos principais:

  • Faça a pergunta certa: “O Autor foi removido?” e não “O Criador está vazio?”
  • Segunda abertura: verifique após Save, não apenas em memória
  • Amigável ao CI: um booleano para testes e logs

Escolhendo entre Sanitize e RemoveProperties

Pergunta Preferir Sanitize Preferir RemoveProperties
O arquivo sai da empresa? Sim Apenas se os campos descritivos precisarem permanecer
Busca em arquivo precisa de Título? Não Sim
A política diz “nenhuma pessoa nos metadados”? Qualquer, depois verifique Sim, com predicado focado em pessoa
Operador quer um único botão? Sim Encapsular atrás de uma rota nomeada

strip-pdf-metadata-dotnet é uma demonstração .NET executável que encadeia as quatro etapas contra Resources/contract-with-metadata.pdf para que você veja inspeção, sanitização, remoção seletiva e verificação em uma única execução de console.

Erros comuns

  • Confiar apenas em limpador de navegador: o XMP costuma sobreviver.
  • Verificar nomes de Criador/Produtor: impressões digitais do motor após Save causam falhas falsas.
  • Usar o mesmo predicado para sempre: revise os nomes de campos de identidade quando novos produtores surgirem.
  • Ignorar a configuração de licença para Save: o modo de avaliação pode bloquear gravações ilimitadas; defina LIC_METADATA_VALID para testes de pipeline completo.
  • Pular a inspeção: sem uma listagem prévia você não consegue dizer se Sanitize removeu 7 campos ou 0 porque o arquivo já estava limpo.

No exemplo semeado contract-with-metadata.pdf, uma execução licenciada normalmente imprime Autor e Palavras‑chave na inspeção, uma contagem de remoção de Sanitize em torno de 7 e True na verificação focada em Autor. A remoção seletiva de autor imprime uma contagem menor (cerca de 3) enquanto Título e Assunto permanecem visíveis em uma segunda inspeção.

Recursos adicionais

Conclusão

A limpeza de metadados de PDF no .NET não é apenas uma chamada de API com nome vago. Escolha Sanitize() para limpezas de saída, RemoveProperties quando Título e Assunto precisam permanecer, e sempre inspecione e depois verifique os campos do tipo Autor após Save. Clone o repositório de exemplo, execute-o no PDF de contrato semeado e, em seguida, copie os mesmos métodos para o seu serviço de upload, adicionando logs em torno das contagens de remoção.