AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-6125779

Kishieel's questions

Martin Hope
Kishieel
Asked: 2025-04-07 17:50:09 +0800 CST

Como armazenar metadados ocultos e persistentes em arquivos DOCX que sobrevivem a edições

  • 6

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.

ms-word
  • 1 respostas
  • 57 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve