PHP를 통해 서버 사이드 인쇄 작업 시작
문제
이것은 쉬운 일이 아니지만 여기에 상황이 있습니다.
C# Command Line 응용 프로그램을 작성했습니다.
- itextsharp를 사용하여 PDF를 만듭니다
- 디스크에 씁니다
- 용도
Acrord32.exe
(이것은 Acrobat Reader)를 통해System.Diagnostics.Process
생성 된 PDF를 조용히 인쇄하려면
솔루션을 만들고 두 번 클릭하면 pdfGen.exe
, 그것은 예상대로 작동합니다. PDF가 생성되고 인쇄됩니다.
이제 내 앱은 IIS 7을 실행하는 Windows Vista가있는 내부 서버에 배포되어야합니다.이 서버에는 PHP WebApp이 실행 중입니다. 그리고 PHP를 통해 호출됩니다 shell_exec()
결과 PDF가 서버에 연결된 프린터에 인쇄되도록합니다.
그래서 내 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 서버 사이드를 인쇄하면 전혀 신경 쓰지 않을 것입니다.
해결책 5
귀하의 의견에 감사드립니다. 불행히도이 "PHP Start PrintJob"은 오늘날 더 큰 프로젝트의 일부였습니다. 프로젝트가 거의 죽었다고 생각합니다.
어쨌든, 나는 마지막 날에 몇 번 더 시도했고 IIS와 함께 일할 수 없었습니다. 이미 구현하고 테스트 한 솔루션 : IIS를 제거하고 로컬 Apache 및 PHP와 함께 XAMPP 또는 WAMPP 패키지를 설치하십시오. 관리자 액세스 권한.
이것은 속임수를했다. 나는 사용했다 pclose(popen('...command...', 'r'));
PHP에서 시작하려면 .exe
PHP가 PDF가 완료 될 때까지 기다리지 않도록합니다. 모두 훌륭하게 작동했습니다.
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의 경로입니다. 두 번째 매개 변수는 AcroRd32.exe
.
남은 유일한 문제는 AcroRd32.exe
시작하고 인쇄되었으며 다시는 닫히지 않았습니다. 그래서 모든 printjob은 새로운 인스턴스를 시작했습니다 AcroRd32.exe
(나는 Acrobat Reader 9.0을 사용하고 있습니다). 따라서 10 번 인쇄하면 10 개의 Acrobat Reader 인스턴스가 생성되었습니다.
내가 한 일은 인쇄 작업을 시작한 다음 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를 실행하는 것). 모든 것은 한 번에 한 명의 사용자 만 사용하며 사용 영역이 매우 제한되어 있습니다..
Clients POS에 배치 된 터치 스크린 응용 프로그램에 사용해야합니다. 영업 사원은 PHP 앱을 사용하여 제품을 구성한 다음 PHP는 내 .Exe를 호출하여 백그라운드에서 PDF를 생성하고 인쇄합니다. 그런 다음 인쇄 된 문서가 클라이언트에게 전달됩니다. 따라서 보안 등은 실제로이 경우 문제가 아니 었습니다.
누군가가 IIS와 함께 사용하기 위해 해결책을 가지고 있다면, 나는 여전히 그것을 답으로 받아 들일 것입니다.
다른 팁
무슨 일이 일어나고 있는지 확인하려면 sysinternals의 프로세스 모니터 이벤트를 Adobe Acrobat 프로세스로 필터링하십시오. Acrobat의 시스템 호출을 볼 수 있으며 무엇이 잘못되고 있는지 더 많이 알 수 있습니다.
SumatraPDF에는 인쇄 후 수마트라를 자동으로 허용하는 데 사용할 수있는 멋진 명령 줄 인터페이스가 있습니다.
PHP "System"또는 "Exec"기능을 사용하여 배치 파일을 실행하여 수마트라 드프를 열었습니다.
sumatrapdf.exe -print-to-default -exit-on-print <path_to_PDF_file>
(인쇄 할 프린터 이름을 지정할 수도 있습니다)
그것은 흥미로운 프로그램입니다.
IIS_IUSRS
인쇄 할 권한이없는 것 같습니다. 추가 해보십시오. IIS_IUSRS
운영자 그룹 / 사용자에게 인쇄 권한을 인쇄합니다.
shell_exec ()는 거의 shell _ exec () 대신 shell 명령 (ls/dir, cp 등)을위한 것입니다.