c# - मैं वेब सेवा से HTML दस्तावेज़ कैसे प्रिंट कर सकता हूं?

original title: "c# - How do I print an HTML document from a web service?"


Translate

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.



मैं सी # वेब सेवा से HTML प्रिंट करना चाहता हूं। वेब ब्राउज़र नियंत्रण ओवरकिल है, और यह सेवा वातावरण में अच्छी तरह से काम नहीं करता है, और न ही बहुत तंग secreit वाले सिस्टम पर अच्छी तरह से कार्य करता है ...

यह अनुवाद के बाद का सारांश है, अगर आपको पूरा अनुवाद देखने की आवश्यकता है, तो कृपया 'अनुवाद' आइकन पर क्लिक करें


सभी उत्तर
  • Translate

    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.


  • Translate

    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.


  • Translate

    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

  • Translate

    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).


  • Translate

    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.


  • Translate

    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.


  • Translate

    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...)