web-dev-qa-db-ja.com

フォーマットされたHTMLページをC#で印刷する

フォーマットされたhtmlファイルをc#(主にwpf)のランドスケープモードで印刷する方法を探しています。ページ設定を横向きに設定するには、印刷ダイアログが便利です。 Microsoftのhtmlからxamlへのコンバーターを使用してみましたが、フォーマットが破壊されました。方法がなく、ファイルを取得して直接プリンターに送信する方法がないのは非常に驚くべきことです。

どんなアイデアでも大歓迎です。

12
Demetri
 WebBrowser myWebBrowser = new WebBrowser();
        private void Form1_Load(object sender, EventArgs e)
        {
            myWebBrowser.DocumentCompleted += myWebBrowser_DocumentCompleted;
            myWebBrowser.DocumentText  =System .IO.File .ReadAllText ( @"C:\a.htm");
        }

        private void myWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            myWebBrowser.Print();
        }
14
Thunder

これを行うには、C#でWebBrowserクラスのPrint()メソッドにアクセスできます。すばらしいのは、アプリケーションのどこにでも実際にWebBrowserを表示する必要がないことです。次のように、コンテンツをWebBrowserControlにフィードするだけです。

_webBrowser1.DocumentContent = openfiledialog.FileName;_

そして、webBrowser1.Print();メソッドを呼び出すだけです。これがMSDNリファレンスです:

http://msdn.Microsoft.com/en-us/library/system.windows.forms.webbrowser.print.aspx

お役に立てれば。

9
anon271334

長年、他の回答で概説されているように.net WebBrowserコントロールを使用していましたが、最近では、そのコントロールはますます不安定になっています。倉庫でピックシートを印刷するために使用するマシンを再構築してWindows10を実行しても、コンピューターを再起動するまでページが印刷されないという問題があります。同じコードが4年以上にわたってうまく機能しましたが、Microsoftからの最近の更新により、このコントロールが以前よりもさらにバグが多いように見えます。

もう1つの大きな問題は、Internet Explorerのデフォルト設定以外にプリンターに印刷する簡単な方法がないことです。そのため、別のプリンターに印刷したい場合は、そのコントロールではほとんど運が悪いことになります。

何年も前に、C++とQtWebKitライブラリを使用して伝票を梱包するための印刷コードのバージョンを作成しました。そこで、これらの問題を解決するために、Webページファイルを印刷する古いC++アプリケーションを掘り起こし、コマンドラインから印刷するためにこのプロジェクトに変換し、さまざまなプリンターで印刷できるようにしました。

ここでそのソースコードを入手できます:

https://github.com/kendallb/PrintHtml

minGWを使用してWindows用にプリコンパイルされた32ビットバイナリをここからダウンロードできます。

https://github.com/kendallb/PrintHtml/blob/master/deploy/PrintHtml-window-x86.zip?raw=true

コードは完全に移植可能であるため、必要に応じてソースコードからmacOSまたはLinuxで実行するように簡単にコンパイルできます。

コマンドラインは非常に使いやすく、使用法は次のとおりです。

Usage: PrintHtml [-test] [-p printer] [-l left] [-t top] [-r right] [-b bottom] <url> [url2]

-test         - Don't print, just show what would have printed.
-p printer    - Printer to print to. Use 'Default' for default printer.
-l left       - Optional left margin for page.
-t top        - Optional top margin for page.
-r right      - Optional right margin for page.
-b bottom     - Optional bottom margin for page.
url           - Defines the list of URLs to print, one after the other.

明らかに、これを.netアプリケーションから使用するには、コマンドラインで生成する必要がありますが、これは非常に簡単です。 PrintHtml.exeプログラムがアプリケーションまたはWebサイトのbinディレクトリにあるとすると、次のように.netから実行できます。

public bool PrintHtmlPages(
    string printer,
    List<string> urls)
{
    try {
        // Spawn the code to print the packing slips
        var info = new ProcessStartInfo();
        info.Arguments = $"-p \"{printer}\" \"{string.Join("\" \"", urls)}\"";
        var pathToExe = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        info.FileName = Path.Combine(pathToExe, "PrintHtml.exe");
        using (var p = Process.Start(info)) {
            // Wait until it is finished
            while (!p.HasExited) {
                Application.DoEvents();
                System.Threading.Thread.Sleep(10);
            }

            // Return the exit code
            return p.ExitCode == 0;
        }
    } catch {
        return false;
    }
}

楽しい!

8
Kendall Bennett

あなたが行きたい最善の方法は、最初にHTMLレンダリングエンジンを選び、それを印刷サポートのために探すことだと私には思えます。言語、OS、またはフレームワークに関係なく、HTMLドキュメントを印刷する「標準的な」方法はありません。

3
James Dunne

多分次のようなものです:

webBrowser1.DocumentContent = YOUR_FILE_NAME;
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2;
doc.execCommand("Print", true, null);
1
Kamyar