# XFDF/PDF: Erstellen und abspeichern mittles PHP?



## Chino (4. Januar 2005)

Guten Tag Forum!

Kleine Anmerkung vorweg: Es folgt ein etwas längerer Beitrag  Wer noch nie mit PHP PDF Dateien erstellt hat, der kann sich das weiterlesen ersparen.

Ich sitz gerad vor einer etwas kniffligen Aufgabe: Und zwar sollen aus einer Applikation Einträge aus einer Datenbank in ein PDF exportiert werden. Ein Eintrag ist einem bestimmten Datum zugeordnet, wobei es durchaus vorkommen kann, dass es zu einem Datum mehrere Einträge gibt (als Beispiel gibt es 3 Einträge für das Datum 04.01.2005). Am Ende des Prozesses sollte nach Möglichkeit eine PDF-Datei erstellt worden sein, die alle Einträge für ein bestimmtes Datum beinhaltet. Also analog zu den Einträgen in der Datenbank sollte die PDF-Datei 3 Seiten haben.

So, bis jetzt nix kompliziertes, aber: Die Daten sollen dabei in ein nicht leeres PDF geschrieben werden. Sprich: Ich habe sozusagen ein "PDF-Template" wo bereits "Platzhalter" für die Werte aus der Datenbank vorgesehen sind. So, bis hier könnte ich das auch mit den PDF-Funktionen machen, die mir PHP bereit stellt. Doch jetzt kommt das große Aber: Da die Templates in der Applikation dynamisch pflegbar sind - der User hat also die Möglichkeit andere Templates auf den Server zu laden, die dann verwendet werden - weiß ich ja nicht, wo sich welcher Platzhalter im PDF befindet. Somit muss ich auf ein Acrobat-Formular zurückgreifen, das mit den jeweiligen Datenbank-Werten befüllt werden will. Im Gegensatz zu ASP bietet PHP es leider nicht an, direkt aus einem Script die Formularfelder einnerhalb eines PDF-Dokumentes mit Werten zu füllen.

Das ist an sich auch kein größeres Problem, denn es gibt ja eine tolle Erfindung: FDF bzw XFDF. In diesen Dateien (letztere ist XML) befinden sich nur die jeweiligen Inhalte für die jeweiligen Formularfelder, die sich in einem PDF-Dokument befinden. Verbindet man jetzt nun das PDF (Template) und das XFDF-Dokument, bekommt man ein PDF angezeigt, in welchem das Formular bereites mit den jeweiligen Werten aus dem XFDF-Dokument ausgefüllt ist.

Beispiel XFDF-Layout:


```
<?xml version="1.0" encoding="UTF-8" ?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields>
        <field name="user_name">
            <value>foo bar</value> 
        </field>
        <field name="report_nr">
            <value>115</value> 
        </field>
        <field name="report_date">
            <value>04.01.2005</value> 
        </field>
        <field name="report_id">
            <value>21</value> 
        </field>
    </fields>
<f href="" /> 
</xfdf>
```
 Sollte soweit eigentlich verständlich sein 
Das XML wird über ein PHP-Script erstellt und dann an den Browser ausgegeben.
Im Script wird der Header noch angepasst:


```
header("Content-type: application/vnd.adobe.xfdf");
```
Wenn ich jetzt das PDF zusammen mit dem XFDF folgendermaßen Aufrufe *http://www.server.de/template.pdf#FDF=http://www.server.de/buildXML.php* dann wird der Acrobat Reader gestartet, darin wird dann das PDF-Template geöffnet und als letztes wird das Formular mit den Werten aus dem XML gefüllt.

So, das klappt soweit auch einwandfrei (zu Testzwecken allerdings mit statischen Inhalten, die Anbindung an die Datenbank und spätere Selektion der Daten ist das kleinste Problem). Das Problem was ich jetzt habe ist die Aufteilung der verschiedenen Datensätze auf mehrere Seiten. 

Wenn es möglich ist, das XFDF-Dokument und das PDF-Template zu einem neuen (statischen) PDF zu speichern, könnte dieser Prozess für jeden Datensatz durchgeführt werden. Die 3 einzelnen PDF-Dateien könnten dann am Ende problemlos zu einem einzelnen Dokument zusammengefasst werden. Das ist zwar nicht die schönste Lösung, aber das ist jetzt mal egal 

Ich hoffe das war soweit verständlich.  Falls dem nicht so ist, kann ich gerne nochmal was genauer Erläutern.

Leider gibt es von Seiten Adobe diesbezüglich wenig Dokumentation bzw. die Dokumentation die vorhanden ist, muss bestellt werden. Andere Suche im Netz brachte nur Treffer auf kostenpflichtige Software zu Tage, und das kann ich leider nicht gebrauchen 

Wäre also gut, wenn jemand hier einen Lösungsansatz für das geschilderte Problem hat ;-)


----------



## Chino (5. Januar 2005)

Das ich jetzt auf diesen Beitrag keine Masse an Antworten erwartet hab, ist klar aber hat denn niemand ne Idee? 

Was vielleicht auch eine Idee wäre (wenns denn überhaupt technisch möglich ist), dass ich im XML einfach den ganzen fields-Knoten für jeden Eintrag wiederhole, d.h. ich hätte im oben genannten Beispiel dann 3 fields-Knoten, beispielsweise so:


```
<?xml version="1.0" encoding="UTF-8" ?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
    <fields id="1">
        <field name="user_name">
            <value>foo bar</value> 
        </field>
        ...
    </fields>
    <fields id="2">
        <field name="user_name">
            <value>foo bar</value> 
        </field>...
    </fields>
    <fields id="3">
        <field name="user_name">
            <value>foo bar</value> 
        </field>
        ...
    </fields>
<f href="" /> 
</xfdf>
```
Analog zu den fields-Knoten sollten dann jetzt die jeweiligen Seiten im PDF angelegt werden. Das ist allerdings jetzt nur mal so eine spontane Idee, die mir gerade eingefallen ist. Wie gesagt, obs technisch möglich ist, weiß ich nicht.

Hab gestern auch nochmals die Seiten von Adobe durchstöbert. Da sind zwar Dokumentationen und Spezifikationen zu PDF, FDF und XFDF zu finden, diese sind allerdings kostenpflichtig bzw. der Zugang zum Entwickler-Bereich ist kostenpflichtig. :-(

Ansonsten bleibt mir als alternativ Lösung nur der Weg über HTML-Templates zu gehen. Das wollte ich zwar vermeiden, aber wenn sich die PDF-Lösung nicht umsetzen lässt, bleibt mir nichts anderes übrig.


----------



## Ben Ben (5. Januar 2005)

Hmm also so komplex sag ich mal hab ich generische PDFs nicht benutzt.
Einfaches generieren von PDFs mit DB-Daten habe ich via FPDF gelöst...

Was mir daher noch einfallen würde wäre ein Linuxtool (gehe halt mal von nem Linuxwebserver aus), welches das gleiche macht wieder Client, eben den Reader öffnen, nur das du das xfdf-File eben lokal an die Applikation gibst und diese dir dann das File speichert.
Ob so ein prob existiert weiss ich allerdings nicht.


----------



## Chino (5. Januar 2005)

Ben Ben hat gesagt.:
			
		

> Hmm also so komplex sag ich mal hab ich generische PDFs nicht benutzt.
> Einfaches generieren von PDFs mit DB-Daten habe ich via FPDF gelöst...


Naja, ich mach ja im Grunde genommen nichts anderes  Ich will halt nur mehrere Seiten haben.



			
				Ben Ben hat gesagt.:
			
		

> Was mir daher noch einfallen würde wäre ein Linuxtool (gehe halt mal von nem Linuxwebserver aus), welches das gleiche macht wieder Client, eben den Reader öffnen, nur das du das xfdf-File eben lokal an die Applikation gibst und diese dir dann das File speichert.


Also erstens: Der Live-Server ist zwar ein Linuxserver, aber ob da eine solche Komponente laufen wird (darf?) bezweifel ich jetzt mal 



			
				Ben Ben hat gesagt.:
			
		

> Ob so ein prob existiert weiss ich allerdings nicht.


Das wäre dann die nächste Frage 

Hab mich jetzt ma weiter durchs Netz gewühlt und hab in Erfahrung gebracht, dass ich wohl ohne die Acrobat SDK bzw. das FDF Toolkit aufgeschmissen bin.

Ich werde wohl oder übel HTML-Templates exportieren müssen.


----------



## Ben Ben (5. Januar 2005)

```
Naja, ich mach ja im Grunde genommen nichts anderes  Ich will halt nur mehrere Seiten haben.
```

Ist doch was anderes, da ich im FPDF (http://www.fpdf.org/) eben fest die Positionierungen eingebaut habe.
Du könntest natürlich dein Template so zu parsen, dass dem FPDF-Objekt einfach die entsprechenden Aufrufe folgen (wie schwer sich das in deinem fall gestalten wird weiss ich aber nicht, von der Theorie her nicht so schwer).
Wenn das klappt ist der Rest einfach, da du fpdf bei der Ausgabe auch anweisen kannst das PDF direkt zu schrieben statt zum Client zu senden.


----------



## Chino (5. Januar 2005)

Ben Ben hat gesagt.:
			
		

> Du könntest natürlich dein Template so zu parsen, dass dem FPDF-Objekt einfach die entsprechenden Aufrufe folgen (wie schwer sich das in deinem fall gestalten wird weiss ich aber nicht, von der Theorie her nicht so schwer).


Das müsstest Du mir bitte etwas genauer erklären, wie Du das meinst.


----------

