Pergunta

Quero imprimir HTML de um serviço web C#.O controle do navegador web é um exagero e não funciona bem em um ambiente de serviço, nem funciona bem em um sistema com restrições de segurança muito rígidas.Existe algum tipo de graça .NET biblioteca que suportará a impressão de uma página HTML básica?Aqui está o código que tenho até agora, que não funciona corretamente.

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

Isso funciona bem quando chamado a partir de threads do tipo UI, mas nada acontece quando chamado a partir de um thread do tipo serviço.Mudando Print() para ShowPrintPreviewDialog() gera o seguinte erro de script do IE:

Erro: dialogArguments.___IE_PrintType é nulo ou não é um objeto.

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

E uma pequena caixa de diálogo vazia de visualização de impressão aparece.

Nenhuma solução correta

Outras dicas

Você pode imprimir a partir da linha de comando usando o seguinte:

runDll32.exe%windir% system32 mshtml.dll, imprimthtml "%1"

Onde %1 é o caminho do arquivo HTML a ser impresso.

Se você não precisa imprimir da memória (ou pode gravar no disco em um arquivo temporário), você pode usar:

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.Isso só funciona no Windows 2000 e superior, eu acho.

Eu sei que o próprio Visual Studio (pelo menos na versão 2003) faz referência à dll do IE diretamente para renderizar o "Design View".

Pode valer a pena investigar isso.

Caso contrário, não consigo pensar em nada além do controle do navegador da Web.

Fácil!Divida seu problema em duas partes mais simples:

  1. renderizar o HTML para PDF
  2. imprima o PDF (SumatraPDF)
  • -print-to-default $file.pdf imprime um arquivo PDF em uma impressora padrão
  • -print-to $printer_name $file.pdf imprime um PDF em uma determinada impressora

Se você tiver isso no orçamento (~$3.000), confira PrinceXML.

Ele renderizará HTML em PDF, funcionará bem em um ambiente de serviço e oferecerá suporte a recursos avançados, como não quebrar uma página no meio de uma célula de tabela (que muitos navegadores não suportam atualmente).

Talvez isso ajude. http://www.codeproject.com/KB/printing/printhml.aspxTambém não tenho certeza de qual thread você está tentando acessar o controle do navegador, mas precisa ser STA

Nota - O projeto mencionado no link permite navegar até uma página e imprimir sem mostrar a caixa de diálogo de impressão.

Não conheço as ferramentas específicas, mas existem alguns utilitários que gravam/reproduzem cliques.Em outras palavras, você poderia automatizar o "clique" na caixa de diálogo de impressão.(Eu sei que isso é um hack, mas quando tudo mais falhar...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top