Bien souvent, je vois des développeurs s'escrimer avec des macros pour gérer les données de document.
Pourtant, le format ODF permet d'extraire et d'exporter le contenu très simplement.
Pourquoi ? Parce que l'ODF est un assemblage de XML compressé dans une archive en ZIP.
Cette archive comporte plusieurs fichiers et notamment le fameux content.xml qui comme son nom est le contenu.
Avec PHP, vous pouvez lire ce XML afin de générer un fichier plus lisible comme un CSV ou un script SQL par exemple.
Il existe 2 classes principales pour lire du XML :
- SimpleXML qui lit l'intégralité du fichier en mémoire et le convertit en un objet. Ce processus n'est pas adapté aux fichiers de grande taille
- XMLReader qui, au contraire, lit le fichier progressivement et permet d'effectuer les opérations nécessaires successivement sur chaque nœud.
Un exemple de traitement d'un ODT :
Code : Tout sélectionner
$odt = "test.odt";
$xml = new XMLReader();
$xml->open("zip://$odt#content.xml", "r");
while ($xml->read()) {
if($xml->nodeType == XMLReader::END_ELEMENT) {
continue;
}
if ($xml->name == "text:h") {
// Titre 1 (heading 1) devient <h1>
// Titre 2 (heading 2) devient <h2>, etc...
$level = $xml->getAttribute("text:outline-level");
echo "<h$level>" . utf8_decode($xml->readString()) . "</h$level>";
} elseif ($xml->name == "text:p") {
echo "<p>" . utf8_decode($xml->readString()) . "</p>";
}
}
On notera que depuis PHP 4.3.0, l'ouverture d'un ZIP est directe avec le support des flux de compression.