c# - remove - Come si stampa un documento HTML da un servizio Web?




htmlagilitypack (5)

Voglio stampare HTML da un servizio web C #. Il controllo del browser Web è eccessivo e non funziona bene in un ambiente di servizio, né funziona bene su un sistema con vincoli di sicurezza molto rigidi. Esiste una sorta di libreria .NET gratuita che supporterà la stampa di una pagina HTML di base? Ecco il codice che ho finora, che non funziona correttamente.

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();
}

Funziona bene quando viene chiamato da thread di tipo UI, ma non accade nulla quando viene chiamato da un thread di tipo servizio. La modifica di Print() in ShowPrintPreviewDialog() genera il seguente errore di script IE:

Errore: dialogArguments.___IE_PrintType è nullo o no un oggetto.

URL: res://ieframe.dll/preview.dlg

Viene visualizzata una piccola finestra di dialogo di anteprima di stampa vuota.


È possibile stampare dalla riga di comando utilizzando quanto segue:

rundll32.exe% WINDIR% \ System32 \ mshtml.dll, PrintHTML "% 1"

Dove% 1 è il percorso del file html da stampare.

Se non hai bisogno di stampare dalla memoria (o puoi permetterti di scrivere sul disco in un file temporaneo) puoi usare:

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();
}

NB Questo funziona solo su Windows 2000 e sopra credo.


Facile! Dividi il problema in due parti più semplici:

  1. esegue il rendering dell'HTML in PDF
  2. stampa il PDF ( SumatraPDF )
  • -print-to-default $file.pdf stampa un file PDF su una stampante predefinita
  • -print-to $printer_name $file.pdf stampa un PDF su una determinata stampante

Lo strumento che funziona molto bene per me è HiQPdf. https://www.hiqpdf.com/

Il prezzo è ragionevole (parte da $ 245) e può convertire HTML in PDF e gestire direttamente la stampa dei file PDF.


Non conosco gli strumenti specifici, ma ci sono alcune utility che registrano / riproducono i clic. In altre parole, è possibile automatizzare il "clic" nella finestra di dialogo di stampa. (So ​​che questo è un trucco, ma quando tutto il resto fallisce ...)


So che Visual Studio stesso (almeno nella versione 2003) fa riferimento direttamente alla dll di IE per eseguire il rendering della "Vista di progettazione".

Potrebbe valere la pena esaminarlo.

Altrimenti, non riesco a pensare a nulla al di fuori del controllo del browser Web.





printing