A imprimir de a.NET serviço [encerrado]

Estou a trabalhar num projecto que envolve receber uma mensagem de outra aplicação, formatar o conteúdo dessa mensagem e enviá-la para uma impressora. A tecnologia de escolha é o Serviço C# windows. A saída poderia ser chamada de um relatório, eu suponho, mas um motor de relato não é necessário. Um motor templating simples, como StringTemplate, ou mesmo XSLT outputing HTML seria bom. O problema que estou tendo é encontrar uma maneira livre para imprimir este tipo de saída de um servico. Uma vez que Parece que vai funcionar, estou a trabalhar num protótipo usando o RDLC da Microsoft, a popularizar um relatório local e, em seguida, a torná-lo uma imagem para um fluxo de memória, que depois imprimirei. Questões com que são:

    A impressão em várias páginas vai ser uma grande dor de cabeça.
  • Ainda Tem de usar o 'PrintDocument' para imprimir o fluxo de memória, que não é suportado num Serviço do Windows (embora possa funcionar - ainda não chegou tão longe com o protótipo)
  • Se os dados ao encontrar mudanças, tenho de mudar o conjunto de dados, e a classe em que os dados estão a ser desertificados. Mau Mau Mau Mau.
Alguém teve de fazer algo remotamente como isto? Algum conselho? Eu já fiz uma pergunta sobre a impressão HTML sem entrada do Usuário, e depois de desperdiçar cerca de 3 dias com isso, cheguei à conclusão de que isso não pode ser feito, pelo menos não com qualquer ferramenta disponível livremente.

toda a ajuda é apreciada.

editar: estamos na versão 2.0 da. NET quadro.

Author: Jon Seigel, 2008-08-11

11 answers

Confie em mim, você vai gastar mais dinheiro tentando procurar/desenvolver uma solução para isso em comparação com a compra de um componente de terceiros. Não reinvente a roda e vá para a solução paga.

A impressão é um problema complexo e eu adoraria ver o dia em que melhor suporte de framework é adicionado para isso.

 13
Author: Vaibhav, 2008-08-11 19:20:29
Imprimir a partir de um serviço do Windows é muito doloroso. Parece funcionar... Ora... mas, por fim, esmaga-se ou abre uma excepção de vez em quando, sem qualquer razão clara. É realmente inútil. Oficialmente, é mesmo não suportado , sem qualquer explicação, nem qualquer proposta de uma solução alternativa. Recentemente, fui confrontado com o problema e depois de vários ensaios e experiências mal sucedidos, cheguei finalmente com dois soluções:
  • escreva o seu próprio DLL de impressão usando a API Win32 (em C / C++, por exemplo), e depois use-a a partir do seu serviço com o P / Invoke (works fine)
  • escreva o seu próprio componente de impressão COM+ e depois use-o do seu serviço. Eu escolhi esta solução com sucesso recentemente (mas era componente COM+ de terceiros, não próprio escrito) Ele funciona absolutamente bem também.
 9
Author: Yann Trevin, 2009-10-30 06:16:59
Consegui. É uma dor no A * S. O problema é que a impressão requer que o motor GDI esteja no lugar, o que normalmente significa que você tem que ter o desktop, que só carrega quando você está logado. Se você está tentando fazer isso a partir de um serviço em um servidor, então você normalmente não está conectado.

Então primeiro você não pode executar como o usuário de serviço normal, mas em vez disso como um usuário real que tem direitos de login interativo. Em seguida, você tem que ajustar as entradas de registro de Serviço (I esqueça como no momento, teria que encontrar o código que eu posso fazer esta noite, se você está realmente interessado). Finalmente, tens de rezar.

A tua maior dor de cabeça a longo prazo será com os condutores de impressão. Se estiver a correr como um serviço sem um utilizador ligado, alguns controladores de impressão gostam de aparecer janelas de vez em quando. O que acontece quando a impressora não tem toner? Ou sem papel? O controlador pode mostrar uma janela que nunca será vista, e manter a fila de impressoras, porque ninguém é entrei!
 5
Author: Nick, 2008-10-07 14:21:02
Imprimir a partir de um serviço é uma má ideia. As impressoras de rede estão ligadas "por Utilizador". Você pode marcar o serviço para ser executado como um usuário em particular, mas eu consideraria isso uma má prática de segurança. Você pode ser capaz de se conectar a uma impressora local, mas eu ainda hesitaria antes de ir por este caminho.

A melhor opção é que o serviço armazene os dados e que uma aplicação lançada pelo Utilizador faça a impressão pedindo os dados ao serviço. Ou um local comum em que os dados são armazenados, como uma base de dados.

Se precisar de imprimir os dados a intervalos regulares, configure um evento de tarefa através do Escalonador de Tarefas. O lançamento de um processo a partir de um serviço exigirá saber o nome de usuário e senha, o que novamente é uma má prática de segurança.

Quanto à impressão em si, use uma ferramenta de terceiros para gerar o relatório será o mais fácil.

 4
Author: Joel Lucsy, 2008-08-11 22:08:57
Para responder à sua primeira pergunta, isto pode ser bastante directo, dependendo dos dados. Temos uma variedade de aplicações baseadas em serviços que fazem exatamente o que você está pedindo. Normalmente, nós analisamos o arquivo de entrada e enrolamos o nosso próprio Postscript ou PCL em torno dele. Se o layout for bastante simples, então existem alguns códigos PCL muito básicos com os quais você pode envolvê-lo para fornecer a disposição de tipo de letra/impressão que você deseja (eu ficaria mais feliz em dar-lhe alguma orientação aqui offline). Um que tens um arquivo print ready você pode enviá-lo para uma impressora UNC que é compartilhada, diretamente para uma impressora instalada localmente, ou até mesmo para o IP do dispositivo (dados do tipo RAW ou LPR).

Se, no entanto, você está indo para o caminho PDF, o método mais simples é enviar a saída de PDF para uma impressora que suporta impressão direta de PDF (muitos fazem agora). Neste caso, basta enviar o PDF para o dispositivo e removê-lo impressões.

A outra opção é lançar Ghostscript que deve ser livre para as suas necessidades (verifique o licenciamento como eles têm algumas versões diferentes, algumas GNU, algumas GPL, etc.) e ou usa-o é construído em função de impressão ou simplesmente converter para Postscript e enviar para o dispositivo. Eu usei Ghostscript muitas vezes em aplicativos de serviço, mas não um grande fã como você vai basicamente ser bombardear e executar um aplicativo de linha de comando para fazer a conversão. Dito isto, é uma aplicação estável que tende a falhar graciosamente.

 3
Author: Douglas Anderson, 2008-10-07 14:08:40

Isto pode não ser o que você está procurando, mas se eu precisasse fazer isso rápido e sujo, eu faria:

  1. Criar uma aplicação WPF separada (para que eu pudesse usar o tratamento de documentos incorporado)
  2. dê ao serviço a capacidade de interagir com o ambiente de trabalho (lembre-se que não tem de mostrar nada no ambiente de trabalho, ou estar ligado para isto funcionar)
  3. Faça o serviço executar a aplicação, e dê-lhe os dados para imprimir.
Também podias abanar o capacete. isto para imprimir a partir de um navegador web que você executa a partir do serviço (embora eu recomendaria construir o seu próprio shell IE, em vez de usar um navegador completo).

Para uma solução mais detalhada (também livre), a sua melhor aposta é provavelmente formatar manualmente o documento você mesmo (usando o GDI+ para fazer o layout para você). Isso é entediante, propenso a erros, consumindo tempo e desperdiçando muito papel durante o desenvolvimento, mas também lhe dá o maior controle sobre o que está indo para a impressora.

 1
Author: TheSmurf, 2008-08-11 17:46:52

Se conseguir enviar para postar o programa, algumas impressoras irão imprimir tudo o que for FTPed para uma determinada pasta sobre elas.

Usámos isto para ultrapassar os créditos de impressão que a nossa universidade expôs em nós, mas se o seu serviço sair para um ps, então pode apenas ftp o ficheiro ps para a impressora.

 1
Author: Omar Kooheji, 2009-02-03 21:14:22

Estamos a usar o DevExpress ' XtraReports para imprimir a partir de um serviço sem quaisquer problemas. Seu modelo de relatório é semelhante ao dos formulários do Windows, então você poderia inserir dinamicamente elementos de texto e, em seguida, emitir o comando de impressão.

 1
Author: Jason Z, 2009-08-27 19:13:02
Acho que vamos pela rota de terceiros. Eu gosto do XSL - > HTML - > PDF - > fluxo de Impressora... Winnovatica's HTML para PDF parece bom para a primeira parte, mas eu estou correndo para um bloco encontrar uma boa solução de impressão PDF... alguma sugestão? Idealmente, a Licença seria em uma base de desenvolvedor, não em uma base de execução implantada.
 0
Author: Chris Marasti-Georg, 2008-08-11 21:09:00
Em resposta à sua pergunta sobre impressão em PDF, não encontrei uma solução elegante. Eu estava "shell" indo para Adobe que não era confiável e exigiu um usuário a ser logado em todos os momentos. Para corrigir este problema específico, eu pedi que os arquivos que processamos (faturas) sejam formatados como arquivos Tiff multi-página, em vez disso, que podem ser divididos e impressos usando funções de impressão nativo.net. A posição do Adobe parece ser "Faça com que o usuário veja o arquivo no Adobe Reader e eles podem clicar imprimir". Inutil.

Ainda estou interessado em encontrar uma boa maneira de produzir relatórios de qualidade que possam ser produzidos a partir do servidor web...

 0
Author: , 2008-10-21 13:09:55

Impressão por sistema.Desenho.A impressão não é suportada pelo MS, de acordo com a resposta de Yann Trevin. No entanto, você pode ser capaz de usar o novo sistema baseado em WPF.Impressão (i pensar)

 0
Author: John Rusk, 2009-07-14 22:25:34