Web サービスから HTML ドキュメントを印刷するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/174

質問

C# Web サービスから HTML を印刷したいと考えています。Web ブラウザーの制御は過剰であり、サービス環境では適切に機能しません。また、セキュリティ制約が非常に厳しいシステムでも適切に機能しません。無料のものはありますか .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

そして、小さな空の印刷プレビュー ダイアログが表示されます。

正しい解決策はありません

他のヒント

次のコマンドを使用してコマンドラインから印刷できます。

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

注:これは Windows 2000 以降でのみ動作すると思います。

Visual Studio 自体 (少なくとも 2003 バージョン) は、「デザイン ビュー」をレンダリングするために IE dll を直接参照していることはわかっています。

それを検討してみる価値はあるかもしれません。

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

簡単!問題を 2 つの単純な部分に分割します。

  1. HTMLをPDFにレンダリングする
  2. PDF を印刷 (スマトラPDF)
  • -print-to-default $file.pdf PDF ファイルをデフォルトのプリンタで印刷します
  • -print-to $printer_name $file.pdf 指定されたプリンタで PDF を印刷します

予算内(3000円程度)であれば、ぜひチェックしてみてください。 PrinceXML.

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

もしかしたらこれが役立つかもしれません。 http://www.codeproject.com/KB/printing/printhml.aspxまた、どのスレッドからブラウザ コントロールにアクセスしようとしているのかわかりませんが、STA である必要があります

注 - リンクで参照されているプロジェクトでは、印刷ダイアログを表示せずにページに移動して印刷を実行できます。

具体的なツールはわかりませんが、クリックを記録/再生するユーティリティがいくつかあります。つまり、印刷ダイアログの「クリック」を自動化できます。(これがハッキングであることはわかっていますが、他のすべてが失敗した場合は...)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top