如何在使用列表时循环HTML打印?

时间:2016-01-22 15:13:11

标签: c# html printing

我有一个列表,其中包含我的PC上html文件的路径。我想循环遍历此列表并按照它们在列表中的顺序打印它们。

我尝试循环在msdn.microsoft.com上找到的用于打印HTML文件的代码。

List<string> AllHTMLsToPrint = new List<string>();

//things added to AllHTMLsToPrint list

foreach (string strHTMLToPrint in AllHTMLsToPrint)
{
    PrintHelpPage(strHTMLToPrint);
}

private void PrintHelpPage(string strHTMLToPrint)
{
    // Create a WebBrowser instance. 
    WebBrowser webBrowserForPrinting = new WebBrowser();

    // Add an event handler that prints the document after it loads.
    webBrowserForPrinting.DocumentCompleted +=
        new WebBrowserDocumentCompletedEventHandler(PrintDocument);

    // Set the Url property to load the document.
    webBrowserForPrinting.Url = new Uri(strHTMLToPrint);
    Thread.Sleep(100);
}

private void PrintDocument(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    // Print the document now that it is fully loaded.
    ((WebBrowser)sender).Print();

    // Dispose the WebBrowser now that the task is complete. 
    ((WebBrowser)sender).Dispose();
}

3 个答案:

答案 0 :(得分:0)

这里有设计问题。您可以浏览html页面列表进行打印。然后在浏览器中打开页面。加载页面时,您可以打印它。

但是...

加载页面的时间可能超过100毫秒。这是浏览器加载下一页的时间。您应该更改代码,以便在打印当前页面后加载下一页。在这种情况下,您可能不想使用循环,而是在打印后可能需要增加的索引。

应该与此类似(未经测试):

List<string> AllHTMLsToPrint = new List<string>();
private int index = 0;
PrintHelpPage(AllHTMLsToPrint[index]);


private void PrintHelpPage(string strHTMLToPrint)
{
    // Create a WebBrowser instance. 
    WebBrowser webBrowserForPrinting = new WebBrowser();

    // Add an event handler that prints the document after it loads.
    webBrowserForPrinting.DocumentCompleted +=
        new WebBrowserDocumentCompletedEventHandler(PrintDocument);

    // Set the Url property to load the document.
    webBrowserForPrinting.Url = new Uri(strHTMLToPrint);

}

private void PrintDocument(object sender, WebBrowserDocumentCompletedEventArgs e)
{

    // Print the document now that it is fully loaded.
    ((WebBrowser)sender).Print();

    if (index < AllHTMLsToPrint.Count -1)
    PrintHelpPage(AllHTMLsToPrint[++index]);
}

答案 1 :(得分:0)

您已声明自己拥有一堆本地html文件。 通过设置URI可能无法加载本地html文件。 您可以尝试设置DocumentStream。然后strHTMLToPrint必须包含本地html文件的完整/相对路径。

d.run "tomcat:8.0", args: "-it -p 8080:8080 --name tomcat8", auto_assign_name: false

答案 2 :(得分:0)

不确定究竟是什么问题,但我会把它放到后台工作程序中,这样你就不会占用主线程。我还将循环移动到文档加载系统中,这样一旦加载并打印它就会移动到下一个系统。

那说你还没说出你的代码没有做什么。

public partial class Form1 : Form
{
    internal List<string> AllHTMLsToPrint = new List<string>();

    public Form1()
    {
        InitializeComponent();
    }

    public void StartPrinting()
    {

        //things added to AllHTMLsToPrint list, please note you may need to add file:/// to the URI list if it is a local file, unless it is compact framework

        // start printing the first item
        BackgroundWorker bgw = new BackgroundWorker();
        bgw.DoWork += bgw_DoWork;
        bgw.RunWorkerAsync();
        /*foreach (string strHTMLToPrint in AllHTMLsToPrint)
        {
            PrintHelpPage(strHTMLToPrint);
        }*/
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        PrintHelpPage(AllHTMLsToPrint[0], (BackgroundWorker)sender);
    }

    private void PrintHelpPage(string strHTMLToPrint, BackgroundWorker bgw)
    {
        // Create a WebBrowser instance. 
        WebBrowser webBrowserForPrinting = new WebBrowser();

        // Add an event handler that prints the document after it loads.
        webBrowserForPrinting.DocumentCompleted += (s, ev) => {
            webBrowserForPrinting.Print();
            webBrowserForPrinting.Dispose();

            // you can add progress reporting here

            // remove the first element and see if we have to do it all again
            AllHTMLsToPrint.RemoveAt(0);
            if (AllHTMLsToPrint.Count > 0)
                PrintHelpPage(AllHTMLsToPrint[0], bgw);
        };


        // Set the Url property to load the document.
        webBrowserForPrinting.Url = new Uri(strHTMLToPrint);
    }

}