Запретить Word 2010 сохранять o: gfxdata base64 или uuencoded VML?

Я работаю с файлами .docx, содержащими несколько холстов для рисования со вставленными изображениями, а также некоторые линии и стрелки, нарисованные в Word 2010. Я использую формат 2010 без режима совместимости.

Word вставляет атрибут o:gfxdata в каждый элемент v:shape и v:group и заполняет его чем-то в кодировке ascii. Судя по тому, что я прочитал, это может быть копия VML с описанием v:shape или v:group. Я не знаю, просто ли я не знаю, что искать, но я не могу определить, для чего нужны эти данные, поскольку их удаление не оказывает видимого влияния на мою способность читать или редактировать документ в Word 2003, 2007 или 2010. .

Он увеличивает размер файла document.xml почти вдвое по сравнению с (очевидным) необходимым размером. Это значительно замедляет обработку OpenTBS, поэтому я хотел бы удалить его, если возможно. Кто-нибудь знает, как сказать Word 2010 прекратить сохранение этих дополнительных данных? Или для чего это нужно? Я действительно изо всех сил пытался найти какую-либо документацию по нему, кроме этот пост.

Изменить:

Вот образец .docx. Размер document.xml составляет ~ 141 КБ, а OpenTBS в среднем 21 раз создает файл, который включает его в качестве подшаблона, за 10,35 секунды. Если я удалю все атрибуты o: ogfxdata, размер файла уменьшится до ~ 37 КБ, а OpenTBS создаст тот же файл всего за 2,99 секунды.

Изменить 2:

После дальнейшего расследования выяснилось, что удаление o: gfxdata может привести к тому, что Word 2003 с установленным более старым пакетом Compatibilty Pack возразит против файла со следующей ошибкой:

«Это предварительная версия пакета обеспечения совместимости и может открывать только файлы предварительного выпуска Office 2007. Вы хотите проверить наличие более новой версии пакета обеспечения совместимости?»

Мне удалось открыть файл, установив более новый пакет совместимости, хотя он запрашивает у пользователя информацию о несовместимости и преобразует файл, чтобы открыть его. Это не повредит моему файлу, но это то, на что нужно обратить внимание.


person Sarah Kemp    schedule 28.01.2013    source источник
comment
Можете ли вы привести в качестве примера документ docx?   -  person Skrol29    schedule 29.01.2013
comment
Я отредактировал сообщение, включив в него образец файла и несколько тестов. Спасибо за чтение.   -  person Sarah Kemp    schedule 29.01.2013


Ответы (1)


Атрибут o:ogfxdata плохо документирован в сети. Согласно вашим расследованиям, это какая-то дополнительная информация о совместимости.

Вы можете удалить эти атрибуты в своем шаблоне с помощью OpenTBS. Очистку шаблона можно выполнить один раз без слияния, а затем сохранить очищенный шаблон как новый шаблон. Или вы можете выполнять очистку каждый раз, когда открываете шаблон.

Очистка файла DOCX:

while ($x = clsTbsXmlLoc::FindStartTagHavingAtt($TBS->Source, 'o:gfxdata', 0) ) {
  $x->ReplaceAtt('o:gfxdata', '');
  $TBS->Source = str_replace(' o:gfxdata=""', '', $TBS->Source);
}

Обратите внимание, что класс clsTbsXmlLoc предоставляется с OpenTBS и недокументирован. Код должен работать с OpenTBS 1.8.0. (который в настоящее время находится в стабильной бета-версии).

Я заметил, что, поскольку атрибуты o:gfxdata удалены, они не возвращаются сразу после редактирования файла docx.

person Skrol29    schedule 29.01.2013
comment
Вы не ошиблись относительно отсутствия документации для этого атрибута - я, конечно, изо всех сил пытался что-то найти. Я считаю, что атрибут o: gfxdata вводится, когда вы запускаете 'Файл ›Информация› Преобразовать' в более раннем документе в Word 2010. В любом случае это решение отлично работает в моем быстром тесте, и я считаю, что оно отлично подойдет мне, особенно Если вы можете ответить на другой вопрос, который я собираюсь задать, о getpart. - person Sarah Kemp; 30.01.2013