OpenDocument ODT i Python

Pliki Open Document Text (ODT) stosowane są m.in. w pakietach OpenOffice czy Koffice. Pliki ODT to w rzeczywistości pliki ZIP zawierające określony zestaw plików. By przekonwertować plik ODT do XHTML musimy:
- Otworzyć plik zip i odczytać potrzebne pliki
- Pobrać zawartość pliku content.xml z treścią
- Pobrać potencjalne grafiki i zapisać je pod określoną nazwą
- Dokonać konwersji content.xml za pomocą szablonu XSL do kodu XHTML
- Zapisać wynik :)

Prosty kod wyglądałby tak:
# -*- coding: utf-8 -*-
import zipfile, sha, re
#4suite http://4suite.org/index.xhtml
from Ft.Xml.Xslt import Transform

#otwieramy plik ODT - ZIP
z = zipfile.ZipFile("oofice.odt", "r")
images = {}
# przechodzimy w pętli wszystkie pliki w archiwum
for zfile in z.namelist():
	# wyciągamy wszystkie grafiki
	if zfile.find('Pictures/') != -1:
		zfile_content = z.read(zfile)
		digest = sha.new(zfile_content).hexdigest()
		x = open('files/'+digest, 'w')
		images[zfile.replace('Pictures/', '')] = digest
		x.write(zfile_content)
		x.close()
# czytamy treść
content = z.read('content.xml')

# wyszukujemy grafiki
tags = re.findall('<draw:image xlink:href="Pictures/([a-z .A-Z_0-9]*)" (.*?)/>', content)
for pic in tags:
	# i oszukańczo wstawiamy XHTML
	content = content.replace('<draw:image xlink:href="Pictures/'+ pic[0] +'" '+ pic[1] +'/>', '<draw:image xlink:href="Pictures/'+ pic[0] +'" '+ pic[1] +'/>&lt;img src="files/' +images[pic[0]] + '" alt="" /&gt;')
# konwertujemy XML do XHTML za pomocą szablonu XSL
result = Transform(content, 'template.xsl')
# zapis wyniku
x = open('res.html', 'w')
x.write(result.replace('&lt;img', '<img').replace('/&gt;', '/>'))
x.close()
W pythonie jest wiele modułów umożliwiających konwersję XSLT, ja wykorzystałem 4suite (strona projektu). Reszta to czysty python. Dodatkowo grafiki nie są zapisywane pod domyślnymi nazwami tak by uniknąć nadpisywanie się grafik przy konwersji wielu plików ODT. Grafiki zapisywane są do katalogu files a nazwy to ich hasze sha1.
Oto zawartość template.xsl używanego przez kod:
RkBlog

Podstawy Pythona, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact