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

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!

Win 2k3 Terminalserver mit FreePDF

5. August 2010

Meine User haben ja manchmal komische Wünsche. Da wollen die doch allem Ernst über den Terminalserver ein PDF-Dokument drucken, das als Datei dann abgelegt wird. Unser eins als Admin versucht ja meist, dem Betrieb ein bisschen Geld zu sparen. Deshalb nutzen wir z.B. das schön kleine freePDF. Aber was tut sich beim Einsatz auf dem Terminalserver? Nix.

Also Google angeschmissen und fleissig gesucht.

Ich habe viele Vorschläge gefunden und versucht. Über die eigene freePDF Doku zu diversen Forenbeiträgen. Einiges war Humbug, anderes halbwegst gut. Schluss endlich habe ich eine einzige Lösung gefunden, die wirklich funktioniert.

Die User auf dem Terminalserver haben keine allzu großen Rechte. Sie bekommen lediglich 2 Programme beim einloggen zu Gesicht, die per TS-Startscript gestartet werden. Kein Desktop, nix.  Fast alles andere ist nicht verfügbar. Somit hat freePDF das Problem, das es nicht funktioniert (Hintergründe sind in den Dokus nachzulesen).

Ein Lösungansatz aus einem Forum war, die fpassist.exe über das Anmeldescript  zu starten, die bei jedem Login aufgerufen wird.
Aber das Problem hierbei ist, das beim Starten die Shell an der Stelle hängen bleibt, und die anderen Anwendungen nicht starten.

Das eigendliche Problem ist, das die standard Redmon-dll nicht sauber mit den Benutzerkonten zusammenarbeitet. Im Gegensatz zu RedMon 1.7 ist RedMonEE in der Lage, einen Prozess korrekt im aktuellen Benutzerkontext zu starten. In unserem Fall ist das die fpassist.exe. RedMonEE versucht diese bei jedem Druckauftrag zu starten. Die fpassist.exe erkennt dabei automatisch, ob sie bereits gestartet wurde, weswegen der Prozess auch nur ein mal pro User im Taskmanager erscheint.

Ich habe die Dll entsprechend ausgetauscht, und siehe da -> es läuft und läuft und läuft…

Zur Intsallation geht man folgendermassen vor:

  1. Beende den Druckerspoolerdienst (Druckerwarteschlange)
  2. lösche, oder besser benenne die redmonnd.dll im system32 Verzeichnis um
  3. RedMonEE installieren (einfach setup.exe starten)
  4. In den Porteinstellungen von FreePDF (FREEPDFXP1) unter der Registerkarte RedirektPort folgendes eintragen. Der Parameter Program to start after erhält folgenden Eintrag: C:\Programme\FreePDF_XP\fpassist.exe
  5. Außerdem den Haken bei Run as User setzen
  6. speichern nicht vergessen
  7. anschließend den Druckerspoolerdienst wieder starten

Links:

Das RedMonEE gibt es hier: http://www.is-foehr.com/

Den Top-Tipp mit dem “Austausch” der Dll habe ich hier gefunden: http://qvpdf.de/viewtopic.php?t=40

Webseite Grundschule Leese, die 2.

21. März 2010

Wir sind im Augenblick dabei, zu Überlegen, was denn für eine Grundschule auf einer Webseite sinnvoll ist, und wie die Seite in Zukunft aussehen soll. Im Augenblick ist die Seite einfach nur hässlich – mit so einem unschönen Buch als Layoutgrundlage. Wir habe im Augenblick 2 bereist vorhandene Templates zur Auswahl, die dann entsprechend auf 2 Spalten modifiziert würden.

Zur Auswahl stehe zur Zeit das Template von Eaglehawk Design, sowie ein Template vonSiteGround web hosting.

Mir persönlich gefällt das von Eaglehawk besser, das der Kontrast der Farben besser gewählt ist.

Für das erste haben wir den Terminkalender mittels SimpleCalendar auf Vordermann gebracht, sowie ein Gästebuch eingerichtet. Danach haben die Lehrkräfte seid einiger Zeit gerufen. Ich persönlich halte von Gästebüchern zwar nichsts, aber was soll’s. Für Kinder ist das schon was gutes, denke ich.

Auf jeden Fall wird noch eine Bildergalerie eingerichtet (Die Komponente joom:galerie ist bereist installiert), und außerdem muss noch die Lehrerschaft überredet werden, die Seite mit mehr Leben zu füllen.

Grundschulwebseite jetzt

Grundschulwebseite jetzt

Design von eaglehawk

Design von eaglehawk

Webdesign von siteground

Webdesign von siteground

Word .doc zu .txt mittels PHP

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.

Diesen Beitrag weiterlesen »

Grundschule Leese

14. März 2010

Der Förderverein der Grundschule Leese ist an mich herangetreten und hat mich gefragt, ob ich sie nicht bei der Webseite der Grundschule Leese unterstützen möchte. Ich werde also in der nächsten Zeit die Webseite der Grundschule ein wenig aufpeppen. Der Vorteil der Webseite ist das die Webseite mit Hilfe von Joomla erstellt wurde.

Vorgestern habe ich dort erst mal Joomla auf den aktuellen Softwarestand gebracht, und das Template der Seite ein wenig aufgepeppt. Das Aussehen der Seite wird aber wohl noch mal erheblich ändern. In den nächsten Wochen werde ich mit dem Förderverein der Schule zusammen daraus eine kleine schöne Webseite machen und diese überarbeiten.

Der Link zur Webseite der Schule: Grundschule Leese

Update von ESX

13. Februar 2010

In der Firma, in der ich als Admin angestellt bin, betreibe ich einen kleinen Intel Modular Server mit 2 Modulen, auf dem fast alle unsere Server virtualisiert sind. Wir nutzen hierzu das ESX von VMware. Ich musste gezwungenermassen das ESX 4.0 auf 4.0 Update 1 updaten. Leider habe ich 2 Stunden dazu verbracht, um überhaupt rauszubekommen, wie das geht. Ich hab also nach endlosem Googlen einen englischen Block aus dem Entwicklerteam von VMware gefunden, auf dem das updaten von ESX beschrieben ist. Um es dem deutschsprachigen Admin etwas zu erleichtern, hier meine Ausführung in deutsch:

Zuvor: Es sollten ein paar Linuxkenntnisse vorhanden sein. Kenntnisse über die Linuxshell sind von Vorteil. Außerdem ist zu beachten, das für das Update die virtuellen Maschinen auf dem entsprechenden Modul heruntergefahren werden müssen. Bei mir hat das Updaten – ohne die ganze Leserei -  ca. 25 Minuten gebraucht.

Die Vorbereitung:

Lade dir Putty herunter (ich gehe davon aus, das du ein Windows Betriebssystem hast), denn das Updaten geht nur mittels einer SSH-Konsole. Außerdem lade dir das Update von VMware herunter. In meinem Falle war das die ESX-4.0.0-update01a.zip.

Jetzt muss die Updatedatei auf einen der Datenspeicher kopiert werden. Dazu nimm den vSphere-Clienten:

Gehe hierzu im vSphere-Clienten auf Dateispeicher, mache einen Rechtsklick auf ein Storage, welcher genug Speicherplatz hat und gehe auf Datenspeicher durchsuchen. Hier kannst du jetzt über das entsprechende Symbol die .zip Datei auf dem Storage speichern. Somit ist die Updatedatei schon mal auf dem Server.

Update einspielen:

Um die .zip Datei einzuspielen musst du dich jetzt mittels Putty auf das Modul einloggen, auf dem du das Update einspielen willst.

SSH-Konsole

01

Prüfe, ob und wo genug Festplattenplatz vorhanden ist (doppelt so viel, wie das Updatefile wird benötigt):

vdf -h

02

Du kannst dir die Datei noch irgendwo anders hinschieben mittels des mv Befehls, wie z.B. nach /var/updates

mv /vmfs/volumes/<datastore>/ESX-4.0.0-update01a.zip /var/updates/*

<datastore> ist dein entsprechender Datenspeicher. In meinem Beispiel ist dies local_storage_raid10.

03

Prüfe jetzt ob das Update nicht schon eingespielt ist mittels diesem Befehl:

esxupdate query

04

Werden jetzt Updates aus dem Paket benötigt, muss der Server in den Wartungsmodus gestellt werden. Entweder über vSphere oder über die SSH-Konsole (ich persönlich bevorzuge vSphere).  Bedenke, das alle virtuellen Maschinen auf diesem Modul heruntergefahren müssen!

vimsh -n -e /hostsvc/maintenance_mode_enter

05

Über folgende Befehle können die Host aufgelistet werden. Mit dem zweiten Befehl wird die entsprechende Maschine heruntergefahren (ich bevorzuge wieder vSphere):

vmware-cmd -s listvms

vmware-cmd <voller Pfad zur .vmx Datei> stop soft

Diesen Beitrag weiterlesen »

Ein Kampf mit Joomla und ImageSizer

12. Februar 2010

Heute war ich am Verzweifeln. Ich habe für einen Kunden das Joomlaplugin ImageSizer von reDim installieren wollen.  Zum eine habe ich lange nach gesucht, warum das Plugin manchmal funktionierte, und manchmal nicht -> nach 2 Stunde probieren habe ich das erste Problem lokalisieren können: In den Parametern des Plugin muss der maximale Thumbwert klein genug gemacht werden. Verkleinere ich mein Bild kleiner als der angegeben Wert, ignoriert das Plugin die Bilder.

Zum Zweiten arbeitet das Plugin nicht wirklich mit dem  mod_newsflash zusammen. Wenn ich das Modul auf meiner Startseite anzeigen lasse, so ignoriert das imageSize die Bilder im mod_newsflash. Warum das so ist, habe ich bisher nicht herausfinden können.

Jetzt weiß ich zumindest Bescheid, und kann dementsprechend reagieren.

http://www.redim.de/downloads/joomla-1.5/plugins/imagesizer.html

GW-Blog umgezogen

7. Februar 2010

Heute bin ich mit dem GW-Blog umgezogen.  Die Preisliste selber bleibt beim alten Provider, da ich ansonsten zu viel Anpassungen durchführen muss, da der ‘alte’ Webserver noch auf PHP4 basiert.

Der Blog selber wird sich dahin ändern, denn ich selber spiele kein Guildwars mehr. Die Themenschwerpunkte werden in Zukunft eher Aion betreffen. Außerdem werde ich von Zeit zu Zeit mehr auf die Scriptsprache Javascript, PHP, dem CMS Joomla und dem Javascriptframework jQuery eingehen. Mein neuestes Projekt, das  “Onlinekassensystem” bekommt hier ebenfalls sein Tagebuch-Zuhause.

Die Guildwarspreisliste werde ich aber weiterhin betreuen, sie wird nicht angeschaltet – falls das jetzt jemand befürchte.

Kleines Update der Preisliste

7. Januar 2010

Heute habe ich ein kleines Sicherheitsupdate eingespielt. Ein Bot hat versucht, die Datenbank zu fluten und Massenmails zu verschicken. Das Verschicken der Mails hat zwar nicht funktioniert, aber die Datenbank war übermäßig belastet worden. Die Sicherheitslücke ist jetzt gestopft.

Aion ohne Warteschlange

11. Oktober 2009

Sie haben es geschafft! Donnerwetter! Aion hat keine Warteschlangen mehr. Man kann jetzt sofort losspielen.

Seid vorgestern (Freitag) wurde die Obergrenze der Spielerzahl auf den Servern erheblich nach oben gesetzt, sodaß wir den Rechner nicht mehr stundenlang laufen lassen müssen, um just mal Aion zu spielen. Begonnen hat dies aber schon am Dienstag. Da gab es um 19:00 Uhr nur noch einWarteschlange von 7 Minuten. Ein paar Tage zuvor konnte man um 19:00 Uhr noch davon ausgehen, das die Warteschlange ca. 2 Stunde lang war.

So macht es wieder richtig spaß, denn jetzt kann man dazu übergehen, gemeinsame Quests zu planen und durchzuführen.