コメントありがとうございます。残念ながら、この "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 で使用するための解決策を持っている場合、私はそれを回答として受け入れます。