85

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

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

4

7 に答える 7

36

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

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

注意:これはWindows2000以降でのみ機能すると思います。

于 2008-08-03T18:06:30.913 に答える
7

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

それを調べる価値があるかもしれません。

そうでなければ、私はWebブラウザの制御を超えて何も考えることができません。

于 2008-08-02T00:42:35.310 に答える
6

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

  1. HTML を PDF にレンダリングする
  2. PDF を印刷する ( SumatraPDF )
  • -print-to-default $file.pdf デフォルトのプリンターで PDF ファイルを印刷する
  • -print-to $printer_name $file.pdf 指定されたプリンターで PDF を印刷します
于 2012-08-15T13:27:40.940 に答える
4

予算内 (~$3000) に収まる場合は、 PrinceXMLをチェックしてください。

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

于 2010-04-12T17:57:20.060 に答える
1

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

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

于 2009-06-17T17:36:22.350 に答える
-2

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

于 2008-09-20T17:37:33.710 に答える