Como faço para imprimir um documento HTML de um serviço web?

votos
68

Quero imprimir HTML de um serviço de C # web. O controle de navegador web é um exagero, e não funciona bem em um ambiente de serviço, nem funcionar bem em um sistema com restrições de segurança muito apertadas. Existe algum tipo de livre .NETbiblioteca que irá apoiar a impressão de uma página HTML básico? Aqui está o código que tenho até agora, que não executar 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 de tópicos do tipo de interface do usuário, mas nada acontece quando chamado de um thread-tipo de serviço. Alterando Print()a ShowPrintPreviewDialog()produz o seguinte erro de script IE:

Erro: 'dialogArguments .___ IE_PrintType' é nulo ou não um objeto
URL: res: //ieframe.dll/preview.dlg

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

Publicado 01/08/2008 em 19:33
fonte usuário
Em outras línguas...                            


7 respostas

votos
29

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

rundll32.exe% windir% \ system32 \ mshtml.dll, PrintHTML "% 1"

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

Se você não precisar imprimir a partir da memória (ou pode dar ao luxo de escrever para o 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();
}

NB Isso só funciona em Windows 2000 e acima eu acho.

Respondeu 03/08/2008 em 19:06
fonte usuário

votos
3

Fácil! Dividir o seu problema em duas partes simples:

  1. tornar o HTML para PDF
  2. imprimir 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
Respondeu 15/08/2012 em 14:27
fonte usuário

votos
3

Se você tem isso no orçamento (~ $ 3000), veja PrinceXML .

Ele irá processar HTML em um PDF, funciona bem em um ambiente de serviço, e suporta recursos avançados, como não quebrar uma página no meio de uma célula da tabela (que um monte de navegadores não suporta atualmente).

Respondeu 12/04/2010 em 18:57
fonte usuário

votos
3

Eu sei que em si (versão, pelo menos em 2003) Visual Studio referencia o IE dll directamente para tornar o "Ver Design".

Pode valer a pena olhar para isso.

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

Respondeu 02/08/2008 em 01:42
fonte usuário

votos
0

I ferramenta que funciona muito bem para mim é HiQPdf. https://www.hiqpdf.com/

O preço é razoável (começa em US $ 245) e pode renderizar HTML para PDF e também gerenciar a impressão dos arquivos PDF diretamente.

Respondeu 08/09/2019 em 05:35
fonte usuário

votos
0

Talvez isto ajude. http://www.codeproject.com/KB/printing/printhml.aspx Também não sei o fio que você está tentando acessar o controle de navegador a partir, mas ele precisa ser STA

Nota - O projecto referido no no link lhe permite navegar para uma página e executar uma impressão sem mostrar a janela de impressão.

Respondeu 17/06/2009 em 18:36
fonte usuário

votos
-1

Eu não sei as ferramentas específicas, mas existem alguns utilitários que gravação / reprodução clica. Em outras palavras, você pode automatizar o "clique" na caixa de diálogo de impressão. (Eu sei que este é um hack, mas quando tudo mais falhar ...)

Respondeu 20/09/2008 em 18:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more