71


7

WebサービスからHTML文書を印刷する方法

私はC#WebサービスからHTMLを印刷したいです。 Webブラウザの制御はやり過ぎであり、サービス環境ではうまく機能しません。また、セキュリティ制約が非常に厳しいシステムでもうまく機能しません。 基本的なHTMLページの印刷をサポートする無料の `.NET`ライブラリはありますか? これが私がこれまでに持っているコードで、これは正しく実行されません。

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 _ _

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

6 Answer


31


次のようにコマンドラインから印刷できます。

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以降でしか動作しません。


6


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

それを検討する価値があるかもしれません。

そうでなければ、私はWebブラウザのコントロールを超えて何かを考えることはできません。


4


簡単です! 問題を2つの単純な部分に分けてください。

  1. https://stackoverflow.com/a/5635643/284795 [HTMLからPDFへのレンダリング]

  2. PDFを印刷する (http://blog.kowalczyk.info/software/sumatrapdf/manual.html#manual-cmd-line[SumatraPDF])

_ * `-print-to-default $ file.pdf`はデフォルトのプリンタでPDFファイルを印刷します * `-print-to $ printer_name $ file.pdf`は指定されたプリンターでPDFを印刷します _


3


予算(〜$ 3000)に収まっている場合は、http://www.princexml.com [PrinceXML]をご覧ください。

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


0


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


-1


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