Estou procurando uma maneira de adicionar metadados legíveis por máquina aos relatórios DOCX que gero. O objetivo é permitir que os usuários modifiquem os estilos do documento e o carreguem novamente no sistema, preservando os metadados.
Na primeira tentativa, ingenuamente tentei armazenar os metadados nos comentários, mas notei que alguns editores, especificamente o Microsoft Word, removem meus comentários e geram um arquivo DOCX sem eles após a modificação.
Também experimentei tags de documentos estruturados, mas tanto o Google Docs quanto o Microsoft Word as removem após a modificação de estilos.
Por fim, tentei usar XML personalizado, mas tanto o Google Docs quanto o Microsoft Word removeram os atributos e tags que adicionei.
Pesquisei bastante, mas não encontrei nenhuma solução que funcionasse. Alguém já passou por um problema semelhante e pode dar algum conselho?
PS1
Como há muitas linhas mesmo em arquivos DOCX pequenos, criei um repositório minimalista para mostrar melhor o que tentei até agora. Cada tentativa é colocada em um diretório separado. Cada diretório contém:
- Document.docx — o arquivo base criado manualmente com alguns metadados ocultos.
- ModifiedWithGoogle.docx e ModifiedWithWord.docx — o resultado após a edição do documento no Google Docs ou no Microsoft Word.
- Conteúdo descompactado de cada arquivo .docx para facilitar a inspeção do XML interno.
Repositório: https://github.com/kishieel/docx-metadata
Na primeira tentativa, adicionei metadados usando comentários. Isso funcionou bem com o Google Docs, onde os comentários foram preservados mesmo quando o texto foi movido usando recortar e colar. No entanto, o Microsoft Word removeu todos os comentários. Talvez o Word espere uma maneira diferente de criar comentários?
Exemplo de entrada:
<!-- 1_comments/Document/word/document.xml -->
<w:document ...>
<w:body>
<w:p>
<w:commentRangeStart w:id="0" />
<w:r>
<w:t xml:space="preserve">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris quis mollis tellus. Aenean at maximus nunc.</w:t>
</w:r>
<w:commentRangeEnd w:id="0" />
</w:p>
</w:body>
</w:document>
<!-- 1_comments/Document/word/comments.xml -->
<w:comments ...>
<w:comment w:id="0" w:date="2025-04-07T09:10:21.783Z">
<w:p>
<w:r>
<w:t xml:space="preserve">Some metadata #1</w:t>
</w:r>
</w:p>
</w:comment>
</w:comments>
Na segunda abordagem, tentei usar SDTs. Nesse caso, o Microsoft Word os preservou (embora tenha dividido cada frase em palavras separadas, o que pode ser o comportamento padrão ou algo ter dado errado). O Google Docs os removeu completamente do arquivo modificado.
Exemplo de entrada:
<!-- 2_structured_document_tags/Document/word/document.xml -->
<w:document ...>
<w:body>
<w:p>
<w:sdt>
<w:sdtPr>
<w:tag w:val="Some metadata #1" />
<w:alias w:val="Some alias #1" />
</w:sdtPr>
<w:sdtContent>
<w:r>
<w:t xml:space="preserve">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris quis mollis tellus. Aenean at maximus nunc.</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
</w:p>
</w:body>
</w:document>
Fornecerei o exemplo XML personalizado quando estiver pronto.
Não tenho experiência real recente na preservação de metadados por meio das três coisas que você mencionou (Microsoft Word, Google Docs e LibreOffice Writer), mas tentei várias abordagens para armazenar material que conheço no Word.
Para testes, tenho usado
Microsoft 365 MSO (Version 2503 Build 16.0.18623.20116) 64-bit
onWindows 10
, LibreOffice Writer Version: 24.2.7.2 (X86_64) / LibreOffice Communit Build ID: 420(Build:2)
onLinux
, e a versão gratuita atual doGoogle Docs
(não sei se o Google tem uma versão paga mais capaz). Crio documentos diretamente no Word, usando VBA quando necessário, por exemplo, para adicionar uma Parte XML Personalizada ou Variável de Documento. Nunca tentei salvar ou baixar em qualquer formato diferente de .docx. Há bastante documentação sobre o formato .docx e alguma documentação muito boa da MS sobre a implementação do Word, mas não procurei documentação equivalente para o Google Docs e o LibreOffice. Você provavelmente precisa saber quais recursos a MS, o LibreOffice e o Google "oficialmente suportam"Os tipos de recursos disponíveis no Word para armazenar metadados são "em todo o documento" ou "associados a um local no documento". Para "em todo o documento", existem
{ DOCVARIABLE }
campos{ DOCPROPERTY }
campos).Para "associado a um local no texto", você poderia, em princípio, usar pelo menos o seguinte:
{ DOCPROPERTY }
campos com Propriedades de Documento Personalizadas (visíveis){ DOCVARIABLE }
campos com variáveis de documento (visíveis){ SET }
campos (podem ser visíveis, dependendo das configurações e ações do usuário), por exemplo{ SET ABookMarkName "to some metadata" }
Sei que você tentou Comentários e acho que eles podem funcionar, apesar do que você encontrou, mas não acho que sejam tão fáceis de manter ocultos. Texto oculto, notas de rodapé, notas de fim ou Controles de Conteúdo também não são, então não usei nenhum deles. Além disso, muitas notas de rodapé ou notas de fim tendem a interferir no layout do documento.
O LibreOffice completou com sucesso a maioria dos Othings que tentei no Word. No entanto, ele exibiu uma caixa de diálogo do tipo "algumas dessas coisas podem não ser salvas corretamente" ao salvar.
O Google Docs perdeu a maioria das coisas que tentei, mas preservou pelo menos Comentários, Propriedades Personalizadas do Documento e até mesmo os
{ DOCPROPERTY }
campos necessários para inserir esses valores no documento. Ele removeu:{ DOCVARIABLE }
códigos de campo{ SET }
códigos de campoO que me sugere que a única coisa com boas chances de funcionar com o Google Docs são as Propriedades Personalizadas de Documentos. Elas têm limitações (acho que há um limite para o número que você pode ter, e para o comprimento por Propriedade ou para o comprimento total).
Para metadados de "nível de documento", talvez seja necessário dividir seus dados em pedaços menores.
Para metadados "posicionais", pode haver um problema com esses máximos. Mesmo que não seja o caso, marcar a posição usando o
{ DOCPROPERTY }
campo apropriado significa que você exibe o valor da propriedade — se não quiser fazer isso, provavelmente terá que fazer algo assim:{ DOCPROPERTY mymark }
para marcar o local, assim você terá apenas um resultado com um único espaço.No Word, é possível usar o fato de que o Word não é muito exigente com informações extras em códigos de campo, então você poderia ter uma única propriedade em branco chamada blank e um código de campo
{ DOCPROPERTY blank myprop }
, mas infelizmente o Google Docs removerá a parte "myprop".E é basicamente isso.
Apenas para cobrir alguns dos pontos que levantei originalmente nos Comentários:
No seu exemplo "comments_1", o motivo pelo qual nenhum comentário aparece no Word na versão inicial (o código XML que você postou e o Document.docx relacionado) é porque o Word precisa de um elemento <w:commentReference> para que os comentários apareçam na interface do usuário.
por exemplo, se você alterar a marcação que você postou na sua pergunta para isso e recriar o .docx, você deverá ver o primeiro comentário ao abrir o .docx no Word.
(Você não precisa ter o
<w:rPr>
elemento, mas o Word insere um).Como mencionei originalmente em um comentário à sua pergunta, o motivo pelo qual seu 1_comments.docx não abre é porque o arquivo docProps/custom.xml contém dois elementos com o mesmo FMTID e nome (o que não é permitido). Ele também tem quase 600 caracteres, mas embora eu achasse que o Word tinha um limite de 255 caracteres para uma propriedade de documento personalizada, ele não parece apresentar erros ou truncar.
Então, aqui, também alterei custom.xml para o seguinte para corrigir isso: