How do I print an HTML document from a web service?
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:
- render the HTML to PDF
- 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.
Related videos on Youtube
Comments
-
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()
toShowPrintPreviewDialog()
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 almost 7 years@mruanova None of the answers worked last I tried them. If you have something that works let us know.
-
vpalmu almost 5 yearsI know this was considered a good question in '08 but it's offtopic now.
-
Chris Marasti-Georg over 4 years@Joshua how so?
-
vpalmu over 4 years
-
-
Chris Marasti-Georg almost 12 yearsLast I checked, part 2 (printing via command line with Adobe) does not work in a service - it requires user interaction.
-
Colonel Panic almost 12 yearsTry Sumatra PDF it's much faster blog.kowalczyk.info/software/sumatrapdf/…
-
LukaszTaraszka over 7 yearsUnfortunately printer dialog appears. I tested on Windows 7 x64.
-
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.