フォーマットされたhtmlファイルをc#(主にwpf)のランドスケープモードで印刷する方法を探しています。ページ設定を横向きに設定するには、印刷ダイアログが便利です。 Microsoftのhtmlからxamlへのコンバーターを使用してみましたが、フォーマットが破壊されました。方法がなく、ファイルを取得して直接プリンターに送信する方法がないのは非常に驚くべきことです。
どんなアイデアでも大歓迎です。
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();
}
これを行うには、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
お役に立てれば。
長年、他の回答で概説されているように.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;
}
}
楽しい!
あなたが行きたい最善の方法は、最初にHTMLレンダリングエンジンを選び、それを印刷サポートのために探すことだと私には思えます。言語、OS、またはフレームワークに関係なく、HTMLドキュメントを印刷する「標準的な」方法はありません。
多分次のようなものです:
webBrowser1.DocumentContent = YOUR_FILE_NAME;
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2;
doc.execCommand("Print", true, null);