2008-08-01 3 views
66

C# 웹 서비스에서 HTML을 인쇄하려고합니다. 웹 브라우저 컨트롤은 과도하게 사용되며 서비스 환경에서는 제대로 작동하지 않으며 보안 제약이 매우 엄격한 시스템에서도 제대로 작동하지 않습니다. 기본 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 형 스레드에서 호출 할 때 잘 작동하지만 아무것도 서비스 형 스레드에서 호출 할 때 발생합니다.

Error: 'dialogArguments.___IE_PrintType' is null or not an object
URL: res://ieframe.dll/preview.dlg

그리고 작은 빈 인쇄 미리보기 대화 상자가 나타납니다 : ShowPrintPreviewDialog()Print()을 변경하면 다음 IE 스크립트 오류를 ​​얻을 수 있습니다.

+0

가장 좋은 대답을 선택하세요, 감사합니다. – mruanova

+0

@mruanova 마지막으로 해본 답변 중 어느 것도 시도하지 못했습니다. 너는 일하는 것이 있으면 우리에게 알려 줘. –

답변

3

Visual Studio 자체 (적어도 2003 버전)는 IE dll을 직접 참조하여 "디자인보기"를 렌더링합니다.

그럴 가치가 있습니다.

그렇지 않으면 웹 브라우저 컨트롤 이상의 것을 생각할 수 없습니다.

28

다음 사용하여 명령 줄에서 인쇄 할 수 있습니다 : % 1은 HTML 파일의 파일 경로입니다

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

인쇄 할 수 있습니다.

당신이 메모리에서 인쇄 할 필요가 없습니다 (또는 임시 파일에 디스크에 기록 할 감당할 수있는) 경우에 당신은 사용할 수 있습니다

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

N.B. 이것은 Windows 2000 이상에서만 작동합니다.

+0

위대한 대답 - 그것을 표시하고, 내 테스트를 도왔습니다. dll이 여전히 인쇄 대화 상자를 팝업하는 것처럼 보입니다. 무인 Windows 서비스로 실행되기 때문에 어떻게 든 우회해야합니다. 나는 꽤 많이 구글을 다 써 버렸고, 나는 지혜롭게 끝났다. –

+0

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

-1

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

0

아마도 도움이 될 것입니다. 링크에 언급 된 프로젝트는 한 페이지로 이동 표시하지 않고 인쇄를 수행 할 수 있도록 않는다 - 당신의 브라우저 컨트롤에 액세스하려고하지만 STA

주의 할 필요가 무엇 스레드 또한 http://www.codeproject.com/KB/printing/printhml.aspx 확실하지 인쇄 대화 상자.

3

예산 (~ 3000 달러)을 얻었다면 PrinceXML을 확인하십시오.

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

3

쉽지! 이 개 간단한 부분으로 문제를 분할 :

  1. render the HTML to PDF
  2. 를 인쇄 PDF (SumatraPDF)
  • -print-to-default $file.pdf prints a PDF file on a default printer
  • -print-to $printer_name $file.pdf prints a PDF on a given printer
+0

마지막으로 나는 서비스에서 작동하지 않습니다 (어도비와 명령 줄을 통해 인쇄) 2 부, 확인 - 그것은 사용자 상호 작용을 필요로한다. –

+1

훨씬 빠른 http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line 수마트라 PDF를보십시오 –

관련 문제