Como imprimo um documento HTML de um serviço web?
-
08-06-2019 - |
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:
- renderizar o HTML para PDF
- 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...)