2008-08-01 4 views
66

C#WebサービスからHTMLを印刷したいとします。 Webブラウザコントロールは過度の機能であり、サービス環境ではうまく機能せず、セキュリティ制約が非常に厳しいシステムではうまく機能しません。基本的なHTMLページの印刷をサポートする無料の.NETライブラリがありますか?ここに私がこれまで持っているコードがありますが、これは正しく動作しません。Webサービスから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

と小さな空の印刷プレビューダイアログが表示されます:​​にPrint()を変更すると、次のIEのスクリプトエラーを生成します。

+0

最良の答えを選択してください、ありがとう。 – mruanova

+0

@mruanova最後にやった答えはありませんでした。あなたが働いているものがあれば私たちに知らせてください。 –

答えて

3

私はVisual Studio自体(少なくとも2003年版では)が "Design View"をレンダリングするために直接IE dllを参照していることを知っています。

それを調べる価値があります。

それ以外の場合は、Webブラウザコントロール以外のものは考えられません。

28

次を使用してコマンドラインから印刷することができます

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

N.B.これはWindows 2000以上でのみ動作します。

+0

偉大な答え - それは受け入れてマークするつもりだったし、私のテストを走った。 dllがまだPrintダイアログをポップアップすると思われます。これは無人のWindowsサービスとして実行されるため、何とか回避する必要があります。私はかなり多くのGoogleを使い果たしてしまった。 –

+0

残念ながら、プリンタダイアログが表示されます。私はWindows 7 x64でテストしました。 – LukTar

-1

私は特定のツールについてはわかりませんが、クリック数を記録/再生するユーティリティがあります。つまり、印刷ダイアログの「クリック」を自動化することができます。多分これが役立ちます

0

(...私は、これはハックですけど、他のすべてが失敗した場合)。 http://www.codeproject.com/KB/printing/printhml.aspxあなたからブラウザコントロールにアクセスしようとしているが、それはSTA

注意する必要があるもののスレッド もわからない - リンクで参照されるプロジェクトは表示せずに使用すると、ページに移動し、印刷を実行できません印刷ダイアログ

3

あなたは予算(〜$ 3000)でそれを持っていれば、PrinceXMLをチェックしてください。

HTMLをPDFにレンダリングし、サービス環境でうまく機能し、(多くのブラウザでは現在サポートされていない)表のセルの途中でページを分割しないなどの高度な機能をサポートします。

3

簡単!簡単な2つの部分にあなたの問題を分割:

  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(Adobeのコマンドラインからの印刷)はサービスでは機能しません。ユーザーの操作が必要です。 –

+1

Sumatra PDFを試してみると、はるかに高速ですhttp://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line –

関連する問題