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

16,832

Solution 1

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

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

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

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

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.

Share:
16,832

Related videos on Youtube

Chris Marasti-Georg
Author by

Chris Marasti-Georg

Bowler with a programming problem.

Updated on March 23, 2020

Comments

  • Chris Marasti-Georg
    Chris Marasti-Georg over 4 years

    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.

    • Chris Marasti-Georg
      Chris Marasti-Georg almost 7 years
      @mruanova None of the answers worked last I tried them. If you have something that works let us know.
    • vpalmu
      vpalmu almost 5 years
      I know this was considered a good question in '08 but it's offtopic now.
    • Chris Marasti-Georg
      Chris Marasti-Georg over 4 years
      @Joshua how so?
    • vpalmu
      vpalmu over 4 years
  • Chris Marasti-Georg
    Chris Marasti-Georg almost 12 years
    Last I checked, part 2 (printing via command line with Adobe) does not work in a service - it requires user interaction.
  • Colonel Panic
    Colonel Panic almost 12 years
    Try Sumatra PDF it's much faster blog.kowalczyk.info/software/sumatrapdf/…
  • LukaszTaraszka
    LukaszTaraszka over 7 years
    Unfortunately printer dialog appears. I tested on Windows 7 x64.
  • Nyerguds
    Nyerguds almost 6 years
    @ColonelPanic Wow. Great hint. Took me ages to find one that works even from a service, and it seems SumatraPdf is actually usable in commercial packages.