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.