Über Martin Ruprecht

Martin Ruprecht arbeitet bei Mayflower in München als Agile Coach. Martin organisiert Coding Dojos, tritt regelmäßig auf Konferenzen als Speaker auf und hält Vorträge und Workshops zum Thema Agile Development, Testing und Qualitätssicherung in Webprojekten. Seine Leidenschaft gilt der Frage, welche Methoden die Zusammenarbeit in agilen Teams zu Begeisterung und Höchstleistung führt. Folge Martin auf Twitter

04.12. PDF nicht nur mit PHP

Eine Suche nach „php pdf“ bei der Suchmaschine meiner Wahl ergibt eine Vielzahl an Tutorials, Blog-Einträgen und natürlich auch Klassen und Bibliotheken. In diesem Blog-Artikel möchte ich einen knappen Überblick über einige der gebräuchlichsten PHP-Tools zur PDF-Generierung geben und Alternativen zeigen die keine Programmierung erfordern.

PHP: PDF – Manual

Das erste Suchergebnis führt uns auf die PHP Manual Seite. Das braucht Ihr Euch nicht anzuschauen weil es einfach nur verwirrend und unvollständig ist. Dahinter steht eine PECL Erweiterung, welche PHP einen Wrapper zur kommerziellen PDFlib bietet.

PDFlib

Ist in Version 8 verfügbar und unterstützt laut Hersteller verschiedene Features aus Acrobat 9, der PDF-Spezifikation 1.7 extension level 3. Etwas ausführlicher betrachtet bedeutet das:

  • Es kann über Verweise auf Ressourcen in externen PDF-Dokumenten zugegriffen werden.
  • Der Inhalt kann in durch den Benutzer auswählbare Ebenen aufgeteilt sein welche sich gruppieren
    lassen um zum Beispiel in Sprachspezifischen Ebenen ein und dieselbe Bildebene zu zeigen.
  • Bilder, Seiten und Teile von Seiten können mit Georeferenzen ausgestattet werden.
  • AES-256 Verschlüsselung und Unicode Passwörter werden unterstützt.

Im Gegensatz zum PHP:PDF – Manual bietet sich auf der Herstellerseite ein Haufen an Dokumentation. Dort findet Ihr neben einem Installations- und Konfigurations-Howto für PHP, eine 256-seitige PDFlib API Dokumentation und ein 312-seitiges PDFlib Tutorial.

Schon alleine die Länge der API Dokumentation lässt darauf schließen das die PDFlib umfangreiche Funktionen zum gestalten von PDF Dokumenten mit sich bringt. Auszugsweise, wie auch unter „What’s new in PDFlib 8?“ nachzulesen:

  • Bidirektionale Schriftformatierung für internationale Sprachen und Fallback Fonts.
  • Unterstützung OpenType spezifischer Font-Features
  • Textumbruch um Bilder, in Pfaden sowie Text an Pfaden entlang
  • Transparenz in TIFF und PNG Bildern
  • Interaktive Formulare
  • Druckvorlagen Farbmanagement PDF/X-4 und PDF/X-5

PDFlib ist ein renommiertes Produkt und auch in PHP können damit professionelle PDF Dokumente erstellt werden.

Zend Framework PDF

Wer etwas weniger komplexe Ansprüche an die PDF-Generierung stellt ist auch mit dem Zend_PDF Modul des unter OpenSource Lizenz veröffentlichten Zend Frameworks gut beraten.

  • Laden von PDF Dokumenten (Acrobat 5, Spezifikation 1.4)
  • Versionsverwaltung: Laden von Versionen, Rollback nach Änderung
  • Schreiben oder Ausgeben und diese Vorgänge auf die geänderten Stellen beschränken
  • Seiten als Vorlagen verwenden, Seiten zu einem Dokument hinzufügen oder entfernen
  • Einfache Vektorgrafikelemente
  • Seitentransformationen (Drehen, Zoomen)
  • 14 gebrauchsfertige „PDF-Fonts“, Unterstützung von TrueType Fonts
  • Unterstützung von Sprungzielen, Lesezeichen-Menüs, Anhängen und Aktionen
  • Unterstützung von Dokument Information und Metadaten


Das erstellen und Laden von PDF Dokumenten geht dank der durchdachten API sehr einfach von statten. Einzig den automatisierten Textumbruch mag man vermissen. Zwar kann man sich anhand der API die Weiten der einzelnen Zeichen berechnen lassen, das erscheint dann aber doch etwas aufwendig zu sein für jedes Zeichen eines Textes.

Verschiedene Typen von Anhängen und Aktionen, sofern noch nicht in Zend_PDF enthalten, lassen sich nach Lektüre der gesuchten Funktionalität in der 980-seitigen Adobe PDF Reference relativ einfach und schnell integrieren.

FPDF

Verspricht High-Level Funktionen und steht auch unter OpenSource Lizenz zum Download bereit. Ebenso wie bei Zend_PDF werden PDF-Dokumente mit FPDF nur durch Einsatz von PHP generiert und es ist keine weitere Bibliothek notwendig.

  • Auswahl der Maßeinheit, Seitenformat und -ränder
  • Seitenkopf- und Fußzeilen Verwaltung
  • Automatisierter Seitenumbruch, Zeilenumbruch und Textausrichtung

bietet FPDF unter anderem und füllt damit die Lücke in Bezug auf Automation der Textgestaltung. Es gibt FPDF Tutorials für verschiedene Anwendungsfälle und eine überschaubare FPDF API Dokumentation.
Anhand einer Extension FPDI ist es möglich Seiten aus anderen PDF-Dokumenten auszulesen und in das zu erstellende Dokument zu importieren.

Dazu gibt es auch noch eine Menge an FPDF Scripts die die Funktionalität um viele interessante Features wie Barcodes, SVG Templates bis hin zu Formularausfüllung erweitern.

Prince XML

ist eine kommerzielle aber im Privatgebrauch kostenfreie Lösung zum erstellen von PDF-Dokumenten aus XML oder HTML Quellen mithilfe gängiger CSS 2, 2.1 und 3 Eigenschaften und Selektoren sowie eigenen CSS Erweiterungen. Prince misst sich mit den gängigen Browsern im bewältigen des Acid2 Tests und bewirbt:

  • (X)(HT)ML, SVG, CSS, JPEG, PNG, TIFF, JavaScript / ECMAScript
  • Seitenkopf- und Fußzeilen, Seitennummerierung sowie Duplex drucken.
  • Mehrspalten Layouts, fließende und positionierte Blöcke
  • Verweise, Sprungziele, PDF-Metadaten und Anhänge
  • Verschlüsselung und Dokumenten Zugriffschutz

Neben dem Kommandozeilenprogramm gibt es auch für PHP eine Wrapperklasse und unter Windows gibt es sogar eine GUI zum bedienen des Programms. Die Dokumentation ist ausführlich und übersichtlich aufgebaut.

Eine schöne Lösung zum erstellen von PDF-Dokumenten wenn man sich nicht direkt mit der programmatischen Erstellung von PDF-Dokumenten beschäftigen möchte.

Online Service

Des weiteren gibt es unzählige von kostenpflichtigen und kostenfreien Online-Services wie zum Beispiel pdfcrowd das in der Lage ist HTML-Seiten von einer angegebenen Url oder auch mit einem WYSIWYG Editor erstelltes HTML-Dokument als PDF auszugeben. In einer kostenpflichtigen Version lassen sich dann auch noch verschiedene Optionen zur Konvertierung angeben.

Mit cometdocs lassen sich über 50 Dateiformate in andere Formate konvertieren. Unter anderen mit dabei Word nach PDF, HTML nach PDF und sogar Excel nach PDF.

03.12. Setting up an own QA Environment for Javascript

Nearly every PHP project comes up with a great set of tools to assure the quality of source code; unit tests are a no longer a „nice to have“ feature, they are common components in new projects. While unit tests help you to provide solid interfaces and proof the functionality of a certain method, there is a long list of tools that check the quality of the source code itself with many different metrics. Each of these mentioned tools reports its results into a XML file, which can easily be interpreted by a continuous integration server like Jenkins. The benefit is enormous: After every commit to your version control system your continuous integration server triggers the execution of the tests and the source code quality analysis and shows the result in meaningful diagrams. As a developer you get a direct feedback and you can make a prediction on the status of the entire project, because if even the smallest units work fine, there is a good chance that the whole system runs stable.
Weiterlesen

A comet over PHProjekt 6

So far PHProjekt 6 (P6, see http://phprojekt.com) is already enhanced with nice AJAX workflows and snappy user-experience. Nevertheless, we discussed a way to provide synchronous communication and direct information within the application.

Everybody knows GoogleMail with its easy to use frontend. Maybe you use it for your daily work. In GoogleMail, there is no need to refresh the page to receive a new mail, Google informs you automatically whenever a new mail is available. But how is this possible? The answer to this question is really simple: The server triggers a signal informing that a new mail is available. This technology is called Comet and describes a way how the server communicates with the client [see http://en.wikipedia.org/wiki/Comet_(programming) ].

Is there a way to use Comet for P6? As P6 works with a lot of users, it is important for me as a user to be informed when somebody has changed something in my projects or has added an urgent todo. The list where a notification could be triggered is long, but at the moment, only email notifications are sent immediately. So, what we need in P6 are real-time notifications. With real-time notifications, for example, every time somebody changes something in my project, I receive a message in form of a highlighted info box. This looks like a typical use case for using Comet. And yes, Comet would be great for realizing this kind of real-time notification! But since the users love the handy system requirements (Apache Server and MySQL) and the ease of installation, something different is needed than a real Comet architecture, because all the Comet magic is based on a so called application server, e.g. Jetty, Persevere. Therefore, I decide to implement another (Comet-) technology, called Long Polling. You can find the name AJAX Polling for this technology, too.

The technology behind Long Polling is to open a connection from the client to the server and not to close this connection immediately. Ok, that´s fine, but how to open a connection and „hold“ it? Opening a connection to the server is easy, a simple AJAX will do the trick. P6 uses the Dojo Toolkit for all its AJAX, so in this case I used the Dojo.xhrPost.

 

Since the HTTP protocoll is connection-based, at the server-side, a process is also needed that holds the connection and does not return . So, what I do to hold this connection open is to set a simple timeout during the execution of the server-side script, in my case I use sleep(). This is the basic idea of long polling, but the gimmick of this approach is to return earlier if something happens on the server-side. In other words, I open a connection to the server and check whether there are any changes, if not, the connection stays open for the maximum polling time. If yes, the response will be returned to the client immediately.

This diagram shows the basic workflow, and the lines below show the possible solution in PHP:

 

For P6 this means that I always save the following: the person who triggers an event, the event itself (e.g. somebody adds a new note), the item, the project, the creation time, the time until this message is valid, and the persons who should receive a frontend message from the database. The long polling loop checks whether there is anything new. If yes, it returns the data. If not, the polling loop starts again. Every event is saved in the database for a maximum of two minutes, except events in the future. Itis real-time – so itis possible to miss a message ;-)

One word about the Dojo Toolkit. The AJAX API of Dojo provides several functions to communicate with the server. The easiest way is to use dojo.xhrGet or dojo.xhrPost. I decided to use the Post version. Although the function has a property setTimeout, which allows you to set the time to wait for a response from the server, this is not needed, because of the sleep loops at the server side.

Now, let’s look at the downsides of the long polling approach. Yes, I partly agree with everybody who says that the permanent polling to the server causes massive traffic and server load, especially with an increasing number of users. But in the special case of P6 this is OK, because the number of users is manageable and in most cases, P6 runs in a local network. In addition, the frontend messages are configurable, You can set the polling loop and the number of requests to the database.

Considering all the facts and keeping in mind that P6 is designed to be a lightweight open source groupware, I am positive to say that the Long Polling technology is the right choice for P6.