Страницы

Поиск по вопросам

вторник, 5 марта 2019 г.

Копирование химических формул из .docx

Как с помощью библиотеки python-docx извлечь химическую формулу из текста ячейки таблицы и перенести ее в другую таблицу?
Если копировать, как текст, то нет разницы между цифрой в верхнем, нижнем или обычном регистре
Пример таблицы


Ответ

В версии 0.8.6 python-docx этот функционал отсутствует, даже нужного пространства имен нет и нигде нет упоминания нужных тегов, то есть нет ни единого упоминания возможности работы с математическими элементами. Формулы из Word, например, в сыром виде выглядят как-то так. Исходная формула: ex=sin(x)
docx:
e x =isin(x)
То есть вы можете попробовать спуститься в самый адок и обращаться с docx, как с набором XML документов. И вам необходимо найти в параграфе, в ячейке, где хотите нужный тег и потом вставить также в новый параграф, ячейку, куда хотите. Вот такой вот примерчик приведу. Он копирует формулу из одного документа, в пустой другой документ. В исходном документе нет ничего, кроме этой формулы. Однако, я бы уверенно себя не чувствовал на этом пути, даже если простой пример и работает. Также вместо тупого итерирования вы можете отыскать нужный элемент с тегом в пространстве {"m": xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"}. Итак:
import docx
d = docx.Document("formula_test.docx")
new_doc = docx.Document() new_para = new_doc.add_paragraph() new_para_elem = new_para._element
para_with_formula = d.paragraphs[0]
# Это уже объект типа CT_P, родителем которого является lxml.Element elem = para_with_formula._element # Пространство имен `m` xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" tmp_ns = {"m": "http://schemas.openxmlformats.org/officeDocument/2006/math"}
math_tag_with_namespace = "{" + tmp_ns["m"] + "}oMathPara"
for i in elem.getiterator(): if i.tag == math_tag_with_namespace: print("OH! A formula!") new_para_elem.append(i)
new_doc.save("NEW_DOC.docx")
Как результат - в новом документе исходная формула.

Комментариев нет:

Отправить комментарий