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/Keywordspara 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 deTool.Softwaredo 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
Savecausam 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_VALIDpara 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
- Caso de uso: Sanitize vs remoção de autor para metadados de PDF (.NET)
- Docs: remover todos os pacotes de metadados detectados
- Docs: remover propriedades específicas de metadados
- GitHub: strip-pdf-metadata-dotnet
- Referência da API
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.