Лучшее место для уникального идентификатора в DOCX (Open XML WordprocessingDocument)

Я ищу способ идентифицировать файлы DOCX, если они были перемещены или переименованы. Причина очевидна, я играю с Open XML SDK, создавая средство проверки гиперссылок.

Отлично работает, по крайней мере, он может добавлять или обновлять гиперссылки в документе.

Однако проблема в том, что если я переименую внешний файл (source.docx + target.docx в targetB.docx), ссылка будет разорвана. Я могу найти неработающие ссылки (просто проверив, находится ли связанный файл в заданном месте).

Но я хочу большего. Я хочу иметь возможность восстановить эти потерянные ссылки путем поиска всех документов в каталоге (docx) и сканирования, если они являются «целью». Самый простой способ - это сохранить GUID где-нибудь в свойствах документа, который не изменится, если документ будет переименован или отредактирован (контрольная сумма не применима).

Затем я создаю отдельный список ссылок и соответствующих идентификаторов, и если какой-либо документ переименовывается, я просто обновляю ссылку. Надеюсь, концепция понятна.

Итак, есть несколько основных вопросов:

  • Есть ли «лучшая практика» для хранения этой «настраиваемой информации» в документе Open XML?
  • Имеет ли документ обработки текстов (DOCX) уникальный идентификатор, созданный Word
  • Где бы вы сохранили сопоставление (GUID целевой гиперссылки)

Надеюсь, вопрос ясен, если не попробую уточнить, просто прокомментируйте, если вопросы ..

Спасибо Крис


person Community    schedule 14.03.2009    source источник


Ответы (3)


Поскольку это было пять лет назад, я надеюсь, что вы нашли ответ. Если это кому-то интересно, лучше всего будет создать новое настраиваемое свойство в ZIP-архиве (\ docProps \ custom.xml) и хранить в нем ваши метаданные. Самый простой способ - создать его в пользовательском интерфейсе Word, чтобы увидеть, как они работают, но в итоге вы получите custom.xml внутри архива DOCX, который выглядит примерно так:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
  <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="test">
    <vt:lpwstr>chris</vt:lpwstr>
  </property>
</Properties>

Как эта работа документируется в ECMA 376, стандартной документации формат файла.

Насколько мне известно, Word не хранит никаких идентификаторов GUID для однозначной идентификации файла.

person Chris Rae    schedule 04.01.2014

MS Word генерирует уникальный идентификатор (GUID) при создании нового документа начиная с Office 2013. Он помещает его в файл '\ word \ settings.xml' внутри элемента ‹w: settings› как имя 'docId'.

Например, в MS Word 2016:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:settings xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" mc:Ignorable="w14 w15 w16se">
    <w15:docId w15:val="{982A3D80-A23D-4148-8230-4160F3D87FF5}"/>
</w:settings>

Обратите внимание, что MS Word не меняет его при копировании файла. Итак, если каждый новый файл создается, а не копируется из другого, это надежный способ.

person Seraphinite Solutions    schedule 20.08.2019

В Acrobat / PDF есть нечто похожее. Найдите нумерацию Бейтса, которая используется для идентификации документов путем ввода уникального номера.

Обычно вы должны поместить это в раздел метаданных, если таковой имеется. Или добавьте настраиваемую часть в файл docx, которая сохраняет отображение (конечно, оставаясь в рамках спецификации). (Я не очень знаком с форматом docx, так что вам придется в этом разобраться.)

person dirkgently    schedule 14.03.2009