Archiv für die Kategorie „mySQL“

Aus der Windows Shell heraus über PHP ein pdf an einen Drucker senden

Montag, 9. August 2010

Ich stand vor dem Problem, das eine Webanwendung ein PDF-Dokument erzeugen muss, und diese anschließend das Dokument auch noch an einen Drucker im Netzwerk senden muss.

Lange Zeit haben ich mit der .exe von Adobe Reader rumgebastelt, kam aber nie zu einer sauberen Ausführung. Alles was ich ausprobiert (und per Google) gefunden habe, war mumpitz. Schlußendlich bin ich zu der Lösung gekommen, dies mit Ghost Script zu machen. (Ich gehe davon aus, das GS so auch unter Linux funktionieren wird.)

Das Problem mit der AcroRd32.exe ist zum einen, das beim ausführen des Druckbefehls der Auftrag zwar gedruckt wird, aber anschließend der Reader offen bleibt und der Task nicht beendet wird. Es gibt zwar den Trick, nach einer gewissen Zeit den Task über die Shell zu beenden. Aber auf meinem Server hat dies nicht immer Funktioniert. Oftmals bliebt das komplette Skript hängen. oder es kam kein Ausdruck am Drucker an, oder der Task ließ sich manchmal nicht mal mehr über den Taskmanager beenden.

Die Lösung bei mir ist schließlich so:

Voraussetzung ist die Installation von Ghost Script auf dem Webserver.

Als erstes erzeuge ich per PHP aus einem HTML-Dokument ein PDF. Hierzu nutze ich html2pdf die Klasse (http://html2pdf.fr/) von Laurent Minguet.

$doc="mein htmlinhalt";
$html2pdf =  new HTML2PDF('P','A4','de',  false,  'UTF-8');
//$html2pdf->setModeDebug();
$html2pdf->setDefaultFont('Arial');
$html2pdf->writeHTML($doc,  false);
$datei="file.pdf";
$html2pdf->Output($datei,"F");

Dieses erzeugte PDF lege ich ein temporäres Verzeichnis auf meinem Server. (Oben im Script ist der Pfad nicht mit angegeben)

Anschließend starte ich im PHP mit shell_exec(); ein kleines Shellscript zum starten von GS mit folgendem Inhalt:

rem %1  druckername

rem  %2 dateiname inclusive pfad

echo  printing %2
"C:\Programme\gs\gs8.70\bin\gswin32c.exe" -dBATCH -q  -sDEVICE=mswinpr2 -dNOPAUSE -dNoCancel -sPAPERSIZE=a4 -dPDFFitPage  -sOutputFile=%%printer%%%1 %2

… Und siehe da, wieder ein glücklicher Anweder mehr!

Word .doc zu .txt mittels PHP

Freitag, 19. März 2010

Vor ein paar Tagen stand ich vor dem Problem, mittels PHP Word-Documente, die auf den Webserver geladen wurde, auszulesen. Sinn der ganzen Übung ist, den reinen Text des Dokumentes in einer mySQL-Datenbank zu speichern, um dann darüber recherchieren zu können.  Stichwort webbasierendes Dokumentenmanagement, an dem ich für meine Firma arbeite. Außerdem war das Problem vorhanden, .pdf Dokumente ebenso mit indexieren zu können. Nach vielem Basteln und googlen habe ich eine brauchbare Lösung gefunden.

PDF zu Text:

Die einfachste und brauchbarste Methode, um .pdf Dokumente auszulesen, ist meiner Ansicht das Shellscript pdftotext von Xpdf, welches frei Verfügbar ist. Es gibt unter Anderem eine Windows Version, und, wie kann es wohl sein :) , auch eine Linuxversion.
Ich lade mir das PDF Dokument auf den Server (mittels Formular, oder wie auch immer), stoße die pdftotext.exe (ja es ist ein Windows Server) mittels shellexecute an und lese die erzeugte Temp-Datei wieder aus. Dies klappt wunderbar. Das Ergebnis speichere ich dann in einem “TEXT-Spalte” in mySQL und kann wunderbar per LIKE im Text suchen lassen. Für alle Nachahmer: beachtet, das bei großen Datenmengen die Suche natürlich ein wenig dauern kann ;)

.doc zu Text

Bei den alten Word .doc habe ich im Internet diverse Möglichkeiten gefunden, wie zB das Nutzen des COM Objektes von PHP. Nachteil: auf dem Server muss WORD installiert sein (tseses!). Hier stelle ich aber eine andere Methode vor, die etwas einfacher zu handhaben ist:

Ich habe bei der Suche nach einer Lösung folgendes Script im Netz gefunden:

function doc2text($filename)
{
if ( file_exists($filename) )
{
if ( ($fh = fopen($filename, 'r')) !== false )
{
$headers = fread($fh, 0xA00);
# 1 = (ord(n)*1) ; Document has from 0 to 255 characters
$n1 = ( ord($headers[0x21C]) - 1 );
# 1 = ((ord(n)-8)*256) ; Document has from 256 to 63743 characters
$n2 = ( ( ord($headers[0x21D]) - 8 ) * 256 );
# 1 = ((ord(n)*256)*256) ; Document has from 63744 to 16775423 characters
$n3 = ( ( ord($headers[0x21E]) * 256 ) * 256 );
# (((ord(n)*256)*256)*256) ; Document has from 16775424 to 4294965504 characters
$n4 = ( ( ( ord($headers[0x21F]) * 256 ) * 256 ) * 256 );
# Total length of text in the document
$textLength = ($n1 + $n2 + $n3 + $n4);
$extracted_plaintext = fread($fh, $textLength);
# if you want the plain text with no formatting, do this
//echo $extracted_plaintext;
# if you want to see your paragraphs in a web page, do this
return nl2br($extracted_plaintext);
}
}
}

Diese Minifunktion reicht für meine Bedürfnisse vollkommen aus, auch wenn manchmal ein paar Datenkrüppel vorhanden sind. Häufig auftretende fehlerhaften Strings werden vor dem Speichern in die DB noch entfernt.

(weiterlesen…)