PDF und Openoffice
Anton Spengler
Gliederung
- Motivation
- Geschichte
- ODT
- Praxis
- Umwandlung
Motivation
HTML druckt
- Formulare, Bestätigungen, Rechnungen drucken
- HTML bedingt geeignet für Druck
- CSS media="printer"
- Ausdruck browserabhängig
- Probleme mit Tabellenheadern
- Seitenumbrüche
- Seitennummerierung
- Kopf- und Fusszeilen
- Druckerzusatzsoftware
PDF erstellen
Möglichkeiten
- html2pdf - Probleme wie oben
- pdflib - kostenpflichtig, umständlich
- fpdf - kostenlos, viele Module, umständlich
- Pussycat (lithron.de) - auf pdflib basierend, frei, bedingt geeignet
- Openoffice - einfach, frei, nicht geeignet from scratch
ODF
Geschichte
- OASIS Open Document Format for Office Applications
- ODF - OpenDocument
- An HTML angelehnte Auszeichnungssprache
- eigene XML-basierte Formatierungssprache
- für Formeln MathML
- von Sun entwickelt
- 2006 als ISO/IEC 26300 veröffentlicht
ODF
Die Technik
- ZIP-Datei
- Sammlung von XML-Dateien, Bilder
- .odt Text
- .ods Tabellen
- .odp Praesentationen
- .odg Zeichnungen
OpenDocument-Textdatei
Struktur
META-INF
manifest.xml
Thumbnails
thumbnail.png
Pictures
10000000000001E800000118B5A37F3F.png
mimetype
content.xml
styles.xml
meta.xml
settings.xml
Welche Datei wofür?
Dateien im einzelnen
- mimetype-Datei - application/vnd.oasis.opendocument.text
- manifest.xml - XML Namespace, listet alle Dateien inkl. MIME-Type
- meta.xml - Metainformationen, Autor, Datum ...
- Thumbnails/thumbnail.png - Miniaturansicht der ersten Seite des Dokuments
- Pictures-Ordner - Ordner für eingebettete Bilder
- settings.xml - dokumnetspezifische Konfiguration
- styles.xml - Default-Styles, Dokumentenvorlagen
- content.xml - Inhalt
Erste Schritte
Template anlegen
- Mit OO Dokument anlegen
- Platzhalter definieren
- Start- und Stopzeichen für Platzhalter festlegen (#)
Mit PHP öffnen
Entpacken
- PhpConcept Library - Zip Module 2.6 [2]
$archive = new PclZip($filename);
$list = $archive->extract(PCLZIP_OPT_PATH, POO_TMP_PATH, PCLZIP_OPT_ADD_PATH, $tmpDirName);
Ersetzungen
Inhalte einfügen
- Inhalte auf XML-Entitätent prüfen
- evtl.Entitäten umwandeln (< in < > in > & in ∓)
- Inhalte in UTF8 wandeln
- keine Doppelte Umwandlung - Zeichensalat
- Platzhalter durch Inhalt ersetzen (strreplace, preg_replace ...)
Zusammenpacken
Hier hilft PHPMyAdmin
- PclZip funktioniert nicht zum Packen
- Packen mit zip.lib.php aus PHPMyAdmin
$zip = new zipfile();
for($i = 0; $i < count($archiveFiles); $i++)
{
$file = $archiveFiles[$i];
$fp = fopen(POO_TMP_PATH."/".$this->tmpDirName."/".$file, "r");
$content = fread($fp, filesize(POO_TMP_PATH."/".$this->tmpDirName."/".$file));
fclose($fp);
$zip->addFile($content, $file);
}
Ausgabe
Speichern und aufräumen
$fp = fopen($filename, "w");
fputs($fp, $zip->file());
fclose($fp);
Header("Content-Disposition:attachment; filename=MyDocument.odt");
Header("Content-Type:application/vnd.oasis.opendocument.text");
echo file_get_contents($filename);
unlink( ARCHIV );
Tabellen
erweiterte Ersetzungen
- Tabellen ähnlich wie in HTML
- Nicht nur Tabelleninhalt ersetzen sondern Zeilen
- Code für Tabellenzeile im Template durch Platzhalter ersetzen
- Tabelle Zeile für Zeile mit Inhaltfüllen und im Template ersetzen
- Nur Inhalt auf XML-Entities überprüfen
Beispiel Tabelle
Der Tabellencode
<table:table-row>
<table:table-cell table:style-name="Tabelle5.A1" office:value-type="string">
<text:p text:style-name="P8">#Mwstsatz# % Mehrwertsteuer in €</text:p>
</table:table-cell>
</table:table-row>
Bilder
Einfach kopieren
<draw:image xlink:href="Pictures/#meinbild#" xlink:type="simple"
xlink:show="embed" xlink:actuate="onLoad"/>
- Ersetzung
- Bild in Pictures-Ordner kopieren
Verpackt
Klasse phpOpenoffice.php
- Klasse von Bjoern Kahle [3]
$dokument = new phpOpenOffice($this);
$dokument->loadDocument("/var/www/kelvin/protected/templates/templatefertig.odt");
$dokument->parse($replace);
$dokument->kopiereBilder($bildzukopieren);
$dokument->savefile("/daten/Schriftverkehr/ODT/".$dokumentenname);
Aus ODT mach PDF
Cups kann das
- cups-pdf
- Virtuelle Drucker mit PDF-Ausgabe
export XAUTHORITY=/home/anton/.Xauthority
export DISPLAY=:0.vt7
/usr/bin/soffice -nolog -invisible -pt PDFDrucker datei && sleep 3