Archiv für die Kategorie „Administration“

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!

Win 2k3 Terminalserver mit FreePDF

Donnerstag, 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

Update von ESX

Samstag, 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

(weiterlesen…)