웹 서비스에서 HTML 문서를 어떻게 인쇄합니까?


80

C # 웹 서비스에서 HTML을 인쇄하고 싶습니다. 웹 브라우저 제어는 과도하고 서비스 환경에서 제대로 작동하지 않으며 보안 제약이 매우 엄격한 시스템에서도 제대로 작동하지 않습니다. .NET기본 HTML 페이지 인쇄를 지원하는 무료 라이브러리가 있습니까? 지금까지 가지고있는 코드가 제대로 실행되지 않습니다.

public void PrintThing(string document)
{
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
    {
        Thread thread =
            new Thread((ThreadStart) delegate { PrintDocument(document); });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }
    else
    {
        PrintDocument(document);
    }
}

protected void PrintDocument(string document)
{
    WebBrowser browser = new WebBrowser();
    browser.DocumentText = document;
    while (browser.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    browser.Print();
}

UI 유형 스레드에서 호출하면 제대로 작동하지만 서비스 유형 스레드에서 호출되면 아무 일도 일어나지 않습니다. 변경 Print()ShowPrintPreviewDialog()수율 다음 IE 스크립트 오류 :

오류 : dialogArguments.___IE_PrintType null이거나 개체가 아닙니다.

URL : res://ieframe.dll/preview.dlg

그리고 작은 빈 인쇄 미리보기 대화 상자가 나타납니다.


@mruanova 마지막으로 효과가 있었던 답변이 없습니다. 작동하는 것이 있으면 알려주십시오.
Chris Marasti-Georg

나는 이것이 2008 년에 좋은 질문으로 여겨졌다는 것을 알고 있지만 지금은 주제를 벗어났습니다.
여호수아

@Joshua 어떻게 그렇게?
Chris Marasti-Georg

답변:


33

다음을 사용하여 명령 줄에서 인쇄 할 수 있습니다.

rundll32.exe % WINDIR % \ System32 \ mshtml.dll, PrintHTML "% 1"

여기서 % 1은 인쇄 할 HTML 파일의 파일 경로입니다.

메모리에서 인쇄 할 필요가 없거나 임시 파일의 디스크에 쓸 여유가있는 경우 다음을 사용할 수 있습니다.

using (Process printProcess = new Process())
{
    string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
    printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe";
    printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @"""";
    printProcess.Start();
}

NB 이것은 Windows 2000 이상에서만 작동한다고 생각합니다.


대단한 대답-수락으로 표시하고 테스트를 실행했습니다. dll이 여전히 인쇄 대화 상자를 표시하는 것으로 보이며 무인 Windows 서비스로 실행되기 때문에 어떻게 든 우회해야합니다. 저는 구글을 거의 지 쳤고, 현명하게 끝났습니다.
Chris Marasti-Georg

불행히도 프린터 대화 상자가 나타납니다. Windows 7 x64에서 테스트했습니다.
LukaszTaraszka

6

Visual Studio 자체 (최소한 2003 버전에서는)가 IE dll을 직접 참조하여 "디자인 뷰"를 렌더링한다는 것을 알고 있습니다.

그것을 살펴볼 가치가 있습니다.

그렇지 않으면 웹 브라우저 제어 외에는 아무것도 생각할 수 없습니다.


5

쉬운! 문제를 더 간단한 두 부분으로 나눕니다.

  1. HTML을 PDF로 렌더링
  2. PDF 인쇄 ( SumatraPDF )
  • -print-to-default $file.pdf 기본 프린터에서 PDF 파일을 인쇄합니다.
  • -print-to $printer_name $file.pdf 주어진 프린터에서 PDF를 인쇄합니다.

마지막으로 확인한 파트 2 (Adobe에서 명령 줄을 통해 인쇄)는 서비스에서 작동하지 않습니다. 사용자 상호 작용이 필요합니다.
Chris Marasti-Georg

1
Sumatra PDF를 사용해보세요. 훨씬 빨라졌습니다. blog.kowalczyk.info/software/sumatrapdf/…
Colonel Panic

@ColonelPanic 와우. 좋은 힌트. 서비스에서도 작동하는 것을 찾기 위해 나이가 들었고 SumatraPdf는 실제로 상용 패키지에서 사용할 수있는 것 같습니다.
Nyerguds

4

예산 (~ $ 3000)에있는 경우 PrinceXML을 확인하십시오 .

HTML을 PDF로 렌더링하고 서비스 환경에서 잘 작동하며 테이블 셀 중간에서 페이지를 분할하지 않는 것과 같은 고급 기능을 지원합니다 (현재 많은 브라우저에서 지원하지 않음).


1

아마도 이것이 도움이 될 것입니다. http://www.codeproject.com/KB/printing/printhml.aspx 또한 브라우저 컨트롤에 액세스하려는 스레드가 무엇인지 확실하지 않지만 STA 여야합니다.

주-링크에서 참조 된 프로젝트를 사용하면 인쇄 대화 상자를 표시하지 않고 페이지로 이동하여 인쇄를 수행 할 수 있습니다.


1

저에게 잘 맞는 도구는 HiQPdf입니다. https://www.hiqpdf.com/

가격은 합리적이며 ($ 245부터 시작) HTML을 PDF로 렌더링하고 PDF 파일의 인쇄를 직접 관리 할 수도 있습니다.


-1

특정 도구는 모르지만 클릭을 기록 / 재생하는 유틸리티가 있습니다. 즉, 인쇄 대화 상자에서 "클릭"을 자동화 할 수 있습니다. (나는 이것이 해킹이라는 것을 알고 있지만 다른 모든 것이 실패하면 ...)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.