【发布时间】:2011-04-25 11:19:59
【问题描述】:
我正在寻找一种在 c#(主要是 wpf)中以横向模式打印格式化 html 文件的方法。为了将页面设置设置为横向,打印对话框会很好。我尝试使用 Microsoft 的 html 到 xaml 转换器,它破坏了格式。我发现没有任何方法或抓取文件并直接发送到打印机,这让我感到非常惊讶。
任何想法都将不胜感激。
【问题讨论】:
我正在寻找一种在 c#(主要是 wpf)中以横向模式打印格式化 html 文件的方法。为了将页面设置设置为横向,打印对话框会很好。我尝试使用 Microsoft 的 html 到 xaml 转换器,它破坏了格式。我发现没有任何方法或抓取文件并直接发送到打印机,这让我感到非常惊讶。
任何想法都将不胜感激。
【问题讨论】:
多年来,我们使用其他答案中概述的 .net WebBrowser 控件,但是最近该控件变得越来越不稳定。即使重建我们用来在仓库中打印拣货单以运行 Windows 10 的机器,我们仍然会遇到页面问题,在我们重新启动计算机之前根本不会打印。相同的代码为我们服务了 4 年多,但现在看来,微软最近的更新使这个控件比过去更加错误。
另一个主要问题是,除了 Internet Explorer 的默认设置之外,没有简单的方法可以打印到打印机,因此如果您希望打印到不同的打印机,那么您就很难使用该控件。
多年前,我们使用 C++ 和 QtWebKit 库为装箱单编写了一个打印代码版本。所以为了解决这些问题,我把打印网页文件的旧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 程序位于您的应用程序或网站的 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;
}
}
享受吧!
【讨论】:
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();
}
【讨论】:
(WebBrowser.Document as MSHTML.IHTMLDocument2).execCommand("Print", false, 0)
可能是这样的:
webBrowser1.DocumentContent = YOUR_FILE_NAME;
mshtml.IHTMLDocument2 doc = webBrowser1.Document as mshtml.IHTMLDocument2;
doc.execCommand("Print", true, null);
【讨论】:
您可以在 C# 中访问 WebBrowser 类的 Print() 方法来执行此操作。很酷的是,您不需要在应用程序的任何位置实际显示 WebBrowser。只需将内容提供给 WebBrowser 控件,如下所示:
webBrowser1.DocumentContent = openfiledialog.FileName;
然后调用webBrowser1.Print(); 方法。这是 MSDN 参考:
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.print.aspx
希望这会有所帮助。
【讨论】:
在我看来,最好的方法是首先选择 HTML 渲染引擎,然后寻找它的打印支持。无论语言、操作系统或框架如何,都没有打印 HTML 文档的“标准”方式。
【讨论】: