How do I print an HTML document from a web service?

C#HtmlWeb ServicesPrinting

C# Problem Overview


I want to print HTML from a C# web service. The web browser control is overkill, and does not function well in a service environment, nor does it function well on a system with very tight security constraints. Is there any sort of free .NET library that will support the printing of a basic HTML page? Here is the code I have so far, which does not run properly.

public void PrintThing(string document)
{
    if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA)
    {
        Thread thread =
            new Thread((ThreadStart) delegate { PrintDocument(document); });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
    }
    else
    {
        PrintDocument(document);
    }
}

protected void PrintDocument(string document)
{
    WebBrowser browser = new WebBrowser();
    browser.DocumentText = document;
    while (browser.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    browser.Print();
}

This works fine when called from UI-type threads, but nothing happens when called from a service-type thread. Changing Print() to ShowPrintPreviewDialog() yields the following IE script error:

> Error: dialogArguments.___IE_PrintType is null or not an object. > > URL: res://ieframe.dll/preview.dlg

And a small empty print preview dialog appears.

C# Solutions


Solution 1 - C#

You can print from the command line using the following: > rundll32.exe > %WINDIR%\System32\mshtml.dll,PrintHTML > "%1"

Where %1 is the file path of the HTML file to be printed.

If you don't need to print from memory (or can afford to write to the disk in a temp file) you can use:

using (Process printProcess = new Process())
{
    string systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
    printProcess.StartInfo.FileName = systemPath + @"\rundll32.exe";
    printProcess.StartInfo.Arguments = systemPath + @"\mshtml.dll,PrintHTML """ + fileToPrint + @"""";
    printProcess.Start();
}

N.B. This only works on Windows 2000 and above I think.

Solution 2 - C#

I know that Visual Studio itself (at least in 2003 version) references the IE dll directly to render the "Design View".

It may be worth looking into that.

Otherwise, I can't think of anything beyond the Web Browser control.

Solution 3 - C#

Easy! Split your problem into two simpler parts:

  1. render the HTML to PDF
  2. print the PDF (SumatraPDF)

> * -print-to-default $file.pdf prints a PDF file on a default printer
> * -print-to $printer_name $file.pdf prints a PDF on a given printer

Solution 4 - C#

If you've got it in the budget (~$3000), check out PrinceXML.

It will render HTML into a PDF, functions well in a service environment, and supports advanced features such as not breaking a page in the middle of a table cell (which a lot of browsers don't currently support).

Solution 5 - C#

I tool that works very well for me is HiQPdf. https://www.hiqpdf.com/

The price is reasonable (starts at $245) and it can render HTML to a PDF and also manage the printing of the PDF files directly.

Solution 6 - C#

Maybe this will help. http://www.codeproject.com/KB/printing/printhml.aspx Also not sure what thread you are trying to access the browser control from, but it needs to be STA

Note - The project referred to in the link does allow you to navigate to a page and perform a print without showing the print dialog.

Solution 7 - C#

I don't know the specific tools, but there are some utilities that record / replay clicks. In other words, you could automate the "click" on the print dialog. (I know this is a hack, but when all else fails...)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionChris Marasti-GeorgView Question on Stackoverflow
Solution 1 - C#ICRView Answer on Stackoverflow
Solution 2 - C#EndangeredMassaView Answer on Stackoverflow
Solution 3 - C#Colonel PanicView Answer on Stackoverflow
Solution 4 - C#user314783View Answer on Stackoverflow
Solution 5 - C#AnthonyVOView Answer on Stackoverflow
Solution 6 - C#NastyNateDoggyView Answer on Stackoverflow
Solution 7 - C#oglesterView Answer on Stackoverflow