Страницы

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

суббота, 11 января 2020 г.

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

#python #docx


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

Если копировать, как текст, то нет разницы между цифрой в верхнем, нижнем или обычном
регистре

Пример таблицы

    


Ответы

Ответ 1



В версии 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") Как результат - в новом документе исходная формула.

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

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