Frage

Dies ist wahrscheinlich nicht leicht, aber hier ist die Situation:

Ich habe eine C # Kommandozeilen-Anwendung geschrieben, die:

  • erstellt eine PDF-Datei mit iTextSharp
  • schreibt sie auf die Festplatte
  • verwendet Acrord32.exe (dies ist Acrobat Reader) über System.Diagnostics.Process, um die erzeugte PDF zu leise drucken

Wenn ich meine Lösung bauen und die doppelte pdfGen.exe klicken, funktioniert es wie erwartet. Die PDF-Datei wird erstellt und gedruckt werden.

Nun hat meine Anwendung mit Windows Vista läuft auf einem internen Server bereitgestellt werden IIS 7. Dieser Server einige PHP webapp läuft hat. Und es wird über die Verwendung von PHP shell_exec() genannt werden, so dass die resultierenden PDF wird auf den an den Server angeschlossenen Drucker ausgedruckt werden.

Also meine PHP-Seite im Grunde wie folgt aussieht:

shell_exec('/path/to/pdfGen.exe');

Aber hier etwas schief läuft. Was geschieht, ist nach Task-Manager etc.

  • pdfGen.exe startet
  • das PDF erstellt
  • Acrord32.exe startet
  • pdfGen.exe hängt immer (und so auch der PHP-Skript) und es wird nichts gedruckt

Ich bin mir ziemlich sicher, dass es einige Erlaubnis verwandtes Problem . Ich habe bereits IIS_IUSRS Zugriff auf den Standarddrucker, und auf das Verzeichnis, in dem Acrord32.exe befindet. Aber noch, kein Druck. Allerdings, wenn ich meine pdfGen.exe manuell starten es funktioniert.

Jede Idee, was ich fehle?

EDIT:

Ich bin nicht zu verwenden, Acrobat Reader, um die PDF-gebunden zu drucken. Wenn es einen anderen Weg, um ist leise Drucken der PDF-Serverside erstellt, würde ich nichts dagegen.

War es hilfreich?

Lösung 5

Danke allen für Ihre Kommentare. Leider Sache war Teil eines größeren Projektes „Druckauftrag starten php“ dies die heute wurde abgebrochen, weil, na ja ... ich weiß nicht ... politische Gründe. Raten Sie das Projekt ziemlich tot ist.

Wie auch immer, habe ich versucht, mich ein paar Mal in den letzten Tagen und bekommen kann es nicht mit IIS zu arbeiten. Meine Lösung, die ich umgesetzt und bereits getestet: Entfernen Sie IIS, ein XAMPP oder WAMPP Paket mit einem lokalen Apache und PHP installieren, die mit läuft Admin-Zugriffsrechte .

Dies hat den Trick. Ich benutzen pclose(popen('...command...', 'r')); in PHP, um die .exe zu starten und so, dass PHP nicht warten, bis das PDF beendet ist. Das alles hat super geklappt.

Hier ist mein C # -Code, der den Druckauftrag mit dem Acrobat Reader startet

public void Print(string pathname, string acrobatDirectory)
{
    var proc = new Process
    {
        StartInfo =
        {
            Arguments               = String.Format("/t \"{0}\"", pathname),
            FileName                = acrobatDirectory,
            UseShellExecute         = false,
            CreateNoWindow          = true,
            RedirectStandardOutput  = false,
            RedirectStandardError   = false,
        }
    };

    proc.Start();  
}  

Das erste Argument ist der Pfad zu dem PDF, das gedruckt werden soll, der zweite Parameter der absolute Pfad zum AcroRd32.exe ist.

Das einzige Problem war, dass links AcroRd32.exe gestartet wurde, gedruckt und wurde nie wieder geschlossen. So begann jeden Druckauftrag eine neue Instanz von AcroRd32.exe (I Acrobat Reader bin mit 9,0). Also, wenn Sie 10-mal gedruckt wurden 10 Acrobat Reader Instanzen erstellt.

Was ich tat, wurde den Druckauftrag startet, dann X Sekunden warten, in der Hoffnung, dass der Drucker fertig war und dann alle AcroRd32.exe Instanzen zu töten:

public void Print(string pathname, string acrobatDirectory)
{
    Debug.WriteLine("Printing...");

    Printer.Print(pathname, acrobatDirectory);

    Thread.Sleep(30000);

    try
    {
        Debug.WriteLine("Trying to kill runnung AcroRd32.exe's ");

        FindAndKillProcess("AcroRd32");
    }
    catch (Exception)
    {
        Debug.WriteLine("AcroRd32.exe could not be killed...");
    }
}

private bool FindAndKillProcess(string name)
{
    foreach (Process clsProcess in Process.GetProcesses())
    {
        if (clsProcess.ProcessName.StartsWith(name))
        {
            clsProcess.Kill();
            return true;
        }
    }

    return false;
}

Das ist ganz gut funktioniert.


Hinweis

, dass die oben (Tötung all AcroRd32.exe und mit PHP mit Admin-Privileg) war nur machbar, weil: Das Ganze ist nur von einem Benutzer zu einem Zeitpunkt verwendet und hat einen sehr begrenzten Einsatzbereich .

Es sollte am Kunden POS Einsatz auf einer Touchscreen-Anwendung verwendet werden. Ein Verkäufer würde die PHP-Anwendung verwenden, um ein Produkt zu konfigurieren, und dann würde PHP meine .exe nennen, die eine PDF im Hintergrund würden erstellen und drucken. Das gedruckte Dokument wird dann an den Kunden ausgehändigt. So Sicherheit usw. war nicht wirklich ein Problem in diesem Fall.


Wenn jemand eine Lösung, um es mit IIS zu verwenden hat, ich bin immer noch bereit, es als Antwort zu akzeptieren.

Andere Tipps

Um zu überprüfen, was los ist, versuchen zu laufen die Process Monitor von Sysinternals und filtern, um die Ereignisse zu dem Adobe Acrobat Prozess rel="nofollow . Sie werden die Systemaufrufe von Acrobat sehen und es erlaubt Ihnen, mehr oder weniger zu wissen, was nicht in Ordnung ist.

Ich kenne eine kleine Verbesserung zu Ihrer Lösung. SumatraPDF hat eine schöne Befehlszeilenschnittstelle, die auf automatische Schließen Sumatra nach dem Druck verwendet werden kann

Ich habe PHP "System" oder "exec" -Funktionen eine Batch-Datei auszuführen SumatraPDF zu öffnen:

sumatrapdf.exe -print-to-default -exit-on-print <path_to_PDF_file>

(Sie können auch die Druckernamen angeben, auf drucken)

Das ist ein interessantes Programm.

IIS_IUSRS  scheint keine Erlaubnis zu haben zu drucken, versuchen IIS_IUSRS Hinzufügen Operators Group / erteilen Berechtigung Drucken an den Benutzer zu drucken.

shell_exec () ist fast für Shell-Befehle bestimmt (ls / dir, cp, etc.) Haben Sie versucht, exec () anstelle von shell_exec () zu verwenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top