DMZ
08:11 22-02-2011 DOC / RTF / ODT / ... -> HTML / PDF / DOC / ODT / RTF / ...
Немного рабочих моментов и полезного кода. Может кому пригодится.

Конвертируем все что угодно в что-то другое с помощью OpenOffice/LibreOffice. Понадобилось тут автоматизировать наконец это дело.

Первая рабочая версия. Дальше уже можно пилить по вкусу.

Принцип работы — uno. Первый раз слышу. Похоже на COM в Windows. Запускает OpenOffice в фоне и общается с ним по TCP.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# -*- coding: utf-8 -*-
#!/usr/bin/env python
# Copyright (C) 2011 DMZ <dmz @the-island.ru>
# Licensed under the GNU LGPL v2.1 - or any later version.
 
from ooutils import oo_properties as oop, OORunner
from optparse import OptionParser, OptionValueError
import sys
import re
import os
 
from unohelper import systemPathToFileUrl
from com.sun.star.beans import PropertyValue
 
# http://wiki.services.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_3_0
CONVERT = {
    'html': 'HTML (StarWriter)',
    'xhtml': "XHTML Writer File",
    'rtf': "Rich Text Format",
    'doc': "MS Word 97",
    'odt': "StarOffice XML (Writer)",
    'pdf': "writer_pdf_Export",
}
 
def read_format(option, opt, value, parser):
    value = value.lower()
    if value not in CONVERT:
        formats = ', '.join(CONVERT.keys())
        raise OptionValueError(
            'Формат вывода не поддерживается. Доступные форматы: %s' % formats)
    setattr(parser.values, option.dest, CONVERT[value])
 
if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option('-i', '--input', dest='input')
    parser.add_option('-o', '--output', dest='output')
    parser.add_option('-f', '--format', action='callback', type='string',
        callback=read_format, dest='format', default=CONVERT['html'])
    (options, args) = parser.parse_args()
 
    if not options.input:
        print >>sys.stderr, u"Укажите месторасположение входящего файла (-i)"
        sys.exit(1)
 
    if not options.output:
        print >>sys.stderr, u"Укажите месторасположение итогового файла (-o)"
        sys.exit(1)
 
    odir = os.path.dirname(options.output)
    if not os.path.isdir(odir):
        print >>sys.stderr, u"Путь для сохранения (%s) не существует" % odir
        sys.exit(1)
 
    if not os.path.isfile(options.input):
        print >>sys.stderr, u"%s: Указанный файл не существует" % options.input
        sys.exit(1)
 
    oor = OORunner()
    desktop = oor.connect()
 
    document = desktop.loadComponentFromURL(systemPathToFileUrl(options.input),
        "_blank", 0, oop(ReadOnly=True, Hidden=True))
 
    print u"Сохраняем документ в %s" % options.output
 
    document.storeToURL(systemPathToFileUrl(options.output),
        oop(Overwrite=True, FilterName=options.format))
 
    document.close(True)
    oor.shutdown()
ooutils можно взять тут и сохранить в отдельный файл (положить или в папку со скриптом или в питоновские пути)

Фикс для нахождения LibreOffice (amd64):

1
2
3
4
# Find OpenOffice.
    _oopaths=(
        ('/usr/lib64/libreoffice/program', '/usr/lib64/libreoffice/program'),
     )
Пример:

1
python o2o.py -i document.odt -o document.pdf -f pdf
Комментарии:
Nothingj
09:00 22-02-2011
А если я ключ -o забуду указать?
DMZ
09:11 22-02-2011
Пофиксено. Заодно забыл pdf-опцию указать
3 CaHuTaPa
10:15 25-02-2011
Это ничего, что я к вам на "ВЫ" обращаюсь?