Не вижу специальных символов шрифта в run.text (иногда) - PullRequest
1 голос
/ 23 сентября 2019

У меня есть документ Word, смешивающий некоторые символы Wingdings с текстом Cambria.Когда я смотрю в прогоны, я иногда вижу run.text длиной 1 и символ в шестнадцатеричном формате, например 0xf063.Run.font.name, например, Wingdings 2. Это как и ожидалось.Но часто я вижу пустой run.text (имя шрифта по-прежнему Wingdings).Тем не менее, символы должны быть там, потому что, когда я добавляю цикл к новому абзацу, я могу видеть их в Word, по крайней мере, когда я пропускаю их только через.Однако, когда я дублирую пробег (как можно лучше), персонажи теряются, вероятно, потому что, когда я дублирую пробег, я что-то пропускаю.Поэтому мой вопрос: где хранятся символы, когда run.text пуст, и что я должен соблюдать, когда дублирую такой прогон.Однако символы не теряются при дублировании прогона, если run.text не пуст.Таким образом, проблема возникает, когда документ читается, и иногда символ находится в run.text, а иногда где-то еще.Какой из них непредсказуем для меня.

Мне просто пришла в голову идея разархивировать документ и посмотреть в document.xml.Там я вижу

<w:r w:rsidRPr="00946796"> 
  <w:rPr> <w:color w:val="EE9512"/> 
    <w:lang w:val="de-DE"/> 
  </w:rPr> 
  <w:t xml:space="preserve">YYYYYYY 
  </w:t> 
</w:r> 
<w:r w:rsidR="009E034B" w:rsidRPr="00695B07"> 
  <w:rPr> 
    <w:rFonts w:ascii="Wingdings 3" w:hAnsi="Wingdings 3"/> 
    <w:color w:val="EE9512"/> 
  </w:rPr> 
  <w:sym w:font="Wingdings 2" w:char="F038"/> 
</w:r> 

Так что, когда run.text пуст, символы находятся в элементе aw: sym, иначе в элементе aw: t.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Через несколько часов я думаю, что вижу полную картину.Во-первых, как писал scanny выше, python-docx вообще не обрабатывает элементы w: sym (пока?), Поэтому они теряются после чтения docx, если вы не прибегаете к lxml.Тогда почему я иногда вижу символ Wingdings в w: t, иногда в w: sym?Что ж, если я использую средство выбора символов Word (окно со всеми символами шрифта, где вы можете выбрать один из них и нажать «Вставить» внизу), то вы получите элемент aw: sym.Если вы просто установите шрифт Wingdings, а затем наберете подходящий символ на клавиатуре (например, 8 для круга Wingdings 2 с точкой внутри), вы получите элемент aw: t.Таким образом мне удалось удалить все элементы w: sym.Чтобы определить «подходящего» персонажа, поищите в Google «Переводчик Wingdings».

0 голосов
/ 23 сентября 2019

Вы можете увидеть специальный символ как «символ» здесь:

<w:r w:rsidR="009E034B" w:rsidRPr="00695B07"> 
  <w:rPr> 
    <w:rFonts w:ascii="Wingdings 3" w:hAnsi="Wingdings 3"/> 
    <w:color w:val="EE9512"/> 
  </w:rPr> 
  <w:sym w:font="Wingdings 2" w:char="F038"/>  <!-- <<==== this line -->
</w:r>

Я не исследовал это подробно, но я ожидаю, что различие здесь в том, что глифы в этом «шрифте» нет стилизованных версий кодовой точки Unicode, в которой они появляются.

Например, в этом шрифте нет символов «A», «B», «C», эти позиции занятыстрелками или чем-то другим.

Я полагаю, что различие важно, потому что вы не можете получить хорошие результаты, заменив подобный шрифт, если Windings 2 не установлен на текущем компьютере.Поэтому, по крайней мере, поведение замены шрифта для этого символа будет отличаться от обычного символа.

API еще не поддерживает символы в циклах, поэтому для доступа к этим вызовам необходимо использовать вызовы lxml.элементы, возможно, что-то вроде:

from docx.oxml.ns import qn

syms = run._r.xpath("./w:sym")
for sym in syms:
    print("font == %s" % sym.get(qn("w:font")))
    print("char == %s" % sym.get(qn("w:char")))
...