Das OpenDocument Dateiformat

Unter dem Namen OpenDocument werden mehrere noch relativ neue und offene Dateiformate zusammengefasst. Gebraucht werden sie unter anderem für Textdokumente, Tabellenkalkulationen, Präsentationen, Formeln, Diagramme und Bilder. OpenDocument ist das Standardformat der freien Bürosoftware OpenOffice.org und wird von vielen anderen Programmen unterstützt.

OpenDocument Dateien bestehen aus gezippten XML Dateien. Dadurch kann man sie sehr einfach bearbeiten, es reicht bereits ein simpler Texteditor. Die Einfachheit der Formate erlaubt es auch Programmiersprachen wie PHP Daten aus OpenDocument Dateien zu extrahieren oder zu bearbeiten.

Eine weitere Besonderheit des OpenDocument Formats: Jede Datei enthält ein Screenshot seines Inhaltes. Dieses PNG Bild befindet sich immer in OPENDOCDATEI/Thumbnails/thumbnail.png. Um dieses Screenshot anzuzeigen, muss man also lediglich eine OpenDoc Datei entzippen und das Bild aus dem vorgegebenen Pfad extrahieren.

Screenshot auslesen

Wie bereits geschrieben, ist es einfach ein Screenshot einer OpenDoc Datei darzustellen. Wir müssen sie lediglich entzippen. PHP stellt uns zu diesem Zweck die ZIP Funktionen zur Verfügung. Diese Funktionen sind kein Standard-Bestandteil von PHP sondern müssen zusätzlich installiert werden. Sind sie nicht installiert, funktioniert folgendes Skript nicht.

<?php

function opendoc_thumb($datei)
{
    
// Datei ueberpruefen
    
$zip_pfad getcwd() . '/' $datei;
    if (!
file_exists($datei) or !is_readable($datei) or !($zp zip_open($zip_pfad))) {
        return 
false;
    }

    
// Pfad des Thumbnail in der OpenDoc Datei
    
$tn_pfad 'Thumbnails/thumbnail.png';

    while (
$zip_inhalt zip_read($zp)) {
        if (
zip_entry_name($zip_inhalt) == $tn_pfad && zip_entry_open($zp$zip_inhalt'r')) {
            
$inhalt zip_entry_read($zip_inhaltzip_entry_filesize($zip_inhalt));
            
zip_entry_close($zip_inhalt);
            break; 
// Schleife verlassen
        
}
    }
    
zip_close($zp);

    
// Thumbnail oder FALSE zurueckgeben
    
if (isset($inhalt)) {
        
// der Inhalt wird als Bild ausgegeben
        
header('Content-Type: image/png');
        
header('Content-Disposition: inline');
        
header('Content-Description: Thumbnail einer OpenDocument Datei');
        return 
$inhalt;
    }
    return 
false// fuer ZIP Dateien
}

// Funktionsaufruf: Screenshot anzeigen
echo opendoc_thumb('test.odt');

?>

Als Ergebnis bekommt man ein Screenshot der gewählten OpenDocument Datei. So wie das Skript hier steht, überprüft es nicht, ob die übergebene Datei auch wirklich eine OpenDoc Datei ist. Wenn man also den Pfad einer fremden existierenden Datei übergibt, erhält man einen Fehler. Theoretisch kann die Funktion jede beliebige *.zip Datei entpacken und darin nach einem Thumbnail suchen. Wird keines gefunden, wird FALSE zurückgegeben.

Weiterführende Links: