# Text aus Formular in PDF einfügen



## nchristoph (24. Oktober 2011)

Hallo zusammen,

ich möchte einen Text in eine bestehende PDF Datei einfügen. 

Bei Google bin ich einerseits auf fpdf gestossen auf der anderen Seite allerdings auf Foren, wo steht, das man mit fpdf keine PDF Datei bearbeiten kann.

Ich will immer an derselben Stelle im PDF also z.b. rechts unten einen Text einfügen z.b.

- Abmaß  1,234 m³
               0,245 m³


Das ganze ist für die Mengenkorrektur einer Massliste.

Im Formular gebe ich die Kubik ein, die abgezogen werden müssen und die neuen Kubik.

Gibt es da eine einfache Möglichkeit?


----------



## Maniac (24. Oktober 2011)

Ich wüsste jetzt auch nicht das es mit PHP allein möglich ist PDF's zu bearbeiten. FPDF verwende ich selber und mit diesem kann man nur PDF's erstellen.

Warum erstellst du das PDF mit PHP nicht neu?


----------



## nchristoph (24. Oktober 2011)

Die PDF ist eine eingescannte Massliste, also eine DIN A4 Seite.

Dadurch kann ich die PDF nicht neu erstellen. Zumindest wüsste ich nicht wie.


----------



## Maniac (24. Oktober 2011)

Hier mal das erste Suchergebnis von Google:

http://www.tutorials.de/php/303767-pdf-datei-mittels-php-oeffnen-bearbeiten-und-speichern.html

Oder eine Erweiterung für FPDF oder TCPDF wäre FPDI

http://www.setasign.de/products/pdf-php-solutions/fpdi/


----------



## nchristoph (24. Oktober 2011)

Das erste habe ich auch gefunden, habe es allerdings nicht zum Laufen gebracht. Der Stamper, der im ersten Post gepostet wurde schaut wie eine vernünftige Lösung aus, Kostet aber.

Wie hast du bei Google gesucht?


----------



## Maniac (24. Oktober 2011)

"php pdf bearbeiten"


----------



## nchristoph (24. Oktober 2011)

Also alles, was ich da finde übersteigt meinen Horizont bei weitem.

Danke für die Hilfe.


----------



## nchristoph (3. November 2011)

So ich habe jetzt mit FPDI was brauchbares zusammengezimmert, stehe allerdings jetzt vor einem kleinen Problem, wo ich in den Manuals bzw. bei Google keinen brauchbaren hinweis finde, um das zu lösen:

Angenommen, meine PDF hat mehrere Seite und ich will den Text nur auf der letzten Seite eintragen, das kriege ich nicht hin.

Im moment wird bei mir nur die 1te Seite importiert und der Text rechts unten platziert.

Wenn die Datei jetzt allerdings mehrere Seite hat, werden die Seiten ab 2 gelöscht.

Hier mal mein Code:


```
if(isset($_POST['senden'])){
	ob_start();
$holzart = $_GET['holzart'];
$starke = $_GET['starke'];
$klasse = $_GET['klasse'];
$trocken = $_GET['trocken'];
$partie = $_GET['partie'];

$holzart2 = utf8_decode($holzart);
$holzart1 = htmlentities($holzart,ENT_QUOTES,'UTF-8');
$starke1 = htmlentities($starke,ENT_QUOTES,'UTF-8');
$klasse1 = htmlentities($klasse,ENT_QUOTES,'UTF-8');
$trocken1 = htmlentities($trocken,ENT_QUOTES,'UTF-8');
$partie1 = htmlentities($partie,ENT_QUOTES,'UTF-8');

$pfad2 = ("Masslisten/".$holzart1."/".$klasse."/".$trocken."/".$starke."/");
$pfad3 = ($pfad2.$partie.".pdf");
// initiate FPDI
$pdf = new FPDI();
// add a page
$pdf->AddPage();
// set the sourcefile
$pdf->setSourceFile($pfad3);
// import page 1
$tplIdx = $pdf->importPage(1);
// use the imported page and place it at point 10,10 with a width of 100 mm
$pdf->useTemplate($tplIdx, 0, 0, 210, 297);

// now write some text above the imported page
$pdf->SetFont('Arial','B');
$pdf->SetTextColor(255,0,0);
$pdf->SetXY(150, 260);
$pdf->Write(0, "- Abmass ".$_POST['abmass']."m3");
$pdf->SetXY(150, 260);
$pdf->Write(0, "________________");
$pdf->SetXY(150, 265);
$pdf->Write(0, "                 ".$_POST['menge']."m3");
$pdf->SetXY(150, 265);
$pdf->Write(0, "________________");
$pdf->SetXY(150, 266);
$pdf->Write(0, "________________");
$pdf->Output($pfad3, 'F');
ob_end_flush();
}
```

Soweit funktioniert alles, nur eben nicht das mit den mehreren Seiten.

Hat wer eine Idee?


----------



## Maniac (3. November 2011)

Ohne das jetzt genauer anzusehen:

```
// import page 1
$tplIdx = $pdf->importPage(1);
```
setzt vermutlich die aktuelle Seite.


----------



## nchristoph (3. November 2011)

Maniac hat gesagt.:


> Ohne das jetzt genauer anzusehen:
> 
> ```
> // import page 1
> ...


 
Es setzt die erste Seite.
Das funktioniert ja perfekt, aber bei mehreren Seiten finde ich keine Lösung.

Ich habe bis jetzt folgendes versucht:

for schleife und die Seitenanzahl raufzuzählen: Ergebnis: Negativ


----------



## Maniac (3. November 2011)

google lieferte mir folgendes ergebnis:
http://www.fpdf.de/forum/showthread.php?t=1762


----------



## nchristoph (3. November 2011)

Also irgendwie Suche ich immer nach den falschen Begriffen,

Jetzt funktionierts, Danke.


----------



## nchristoph (8. November 2011)

So und jetzt noch was:

Damit man nur einmal ein Abmass machen kann, möchte ich jetzt die PDF durchsuchen, ob der Text - Abmass schon vorkommt.

Ich habe mir XPDF installiert und verwende es so:


```
$filepath = substr($_GET['pfad'],1);
$filename = $_SERVER['DOCUMENT_ROOT'].$filepath;
$textfile = substr($filename,0,-4);
$content = shell_exec('C:\\xpdf\\bin64\\pdftotext '.$filename.' -');
```

Die Pfade stimmen aber ich kriege die Datei nicht konvertiert. Im Errorlog steht nur die cmd Ausgabe von pdf2text.

Kann mir wer nen Tip geben?


----------



## Maniac (8. November 2011)

Und was steht in der Ausgabe?

Versuch mal nur "exec" und die Paramter welche du aus der URL bekommst, vorher mit "escapeshellcmd()" maskieren.

Wenn das noch nicht geht, die Pfde mal ausgeben lassen und hier Posten.


----------



## nchristoph (8. November 2011)

Die Ausgabe ist die hier:

```
pdftotext version 3.03
Copyright 1996-2011 Glyph & Cog, LLC
Usage: pdftotext [options] <PDF-file> [<text-file>]
  -f <int>          : first page to convert
  -l <int>          : last page to convert
  -layout           : maintain original physical layout
  -fixed <fp>       : assume fixed-pitch (or tabular) text
  -raw              : keep strings in content stream order
  -htmlmeta         : generate a simple HTML file, including the meta information
  -enc <string>     : output text encoding name
  -eol <string>     : output end-of-line convention (unix, dos, or mac)
  -nopgbrk          : don't insert page breaks between pages
  -opw <string>     : owner password (for encrypted files)
  -upw <string>     : user password (for encrypted files)
  -q                : don't print any messages or errors
  -cfg <string>     : configuration file to use in place of .xpdfrc
  -v                : print copyright and version info
  -h                : print usage information
  -help             : print usage information
  --help            : print usage information
  -?                : print usage information
```

Die Pfade stimmen ja wie bereits erwähnt. Ich versuchs mal mit exec und escapeshellcmd().


So das hier sind die Pfade:


```
$filename : C:/xampp/xampp/htdocs/Masslisten/Esche Braun/1 KL/KD/40 mm/61681.pdf
$textname:  C:/xampp/xampp/htdocs/Masslisten/Esche Braun/1 KL/KD/40 mm/61681.txt
```


----------



## Maniac (8. November 2011)

Ich kenn dieses Programm zwar nicht, aber es steht doch hier in der Hilfe:

```
Usage: pdftotext [options] <PDF-file> [<text-file>]
```

Die Hilfe wird immer dann angezeigt wenn die Parameter welches dieses Programm braucht nicht richtig angegeben werden.

Ich würde mal eher tippen das du noch das Text-File angeben musst und mind. eine Option.


----------



## nchristoph (8. November 2011)

Das Textfile habe ich jetzt auch angegeben, hat aber keine Änderung bewirkt:


```
$content = exec('C:\\xpdf\\bin64\\pdftotext '.escapeshellcmd($filename).' '.escapeshellcmd($textfile.'.txt').' -');
```


----------



## Maniac (8. November 2011)

Hast dir mal die Doku von dem Programm richtig durchgelesen? Braucht es nicht noch eine "Option" damit es weiß wie und was konvertiert werden soll? Für was der Bindestrich am Ende nach ".txt"?


----------



## nchristoph (8. November 2011)

Die Optionen sind optional, der Bindestrich am Ende soll dafür sein, damit man die exec Zeile auch ausgeben kann, funktioniert bei mir aber nicht wirklich.

Das lustige daran: wenn ich pdf2text die Dateinamen manuell übergebe, funktioniert alles, mit PHP funktioniert es nicht.


----------



## Maniac (8. November 2011)

Dann versuchs doch mal ohne das maskieren. prüfe ob die Pfade genau gleich geschrieben sind als wenn es direkt eingibst.


----------



## nchristoph (9. November 2011)

Pfade sind, bis auf die Slashes die gleichen, auch ohne maskieren funktioniert es nicht.

Ich krieg Error 99: Other Error. In der "Dokumentation", wenn man die paar Codefetzen und beschreibungen so nennen kann steht allerdings auch keine Fehlerbeschreibung.

Es muss doch eine einfachere Möglichkeit geben um zu testen, ob da schon einmal ein Abmass gemacht wurde.

Vielleicht mittels eines Mysqlfeldes das einfach nur Ja oder Nein enthält und überprüft wird?


----------



## MArc (9. November 2011)

Um so etwas zu debuggen, tue ich immer folgendes:


```
$cmd = 'C:\\xpdf\\bin64\\pdftotext '.escapeshellcmd($filename).' '.escapeshellcmd($textfile.'.txt').' -';
exec('logger '.$cmd);
```
Bei meinen Unix-System ist das Binary 'logger' immer dabei. Wie das auf einem Windows aussieht, weiss ich leider nicht. Wenn der Befehl anschliessend in dem Syslog erscheint, copy&paste ich den in die Konsole und schaue, ob der so funktioniert. Dabei sind schon einige 'unsichtbare' Zeichen zum vorschein gekommen 

Btw, Du musst Pfade mit Leerzeichen mit einem " umschliessen.


----------



## nchristoph (9. November 2011)

Wie ich muss den Pfad mit Leerzeichen und mit einem " umschliessen?

Das Leerzeichen hab ich ja. Wie meinst das mit " umschliessen? Steh irgendwie auf der Leitung.


----------



## MArc (9. November 2011)

Mit umschliessen meine ich:


```
$cmd = 'C:\\xpdf\\bin64\\pdftotext "'.escapeshellcmd($filename).'" "'.escapeshellcmd($textfile.'.txt').'" ';
exec('logger '.$cmd);
```


----------



## nchristoph (10. November 2011)

Danke Marc, es funktioniert jetzt.

Allerdings hab ich jetzt ein Problem mit FPDI und FPDF: Sobald der Pfad Umlaute enthält, kann FPDF die Datei nicht öffnen:

FPDF error: Cannot open Masslisten/Lärche/1 KL/KD/105 mm/2.pdf !

Pfade ohne Umlaute funktionieren einwandfrei. Ich habe jetzt schon folgendes versucht:

Den Pfad unkodiert übergeben, den Pfad mit htmlentities übergeben, mit htmlspecialchars, mit urlendcode und urldecode, mit rawurlencode und decode.

Nichts davon hat funktioniert.


----------



## Maniac (10. November 2011)

Diese beiden auch schon versucht?

utf8_decode()

utf8_encode()


----------



## MArc (10. November 2011)

nchristoph hat gesagt.:


> FPDF error: Cannot open Masslisten/Lärche/1 KL/KD/105 mm/2.pdf !


 
Du solltest generell darauf achten, dass Du moeglichst ueberall den gleichen Zeichensatz verwendest. Das erspart dir doofes umkodieren zwischen den Zeichensaetzen. Dass heisst konkret im HTML, das PHP-File und die HTTP-Verbindung (im HTML-Header definiert) zu UTF-8 definieren.


----------



## nchristoph (10. November 2011)

Ja habe ich, das war meine erste gedachte Lösung.

ÖHM wie setzte ich die HTTP-Verbindung auf UTF-8?


----------



## MArc (10. November 2011)

Du kannst in PHP den Content-Type im HTTP-Header senden oder in der HTML-Datei im Header.

```
header("Content-Type: text/html; charset=utf-8");
```


```
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
```
Wenn du eines von Beiden definiert hast (ich bevorzuge die erstere), dann werden u.a. auch Formulare vom Browser als UTF8 versendet.


----------



## nchristoph (10. November 2011)

Hab ich gemacht, aber hat nichts geändert, er will mir den Pfad mit den Umlauten nicht annehmen.

Dabei gibt er ihn mir sogar richtig in der Fehlermeldung aus.

FPDF error: Cannot open Masslisten/*Lärche*/1 KL/KD/105 mm/2.pdf !


----------



## nchristoph (11. November 2011)

Ich hab mir jetzt die Pfade nochmals ausgeben lassen sowohl mit htmlspecialchars(), htmlentities(), utf8-de und encode, urlencode und rawurlencode und habe dann nochmal die verschiedensten Variationen versucht. 

Keines der Versuche hat eine Veränderung gebracht.

Gibts das, das dieses Problem nur bei mir Auftritt oder hat das bis jetzt noch nie jemand versucht?


----------

