PHP ile serverside yazdırma işini başlangıç

3 Cevap

Bu kolay bir çok olası değildir, ancak burada durum:

Ben hangi bir C # komut satırı uygulaması yazdım:

  • itextsharp kullanarak bir PDF oluşturur
  • diske yazar
  • kullanımları Acrord32.exe sessizce oluşturulan PDF basmak için System.Diagnostics.Process aracılığıyla (bu Acrobat Reader)

Benim çözüm oluşturmak ve çift pdfGen.exe tıklayın beklendiği gibi çalışır. PDF oluşturulur ve yazdırılır.

Şimdi, benim app Windows Vista IIS 7 ile çalışan bir dahili sunucuda konuşlveırılacak vardır. Bu sunucu, bazı PHP webapp çalışan vardır. Ve shell_exec() sonuç PDF sunucuya bağlı yazıcıda basılacak, böylece kullanarak PHP ile çağrılır.

Yani benim PHP sayfası temelde böyle görünüyor:

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

Ama burada terslik. Ne olur görev yöneticisi vb göre dağılımı şöyledir:

  • pdfGen.exe başlar
  • PDF oluşturulur
  • Acrord32.exe başlar
  • pdfGen.exe sonsuza dek asılı (ve böylece PHP komut dosyası yapar) ve hiçbir şey yazdırılır

Ben bazı permission related problem oldukça eminim. Zaten varsayılan yazıcıya IIS_IUSRS izin verdi, ve Acrord32.exe bulunduğu dizine. Ama yine de, hiçbir baskı. Benim pdfGen.exe başlamak Ancak, elle çalışır.

Ne herhangi bir fikir eksik?

EDIT:

Ben PDF yazdırmak için Acrobat Reader kullanmak bağlı değilim. Başka bir yol silently oluşturulan PDF serverside yazdırmak için varsa, ben hiç sakıncası olmaz.

3 Cevap

Tüm yorumlar için teşekkürler. Ne yazık ki bu "php başlangıç ​​printjob" şey, çünkü bugün iptal edildi daha büyük bir projenin parçası olduğunu, iyi ... Ben ... biliyorum siyasi nedenleri yok. Proje oldukça fazla ölü olduğunu tahmin.

Her neyse, ben son günlerde kendimi bir kaç kez daha denedim ve IIS ile çalışmak için alamadım. Ben hayata ve zaten test Benim çözüm: ile çalışan yerel bir apache ve PHP ile bir XAMPP veya WAMPP paketini yüklemek, IIS kaldırmak admin access rights.

Bu hile yaptı. I-.exe başlar ve böylece PDF bitene kadar PHP beklemek etmediğini amacıyla PHP pclose(popen('...command...', 'r')); kullanılır. Tüm harika çalıştı.

İşte Acrobat Reader kullanarak yazdırma işi başlatır benim C # kodu

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();  
}  

İlk argüman basılmış olmalıdır PDF yolu, ikinci parametre AcroRd32.exe için mutlak yoludur.

Kalan tek sorun, AcroRd32.exe, başladı basılmış ve tekrar kapalı var asla idi. Böylece her printjob (I Acrobat Reader 9.0 kullanıyorum) AcroRd32.exe yeni bir örneğini başladı. Eğer 10 kez basılmış Yani, 10 acrobat reader örnekleri oluşturuldu.

Ne yazıcı bitmiş olduğunu umarak, daha sonra X saniye bekliyor, yazdırma işini başlayan ve daha sonra tüm AcroRd32.exe örneklerini öldürüyordu ki:

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;
}

Bu oldukça iyi çalıştı.


Not üzerinde (tüm AcroRd32.exe öldürme ve yönetici ayrıcalıklar ile PHP çalışan) sadece yapılabilir çünkü: The whole thing is only used by one user at a time and has a very limited area of use.

Bu müşteriler POS konuşlandırılmış bir dokunmatik uygulama kullanılmalıdır. Bir satıcı bir ürünü yapılandırmak için PHP uygulaması kullanmak istiyorum, ve sonra PHP oluşturmak ve arka planda bir PDF basacaktır benim. Exe çağırır. Basılı belge daha sonra müşteriye teslim edilir. So security etc. was not really a concern in this case.


If anyone has a solution in order to use it with IIS, I am still willing to accept it as an answer.

Ben çözüm için küçük bir iyileşme biliyorum: SumatraPDF yazdırdıktan sonra otomatik yakın Sumatra için kullanılabilecek güzel bir komut satırı arayüzü var.

PHP "sistem" ya da SumatraPDF açmak için bir toplu iş dosyasını çalıştırmak için "exec" kullanılan fonksiyonlar:

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

(Ayrıca yazdırmak için yazıcı adını belirtebilirsiniz)

ilginç bir program.

IIS_IUSRS seems to have no permission to print, try adding IIS_IUSRS to Print Operators Group / grant Print permission to the user.