PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘OpenOffice.org’ tag

Die „Technik“ hinter 7-PDF Server

with one comment

So, nachdem Michael dankenswerterweise seinen ersten Blogartikel über die 7-PDF PHP Library verfasst hat, wird es nun Zeit euch meinem ersten Gastbeitrag überhaupt in einem Online-Blog zu präsentieren. Ich muss gestehen, ich bin daher ein wenig aufgeregt.

Ich möchte euch zuerst einmal einige technische Hintergrundinformationen zum 7-PDF Server geben, bevor es dann weiter zu den Installationschritten des Servers unter Windows geht.

Fangen wir also an…

Was genau verbirgt sich eigentlich hinter 7-PDF Server?

7-PDF Server basiert im Kern aus zwei „Softwarekomponenten“ die unter Java entwickelt, und auf einem Tomcat Applikationsserver laufen, sowie einer OpenOffice.org Instanz. Im einzelnen handelt es bei den Komponenten also um:

  • …einem von mir entwickelten J2EE-Webservice, den ich „7-PDF API“ getauft habe,
  • …einer ebenfalls von mir entwickelten J2EE-Webapplikation, die „7-PDF Web Portal“ heisst, und als PDF-Browsertool PDF-Erzeugung über ein „Webinterface“ ermöglich,
  • …sowie einer selbst kompilierten, und für den Serverbetrieb optimierten OpenOffice.org Instanz

Das „Zusammenspiel“ zwischen der 7-PDF PHP Library, 7-PDF API und Openoffice.org…

Werfen wir nun einen Blick unter die „Motorhaube“ des 7-PDF Servers um einen ersten Einblick in die Technologie und das Zusammenspiel der oben genannten Softwarekomponenten zu erhalten:

Ausgangspunkt soll hier einmal die Verwendung der 7-PDF PHP Library sein. Nutzen wir die Library dazu eine Datei nach PDF zu konvertieren, wie im Artikel von Michael beschrieben, so sprechen wir als erste Komponente die 7-PDF API, also den „Webservice“ des 7-PDF Servers an. Der „7-PDF API“ Webservice bietet erst einmal die simple Möglichkeit, von nahezu jeder webservicefähigen Programmiersprache, mittels SOAP angesprochen und verwendet werden zu können. Mit Blick auf die 7-PDF PHP Library steht euch für PHP bereits eine fertige PHP-Library zur Verfügung um diesen „Service“ mit Dateikonvertierungen nach PDF zu „beauftragen“.
Beauftragen wir nun einmal gedanklich den „Service“ mit einer Dateikonvertierung nach PDF. Die Datei wird hierfür von der PHP-Library via WebDAV an den 7-PDF Server übermittelt. Der Service erhält, nach erfolgreicher Übertragung der Eingangsdatei, von der PHP-Library eine SOAP-Meldung mit darin enthaltenen Informationen wie Speicherort der Eingangsdatei am Server, PDF-Konvertierungseinstellungen (Bildkompressionsrate, PDF-Sicherheitseinstellungen etc.) etc. Die empfangene SOAP Meldung leitet der Webservice über eine Java-Softwareschnittstelle (Java UNO-Bridge) an OpenOffice.org weiter. Die Java UNO-Bridge wird von OpenOffice.org zur Verfügung gestellt, dass heisst, Sie ist quasi Bestandteil von OpenOffice.org selbst und ermöglicht es Funktionalitäten der Office-Suite in eigene Java-Anwendungen zu nutzen. Im Falle von 7-PDF Server, bedienen wir uns des „genial integrierten“ PDF-Exports von OpenOffice.org, und sprechen diesen für die angestoßene Konvertierung an. Das Eingangsdokument wird nun, von dem im Servermodus laufenden OpenOffice.org, nach PDF konvertiert. Ist diese Konvertierung beendet, sendet der Webservice eine entsprechende Meldung an den (SOAP)-Client zurück. In der Meldung enthalten ist dann der Speicherpfad des zuvor erzeugten PDF-Dokuments am Server. Die PHP – Library, die in unserem Beispiel nun den SOAP-Client darstellt, kann dann mit dem Download der fertigen PDF-Datei beginnen.

Ich habe bewusst keine SOAP-Attachments bei der Realisierung der 7-PDF API in Erwägung gezogen, da ich speziell für den Dateiupload WebDAV für das „geeignetere“ Protokoll hielt. Den die Anforderungen an 7-PDF Server haben gezeigt, dass auch sehr große Dateien sicher nach PDF umgewandelt werden müssen. Im Grunde wird also mittels SOAP nur die gewünschte Konvertierungsabsicht an den Webservice übermittelt.

Ein Abschnitt zur Rechteverwaltung…

WebDAV hat zudem noch einen weiteren entscheidenden Vorteil in Verbindung mit Tomcat: Das benötigte WebDAV-Servlet ist Teil des Tomcat-Applikationsservers, und es kann direkt mit der Rechtesteuerung des Applikationsservers „Tomcat“ (Security-Constraints / Realm) verwendet werden. Also kann man die Übertragung der Eingangsdokumente recht einfach mit einer Rechteverwaltung versehen. Ich habe beispielsweise auf meiner 7-pdf.de – Website die Typo3-Frontendregistrierung des CMS-Systems für den freien Online- und Testkonvertierungsserver, an die Rechtesteuerung des Tomcat Applicationservers gebunden. Die Rechteverwaltung findet damit dynamisch, über entsprechende MySQL-Tabellen von Typo3 statt. Es ist grundsätzlich auch möglich 7-PDF Server beispielsweise über LDAP an ein Active Directory anzubinden usw. Entsprechende Dokumentationen findet man unter den Stichworten „Tomcat“ und „Realm“ im Web.

Damit sollte euch nun das prinzipielle Zusammenspiel der Softwarekomponenten des 7-PDF Servers klar sein, und auch klar sein wie eine PDF-Konvertierung auf dem 7-PDF Server grundsätzlich abläuft.

Einige Zeilen möchte ich an dieser Stelle noch über die Performance dieser PDF-Erzeugung „verlieren“: OpenOffice.org arbeitet im Servermodus derart performant, dass 2000 – 4000 Dateikonvertierungen pro Stunde nach PDF kein Problem darstellen. Vorausgesetzt das Hardware-Sizing und die Bandbreite zwischen „Server“ und „Client“ stimmen. Auch wenn ich mich persönlich bereits seit Jahren intensiv mit dieser „Technologie“ auseinandersetze, finde ich doch hauptsächlich diese Performance „bis heute“ – bemerkenswert.

Wer sich näher mit der Programmierung von Java Webservices oder der Programmierung von OpenOffice.org beschäftigen möchte, den seien die jeweiligen SDK’s der Softwarehersteller ans Herz gelegt. Nähere Informationen speziell zur erwähnten Java UNO-Bridge sind der Dokumentation des OpenOffice.org SDK’s auf der OpenOffice.org Website zu entnehmen.

Die Installation des 7-PDF Servers…

Kommen wir also nach dem Blick unter die Motorhaube von 7-PDF Server zur eigentlichen Installation. Hierfür steht bereits eine fertige Setupinstallation für das Betriebsystem Windows auf www.7-pdf.de/download zur Verfügung. Diese installiert dabei den 7-PDF Server als „lokalen Dienst“, optional steht auch die Startoption „Manuell“ zur Auswahl. Alle notwendigen Verknüpfungen stehen nach der Installation in einem entsprechenden Programmgruppen-Verzeichnis unter „Start → Programme → 7-PDF → 7-PDF Server“ zur Verfügung. Neben den Start/Stop – Verknüpfungen für das manuelle Anstarten des Servers, findet man hier auch Direktlinks zu den Web- und Downloadseiten der 7-PDF Libraries (Java und PHP).

Unter meinem Windows 7 „Professional“ 64Bit – System sieht das nach der Installation so aus:

Die Abbildung zeigt die Programmgruppe des 7-PDF Servers nach der Installation.

Einige Shortcut-Infos zur Installation…

  • 7-PDF Server installiert sich als „7pSrv“ – Dienst auf Windows-Systemen
  • Man benötigt eine funktionsfähige JRE-Installation >= Version 1.5 (JRE5) auf dem System
  • Port 8080 → Der primäre Netzwerkport, auf dem der 7-PDF Server kommuniziert.
    Hinweis: Dieser Port sollte über eventuell laufende Firewalls freigeschaltet werden, damit der 7-PDF Server auch im lokalen Netzwerk erreicht werden kann.
  • Folgende Ports sollten auf deinem System nicht bereits belegt sein:
    Port 8100 → für die im Servermodus betriebene OpenOffice.org Instanz
    Port 8005, 8009 → Sind vom Tomcat-Applikationsserver benötigte Ports
  • Für einen „richtig flüssigen“ Betrieb des Servers empfiehlt sind eine Hardware mit folgenden „Eckdaten“:
    2-4GB RAM, >=2 GHz CPU, 230MB Festplattenspeicher für die Serverinstallation, sowie ausreichend Festplattenspeicher für temporär erzeugte Dateien.
  • Als Betriebssystem tut es im Grunde Windows XP Professional, eine Installation unter Windows 2003 + 2008 Server, sowie VISTA und Windows 7 ist natürlich grundsätzlich auch möglich. Der Betrieb des Servers unter Windows 64-Bit Betriebssystemen ist ebenfalls möglich. Für den produktiven Einsatz, sollte 7-PDF Server generell aber auf einem Serverbetriebssystem installiert und betrieben werden. Ich habe 7-PDF Server unter Windows 2003 Server (64 Bit) im produktiven Einsatz.

Die Windowsinstallation – „Step by Step“…

Das eigentliche Setup des 7-PDF Servers gestaltet sich, wie bereits Eingangs erwähnt, unter Windows ziemlich rudimentär und ist selbsterklärend. Die nachfolgenden Screenshots zeigen dies anschaulich:

1. Schritt: Sprache wählen

2. Schritt: Willkommen-Dialog

3. Schritt: Lizenzvereinbarungen

4. Schritt: UserGuide zum Server

5. Schritt: Installationspfad wählen

6. Schritt: Programmgruppe wählen

7. Schritt: Java und 7-PDF Server Startoptionen wählen

8. Schritt: Einstellungen prüfen

9. Schritt: Installationsvorgang

10. Schritt: Neustart nach Installation

Nach dem Neustart des Systems, startet 7-PDF Server nach Auswahl der oben gezeigten Installationsschritte als Windows-Dienst „7pSrv“ automatisch. Der nachfolgende Screenshot zeigt den Servereintrag in der „Dienste“-Verwaltung von Windows nach dem Neustart des Systems:

Auf dem Desktop werden euch zudem zwei Verknüpfungen angelegt, unter anderem auch eine Verknüpfung um 7-PDF Web Portal im Browser direkt „lokal“ zu öffnen.

Ein Doppelklick darauf beschert uns folgendes Bild:

An der URL sehen wir, dass 7-PDF Server lokal unter http://localhost:8080 läuft und damit auch der 7-PDF API Webservice, den wir direkt mit unserer 7-PDF PHP Library „ansprechen“ können.

Es bietet sich aber auch an dieser Stelle an, zuerst einmal eine Datei nach PDF über das „Webinterface“ – 7-PDF Web Portal zu konvertieren. Die „zweite“ Softwarekomponente des 7-PDF Servers bietet uns nämlich interessante Möglichkeiten der PDF-Erzeugung. Das „Webinterface“ ist dem „7-PDF Maker“, also meinem Freeware PDF-Erzeuger für Windows, nachempfunden und ideal für Endanwender.
Neben Bildkompressionsraten, der Erzeugung automatischer Hyperlinks im PDF, bietet das Webinterface auch Option der Passwort- und Rechteverschlüsselung von PDF-Dateien unter dem Reiter „Sicherheit…“.

Und das Beste für uns Entwickler: Alle Funktionen, welche im Webinterface zur Verfügung stehen, werden von der 7-PDF API, und natürlich damit auch von der 7-PDF PHP Library unterstützt. Einen vollwertigen PDF-Konverter kannst du so also direkt in deine eigenen PHP-Applikationen einbinden.

Aus der Praxis für die Praxis…oder besser – zwei konkrete Anwendungsfälle…

Eine Firma nutzt 7-PDF Server in Verbindung mit der PHP-Library dafür, erzeugte Officedokumente erst einmal nach PDF umzuwandeln, um danach diese PDF-Dateien mit FPDI (Erweiterte PHP FPDF Library) an Firmen-CI’s anzugleichen und mit einer Versionierung zu versehen. Diese „Technik“ wird in einem Qualitätsmanagement-System (QM-System) des Kunden, welches auf Typo3 basiert, eingesetzt.

Ein weiterer Anwender nutzt 7-PDF Server in seinem Dokumenten-Management-System (DMS). Alle Officedokumente werden hier vor der Abspeicherung im DMS von 7-PDF Server nach PDF umgewandelt. Und warum nutzt man nicht die interne PDF-Funktion des DMS-Systems?
Da das DMS mehrere hundert Dateien pro Stunde bewältigen musste, konnte man aus Performancegründen nicht mehr auf die „interne“ druckstreambasierte PDF-Erzeugung des DMS-Systems zurückgreifen. Man bediente sich der Technologie von 7-PDF Server, welches diese Last der PDF-Erzeugung locker bewältigen konnte. Welcher Anwender „verarbeitet“ so viele Dokumente in einem DMS könnte man Fragen. Nun, dieser Anwender ist eine Landesregierung aus Österreich, die ihr komplettes eGovernment auf Basis von workflowgestützten DMS-Systemen abwickelt und verwaltet.

So – jetzt widmen wir uns aber wieder der eigentlichen Installation zu. Sonst schweife ich gleich bei meinem ersten Blogartikel zu weit vom Thema ab, das wäre euch sicherlich nicht recht 😉

Die 7-PDF PHP Library für eine Lokalinstallation anpassen…

Wollen wir eine lokale PDF-Konvertierung über den nun installierten 7-PDF Server mit Hilfe der 7-PDF PHP Library durchführen, so liegt es nahe das in der PHP-Library enthaltene Beispielscript von Michael „convert2.php“ für die erste lokale Konvertierung anzupassen:

<?php
// make sure that the classes folder is in include path
$path = realpath(dirname(__FILE__) . '/../classes');
set_include_path($path . PATH_SEPARATOR . get_include_path());

// create a new object
require_once 'SevenPdf/Client.php';
$sevenPdfClient = new SevenPdf_Client();
$sevenPdfClient->setUsername('sevenpdf')
 ->setPassword('sevenpdf')
 ->useSsl(false)
 ->setServicePort(8080)
 ->setServiceHost('localhost');

//Set some additional PDF Settings
$sevenPdfClient->setEncryptFile(true); //set PDF Encryption
$sevenPdfClient->setDocumentOpenPassword('test'); //set Open Password

$sevenPdfClient->convertToPdf('invoice.html', 'invoice.pdf');

Unsere Anpassungen beschränken sich dabei lediglich auf die Zugangsdaten, Host und Port anzupassen, sowie SSL zu deaktivieren.

Wichtig an dieser Stelle ist auch zu erwähnen, dass mit der Installation des 7-PDF Servers bereits ein „vorkonfigurierter“ WebDAV – Zugang für die Eingangsdokumente installiert wird. Der Benutzername ist: sevenpdf, das Passwort ebenfalls (siehe Sourcebeispiel!)

Neben den bereits weiter oben angesprochenen recht „komplexen“ Realm-Rechteverwaltungskonzept des Tomcat-Applikationsservers, gibt es auch eine einfache Rechtesteuerung die direkt im Applikationsserver selbst über „eine“ XML-Datei zentral „gesteuert“ werden kann. Dieser habe ich mich, für den bereits oben erwähnten „vorkonfigurierten“ WebDAV-Zugang, bedient. Will man seinen eigenen „WebDAV“-User anlegen, oder auch das Passwort ändern (aus Sicherheitsgründen immer sinnvoll), so ist hierzu im Installationspfad des 7-PDF Servers die „tomcat-users.xml“ Datei die richtige Anlaufstelle. Zu finden unter:

[InstallPfad]\tomcat\conf\tomcat_users.xml

In dieser Datei verwaltet der Applikationsserver “zentral” Benutzer- und Gruppenrechte.
Der XML-Aufbau der “Rechte”-Datei des Tomcats ist nicht wirklich komplex. Und man kann sie recht leicht mit einem Editor anpassen und erweitern:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
 <role rolename="manager"/>
 <role rolename="tomcat"/>
 <role rolename="sevenpdf"/>
 <role rolename="role1"/>
 <user username="both" password="tomcat" roles="tomcat,role1"/>
 <user username="tomcat" password="tomcat" roles="tomcat"/>
 <user username="sevenpdf" password="sevenpdf" roles="sevenpdf"/>
 <user username="thorsten" password="hodes" roles="sevenpdf"/>
 <user username="admin" password="admin" roles="manager"/>
 <user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>

Als Beispiel habe ich den username=“thorsten“ mit dem Passwort password=“hodes“ angelegt bzw. diese Zeile in der tomcat_users.xml dafür hinzugefügt. Fehlt nur noch der eigene WebDAV-Konvertierungsordner und eine kleine Erweiterung der WebDAV-Rechte darauf. Das machen wir als nächstes.

Zuerst legen wir den benötigten WebDAV Ordern für den User „thorsten“ an:

Als nächstes setzen wir die WebDAV-Rechte. Das geht wieder über eine XML-Datei „web.xml“ im Verzeichnis: [InstallPfad]\tomcat\webapps\webdav\WEB-INF

Die XML-Datei bindet das WebDAV-Servlet des Tomcat Applikationsservers an entsprechend definierte Benutzer- und Gruppenrechte des Servers – hier speziell aus der „tomcat-users.xml“ – Datei. Man kann die Datei mit einem normalen Editor bearbeiten:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Copyright 2004 The Apache Software Foundation

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
 version="2.4">

 <display-name>Webdav Content Management</display-name>
 <description>
 Webdav Content Management
 </description>

 <servlet>
 <servlet-name>webdav</servlet-name>
 <servlet-class>org.apache.catalina.servlets.WebdavServlet</servlet-class>
 <init-param>
 <param-name>debug</param-name>
 <param-value>0</param-value>
 </init-param>
 <init-param>
 <param-name>listings</param-name>
 <param-value>false</param-value>
 </init-param>
 <!-- Uncomment this to enable read and write access -->

 <init-param>
 <param-name>readonly</param-name>
 <param-value>false</param-value>
 </init-param>

 <!--load-on-startup>1</load-on-startup-->
 </servlet>

 <!-- The mapping for the webdav servlet -->
 <!-- Using /* as the mapping ensures that jasper, welcome files etc are
 over-ridden and all requests are processed by the webdav servlet.
 This also overcomes a number of issues with some webdav clients
 (including MS Webfolders) that do not respond correctly
 to the
 redirects (302) that result from using a mapping of / -->
 <servlet-mapping>
 <servlet-name>webdav</servlet-name>
 <url-pattern>/*</url-pattern>
 </servlet-mapping>

 <!-- ================ Security Constraints for 7-PDF Server (Windows Setup Version) =============== -->

 <!-- Secure WebDAV - ROOT with these Authentification Role -->
 <security-constraint>
 <web-resource-collection>
 <web-resource-name>WebDAV-Root Authentification</web-resource-name>
 <url-pattern>/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
 <role-name>admin</role-name>
 </auth-constraint>
 </security-constraint>

 <!-- Secure CONVERTS - DIRECTORY with these Authentification Role -->
 <security-constraint>
 <web-resource-collection>
 <web-resource-name>WebDAV-CONVERTS Authentification</web-resource-name>
 <url-pattern>/sevenpdf/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
 <role-name>sevenpdf</role-name>
 </auth-constraint>
 </security-constraint>

 <!-- Secure CONVERTS - DIRECTORY with these Authentification Role -->
 <!-- ADDED FOR FOLDER "thorsten" -->
 <security-constraint>
 <web-resource-collection>
 <web-resource-name>WebDAV-CONVERTS Authentification</web-resource-name>
 <url-pattern>/thorsten/*</url-pattern>
 </web-resource-collection>
 <auth-constraint>
 <role-name>sevenpdf</role-name>
 </auth-constraint>
 </security-constraint>

 <!-- Security Role Settings -->
 <security-role>
 <description>
 An webdav role defined in "conf/tomcat-users.xml"
 </description>
 <role-name>sevenpdf</role-name>
 </security-role>

 <security-role>
 <description>
 An webdav role defined in "conf/tomcat-users.xml"
 </description>
 <role-name>admin</role-name>
 </security-role>

 <login-config>
 <auth-method>BASIC</auth-method>
 <realm-name>7-PDF Server - Security Login</realm-name>
 </login-config>

</web-app>

Ich habe hier einfach eine sogenannte „Security-Constraint“ für den User „thorsten“ angelegt und diese an die Rolle (role) „sevenpdf“ angebunden. Das war es auch schon. Damit der neue Benutzer in 7-PDF Server „bekannt“ wird, startet man den „7pSrv“-Dienst neu durch.

Kommen wir nun wieder zu unserem PHP-Konvertierungsscript „convert2.php“. Wir passen es natürlich schnell auf unseren neuen 7-PDF Server – „Benutzer“ an:

<?php
// make sure that the classes folder is in include path
$path = realpath(dirname(__FILE__) . '/../classes');
set_include_path($path . PATH_SEPARATOR . get_include_path());

// create a new object
require_once 'SevenPdf/Client.php';
$sevenPdfClient = new SevenPdf_Client();
$sevenPdfClient->setUsername('thorsten')
 ->setPassword('hodes')
 ->useSsl(false)
 ->setServicePort(8080)
 ->setServiceHost('localhost');

//Set some additional PDF Settings
$sevenPdfClient->setEncryptFile(true); //set PDF Encryption
$sevenPdfClient->setDocumentOpenPassword('test'); //set Open Password

$sevenPdfClient->convertToPdf('invoice.html', 'invoice.pdf');

GESCHAFFT!

Es bietet sich nun an das Beispielscript convert2.php auszuführen. Ich habe parallel auf Port 80 dafür eine aktuelle XAMPP-Installation mit Apache+PHP5 unter Windows laufen lassen.

Hinweis: Vergesst nicht die SOAP-Extension für PHP5 „aktiv“ zu haben, da wir ja mittels SOAP den 7-PDF Server bzw. die 7-PDF API zum Arbeiten bewegen wollen 😉

Damit ist im Grunde neben den Hintergrundinformationen zum 7-PDF Server, nun auch die lokale Installation des Servers erklärt. Ich hoffe, euch hat mein allererster Blogartikel gefallen? In einem der folgenden Blog-Artikel werde ich die Installation des 7-PDF Servers unter Linux beschreiben. Diese ist im Gegensatz zur Windows-Installation um einiges komplexer, generell machbar, und sehr interessant 🙂

Bis dahin wünsche ich euch alles Gute.

Euer Thorsten Hodes

Written by Thorsten Hodes

März 17th, 2010 at 8:58 am