Форум сайта python.su
0
Добрый день. Моя программа после расчётов должна выполнить отчёт и сохранить его в формате .odt
Помогите пожалуйста разобраться с библиотекой pyODF.
Разобрался как создавать текст, но в отчёт хотелось бы ещё вставить формулы Math.
пробую так:
from odf import opendocument
from odf import math
def main():
document = opendocument.OpenDocumentText()
formula = math.Math(c = 'sqrt{9}')
document.createElement(formula)
document.save('odftrenning.odt')
if __name__ == '__main__':
main()
Отредактировано (Окт. 26, 2011 13:00:36)
Офлайн
0
Решил проблему в обход.
Алгоритм такой:
1. Разархивирую ранее набранный файл odt (болванка)
2. Внутри лежат xml файлы. В них нахожу нужное слово, заменяю его на требуемое значение.
3. Снова запаковываю и вуаля: получаю красивый отчёт в виде текстового документа с формулами.
Хоть и многодельно, зато работает на ура.
p.s. библиотека pyODF оказалась ненужной
Офлайн
0
Написал пару функций для генерации элемента math. Может пригодится кому-нибудь
#!/usr/bin/env python # -*- coding: utf-8 -*- from xml.dom.minidom import parseString from xml.dom import Node import odf import odf.opendocument import odf.text from odf.element import Element from namespaces import MATHNS math_templ = u'\ <math xmlns="http://www.w3.org/1998/Math/MathML">\ <semantics>\ <annotation encoding="StarMath 5.0">%s</annotation>\ </semantics></math>' def gen_odf_math_(parent): elem = Element(qname = (MATHNS,parent.tagName)) if parent.attributes: for attr, value in parent.attributes.items(): elem.setAttribute((MATHNS,attr), value, check_grammar=False) for child in parent.childNodes: if child.nodeType == Node.TEXT_NODE: text = child.nodeValue elem.addText(text, check_grammar=False) else: elem.addElement(gen_odf_math_(child), check_grammar=False) return elem def gen_odf_math(starmath_string): u''' Generating odf.math.Math element ''' mathml = math_templ % (starmath_string) math_ = parseString(mathml.encode('utf-8')) math_ = math_.documentElement odf_math = gen_odf_math_(math_) return odf_math def main(): doc = odf.opendocument.OpenDocumentText() p = odf.text.P(text=u'text') df = odf.draw.Frame( zindex=0, anchortype='as-char') p.addElement(df) doc.text.addElement(p) formula = 'c = sqrt(a^2+b_2) + %ialpha over %ibeta' math = gen_odf_math(formula) do = odf.draw.Object() do.addElement(math) df.addElement(do) outputfile = u'result' doc.save(outputfile, True) if __name__ == '__main__': main()
Отредактировано __akm__ (Окт. 6, 2015 20:53:55)
Офлайн
253
KultomТолько надо сделать так чтобы оно не встретилось случайно в другом месте. Делали такие штуки в несколько более развернутом виде. Проблема в том, что часто нужно вставить таблицы или рисунки. В одни документ вставить другой. Применить совершенно нестандартную схему нумерации. и т.п. Мы использовали внутри документа разметку из mako templates. А таблички и прочие сложные объекты вставляли функцией (мако допускает шаблонные функции).
В них нахожу нужное слово
Офлайн
0
Разобрался в итоге. Теперь более красивый вариант.
#!/usr/bin/env python # -*- coding: utf-8 -*- import odf from odf.opendocument import OpenDocumentText from odf.element import Element from odf.text import P from odf.math import Math from namespaces import MATHNS def main(): doc = OpenDocumentText() p = P(text=u'text') df = odf.draw.Frame( zindex=0, anchortype='as-char') p.addElement(df) doc.text.addElement(p) formula =u'c=sqrt(a^2+b^2)' math = Math() annot = Element(qname = (MATHNS,u'annotation')) annot.addText(formula, check_grammar=False) annot.setAttribute((MATHNS,'encoding'), 'StarMath 5.0', check_grammar=False) math.addElement(annot) do = odf.draw.Object() do.addElement(math) df.addElement(do) outputfile = u'result' doc.save(outputfile, True) if __name__ == '__main__': main()
Офлайн
253
__akm__А use case какой у этой конструкции?
Теперь более красивый вариант.
Офлайн
0
Мне нужно сгенерировать трассировку инженерного расчёта с описанием хода решения. Там должны быть формулы. ODFpy позволяет сгенерировать данный отчёт. Вначале использовал docutils с конвертацией rst в html. Потом захотелось иметь возможность ручной корректировки отчёта и остановился на формате odt.
Офлайн