【问题标题】:Printing a formatted HTML page in C#在 C# 中打印格式化的 HTML 页面
【发布时间】:2011-04-25 11:19:59
【问题描述】:

我正在寻找一种在 c#(主要是 wpf)中以横向模式打印格式化 html 文件的方法。为了将页面设置设置为横向,打印对话框会很好。我尝试使用 Microsoft 的 html 到 xaml 转换器,它破坏了格式。我发现没有任何方法或抓取文件并直接发送到打印机,这让我感到非常惊讶。

任何想法都将不胜感激。

【问题讨论】:

    标签: c# html wpf printing


    【解决方案1】:

    多年来,我们使用其他答案中概述的 .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;
        }
    }
    

    享受吧!

    【讨论】:

    • 要感谢你,我必须花一天时间来获得 +50 声望 :D。你救了我的命。
    【解决方案2】:
     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();
            }
    

    【讨论】:

    • 这段代码显然是用于 Windows 窗体而不是 WPF。 WPF WebBrowser 控件不支持此功能(无法打印)。
    • @ygoe - 它可以 - (WebBrowser.Document as MSHTML.IHTMLDocument2).execCommand("Print", false, 0)
    【解决方案3】:

    可能是这样的:

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

    【讨论】:

    • 嗨。如何设置横向模式? (wpf) 谢谢
    【解决方案4】:

    您可以在 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

    希望这会有所帮助。

    【讨论】:

    • 您应该注意,这仅受 Windows 窗体 WebBrowser 控件支持,而不是 WPF 中的控件。
    【解决方案5】:

    在我看来,最好的方法是首先选择 HTML 渲染引擎,然后寻找它的打印支持。无论语言、操作系统或框架如何,都没有打印 HTML 文档的“标准”方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多