4

これはおそらく簡単なことではありませんが、状況は次のとおりです。

私は C# コマンド ライン アプリケーションを作成しました。

  • ITextSharp を使用して PDF を作成します
  • それをディスクに書き込みます
  • 生成された PDF をサイレント モードで印刷するために、Acrord32.exe(これは Acrobat Reader です) via を使用します。System.Diagnostics.Process

ソリューションをビルドして をダブルクリックするとpdfGen.exe、期待どおりに動作します。PDF が作成され、印刷されます。

ここで、IIS 7 を実行している Windows Vista を備えた内部サーバーにアプリをデプロイする必要があります。このサーバーには、PHP Web アプリケーションが実行されています。shell_exec()そして、結果のPDFがサーバーに接続されたプリンターで印刷されるように、PHPを使用して呼び出されます。

したがって、私の PHP ページは基本的に次のようになります。

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

しかし、ここで問題が発生します。何が起こるかは、タスクマネージャーなどによると:

  • pdfGen.exe始まる
  • PDFが作成されます
  • Acrord32.exe始まる
  • pdfGen.exe永久にハングアップし (PHP スクリプトも同様)、何も出力されません。

私はそれがいくつかの許可関連の問題であると確信しています。IIS_IUSRSデフォルトのプリンターと、あるディレクトリへのアクセスを既に許可しましたAcrord32.exe。しかし、それでも印刷はありません。ただし、pdfGen.exe を手動で起動すると動作します。

私が見逃しているものはありますか?

編集:

PDF を印刷するために Acrobat Reader を使用する義務はありません。作成された PDF サーバーサイドをサイレントモードで印刷する別の方法があれば、まったく気にしません。

4

5 に答える 5

1

何が起こっているかを確認するには、Sysinternals からプロセス モニターを実行し、イベントを adobe acrobat プロセスにフィルター処理してみてください。acrobat のシステム コールが表示され、何が問題なのかを多かれ少なかれ知ることができます。

于 2009-11-03T19:05:31.723 に答える
1

あなたのソリューションの小さな改善点を知っています.SumatraPDFには、印刷後にSumatraを自動的に閉じるために使用できる優れたコマンドラインインターフェイスがあります.

PHP の「system」または「exec」関数を使用してバッチ ファイルを実行し、SumatraPDF を開きました。

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

(印刷するプリンター名を指定することもできます)

于 2011-03-06T11:52:52.300 に答える
0

Shell_exec()は、ほとんどシェルコマンド(ls / dir、cpなど)を対象としています。shell_exec()の代わりにexec()を使用しようとしましたか?

于 2009-11-02T13:12:21.237 に答える
0

コメントありがとうございます。残念ながら、この "php start printjob" は、今日キャンセルされた大規模なプロジェクトの一部でした。その理由は、よくわかりませんが、政治的な理由によるものです。プロジェクトはほとんど死んでいると思います。

とにかく、ここ数日で何度か試してみましたが、IIS で動作させることができませんでした。すでに実装してテストした私のソリューション: IIS を削除し、XAMPP または WAMPP パッケージをインストールして、管理者アクセス権で実行されるローカル Apache と PHP を使用します。

これでうまくいきました。PDF が終了するまで PHP が待機しないように、およびpclose(popen('...command...', 'r'));を開始するために PHP で使用しました。.exeそれはすべてうまくいきました。

これは、Acrobat Reader を使用して印刷ジョブを開始する C# コードです。

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

最初の引数は印刷する PDF へのパスで、2 番目のパラメータはAcroRd32.exe.

残った唯一の問題は、それAcroRd32.exeが開始され、印刷され、二度と閉じられなかったことです。AcroRd32.exeそのため、すべての印刷ジョブが(私は Acrobat Reader 9.0 を使用しています) の新しいインスタンスを開始しました。したがって、10 回印刷すると、10 個の acrobat リーダー インスタンスが作成されます。

私がしたことは、印刷ジョブを開始し、X秒待って、プリンターが終了することを期待してから、すべてのAcroRd32.exeインスタンスを強制終了することでした:

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

これはかなりうまくいきました。


上記 (すべてAcroRd32.exeを強制終了し、管理者特権で PHP を実行する) は、次の理由でのみ実行可能であることに注意してください:一度に 1 人のユーザーのみが全体を使用し、使用領域が非常に限られています

クライアント POS に展開されたタッチスクリーン アプリケーションで使用する必要があります。セールスマンが PHP アプリを使用して製品を構成すると、PHP が my .exe を呼び出し、バックグラウンドで PDF を作成して印刷します。その後、印刷されたドキュメントがクライアントに渡されます。したがって、この場合、セキュリティなどは実際には問題になりませんでした。


誰かが IIS で使用するための解決策を持っている場合、私はそれを回答として受け入れます。

于 2009-11-04T11:03:00.890 に答える
0

それは興味深いプログラムです。

IIS_IUSRS 印刷する権限がないようですIIS_IUSRS 。Print Operators グループに追加するか、ユーザーに印刷権限を付与してみてください。

于 2009-10-30T07:11:41.497 に答える