문제

이것은 쉬운 일이 아니지만 여기에 상황이 있습니다.

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 등)을위한 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top