Domanda

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 qualche tipo di gratuito? .NET libreria 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 succede nulla quando viene chiamato da un thread di tipo servizio.Mutevole Print() A ShowPrintPreviewDialog() restituisce il seguente errore di script IE:

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

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

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

Nessuna soluzione corretta

Altri suggerimenti

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

N.B.Funziona solo su Windows 2000 e versioni successive, credo.

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

Potrebbe valere la pena esaminarlo.

Altrimenti, non riesco a pensare a nulla che esuli dal controllo del browser Web.

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

  1. renderizzare l'HTML in PDF
  2. stampare 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

Se ce l'hai nel budget (~ $ 3000), dai un'occhiata PrinceXML.

Renderà l'HTML in un PDF, funzionerà bene in un ambiente di servizio e supporterà funzionalità avanzate come non interrompere una pagina nel mezzo di una cella di tabella (che molti browser attualmente non supportano).

Forse questo aiuterà. http://www.codeproject.com/KB/printing/printhml.aspxInoltre, non sono sicuro da quale thread stai tentando di accedere al controllo del browser, ma deve essere STA

Nota: il progetto a cui si fa riferimento nel collegamento consente di accedere a una pagina ed eseguire una stampa senza visualizzare la finestra di dialogo di stampa.

Non conosco gli strumenti specifici, ma esistono alcune utilità che registrano/riproducono i clic.In altre parole, potresti automatizzare il "clic" sulla finestra di dialogo di stampa.(So ​​che questo è un trucco, ma quando tutto il resto fallisce...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top