A imprimir de a.NET serviço [encerrado]
-
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.
toda a ajuda é apreciada.
editar: estamos na versão 2.0 da. NET quadro.
11 answers
A impressão é um problema complexo e eu adoraria ver o dia em que melhor suporte de framework é adicionado para isso.
- 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.
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!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.
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.
Isto pode não ser o que você está procurando, mas se eu precisasse fazer isso rápido e sujo, eu faria:
- Criar uma aplicação WPF separada (para que eu pudesse usar o tratamento de documentos incorporado)
- 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)
- Faça o serviço executar a aplicação, e dê-lhe os dados para imprimir.
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.
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.
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.
Ainda estou interessado em encontrar uma boa maneira de produzir relatórios de qualidade que possam ser produzidos a partir do servidor web...
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)