Question

Je suis en train de travailler sur un projet qui implique la réception d'un message provenant d'une autre application, la mise en forme du contenu de ce message et de l'envoyer à une imprimante.La technologie de choix est C# windows service.La sortie peut être appelé un rapport, je suppose, mais un moteur de génération de rapports n'est pas nécessaire.Un simple moteur de template, comme StringTemplate, ou même XSLT de la sortie HTML, ce serait bien.Le problème que je vais avoir est de trouver un moyen gratuit pour imprimer ce genre de sortie à partir d'un service.Depuis il semble que cela va fonctionner, je suis en train de travailler sur un prototype à l'aide de Microsoft RDLC, remplir un rapport local et ensuite rendu une image à un flux de mémoire, ce que je ne puis imprimer.Des problèmes avec ce sont:

  • Multi-impression de la page va être un gros mal de tête.
  • Toujours utiliser PrintDocument pour imprimer le flux de mémoire, qui n'est pas pris en charge dans un Service Windows (bien qu'il puisse travailler - n'ont pas obtenu de loin avec le prototype encore)
  • Si les données à venir à travers les changements, j'ai du modifier le jeu de données et la classe que les données sont désérialisée dans.bad bad.

Quelqu'un a dû faire quelque chose à distance comme cela?Tous les conseils?J'ai déjà posté une question sur l'impression de HTML sans intervention de l'utilisateur, et après perdre environ 3 jours que je suis arrivé à la conclusion qu'il ne peut pas être fait, au moins pas librement disponible de l'outil.

Toute aide est très appréciée.

EDIT:Nous sommes sur la version 2.0 de l' .NET framework.

Était-ce utile?

La solution

Faites-moi confiance, vous allez dépenser plus d'argent en essayant de trouver/développer une solution pour ce que par rapport à l'achat des composants tiers.Ne pas réinventer la roue et aller de l'payé solution.

L'impression est un problème complexe, et je serais ravi de voir le jour où une meilleure prise en charge du framework est ajoutée.

Autres conseils

Impression à partir d'un service Windows est vraiment pénible.Il semble fonctionner...parfois...mais enfin, il craches ou lève une exception de temps en temps, sans raison claire.C'est vraiment sans espoir.Officiellement, c'est même pas pris en charge, sans aucune explication, ni aucune proposition pour une solution alternative.

Récemment, j'ai été confronté à ce problème, et après plusieurs essais infructueux et d'expérimentations, j'ai enfin avec deux solutions viables:

  • Écrivez votre propre impression de la DLL à l'aide de l'API Win32 (en C/C++ par exemple), puis utiliser à partir de votre service avec P/Invoke (fonctionne très bien)
  • Écrivez votre propre impression de composant COM+, puis l'utilise à partir de votre service.J'ai choisi cette solution avec succès récemment (mais il était troisième partie composant COM+, pas écrites), Il fonctionne tout à fait bien trop.

Je l'ai fait.C'est une douleur dans le*s.Le problème est que l'impression que le moteur GDI être mis en place, ce qui signifie que vous devez avoir le bureau, ce qui ne charge que lorsque vous êtes connecté.Si vous tentez de le faire à partir d'un Service sur un Serveur, puis, normalement, vous n'êtes pas connecté.

Alors d'abord vous ne pouvez pas exécuter le service normal de l'utilisateur, mais plutôt comme un réel de l'utilisateur qui a des droits de connexion.Ensuite, vous devez l'ajuster les entrées de registre du service (j'ai oublié comment à l'heure actuelle, serait de trouver le code, je peux le faire ce soir si vous êtes vraiment intéressés).Enfin, vous avez à prier.

Votre plus grand à long terme des maux de tête sera avec les pilotes d'impression.Si vous êtes en cours d'exécution en tant que service, sans un utilisateur connecté, certains pilotes d'impression comme des pop up boîtes de dialogue, de temps à autre.Ce qui se passe lorsque votre imprimante est à court d'encre?Ou de papier?Le pilote peut s'afficher une boîte de dialogue qui ne sera jamais vu, et la file d'attente d'impression parce que personne n'est connecté!

Impression à partir d'un service est une mauvaise idée.Les imprimantes réseau sont connectés "par utilisateur".Vous pouvez marquer le service à exécuter en tant qu'utilisateur particulier, mais je considère qu'une mauvaise pratique en matière de sécurité.Vous pourriez être en mesure de se connecter à une imprimante locale, mais j'ai toujours hésité avant d'aller dans cette voie.

La meilleure option est d'avoir le service de stocker les données et disposez d'un utilisateur-application lancée l'impression en demandant le service pour les données.Ou un lieu commun que sont stockées les données, comme une base de données.

Si vous avez besoin d'avoir les données imprimées comme des intervalles réguliers, la configuration d'une Tâche de l'événement via le Planificateur de Tâches.Le lancement d'un processus, d'un service, il faudra connaître le nom d'utilisateur et le mot de passe, ce qui est une mauvaise pratique en matière de sécurité.

Comme pour l'impression, utilisez un outil tiers pour générer le rapport sera le plus simple.

Pour répondre à votre première question, cela peut être assez simple en fonction des données.Nous avons une variété d'applications basées sur des Services qui font exactement ce que vous demandez.Généralement, on parse le fichier entrant et envelopper notre propre Postscript ou PCL autour d'elle.Si vous la mise en page est assez simple, alors il ya quelques très de base codes PCL vous pouvez l'envelopper avec de fournir à la police/impression de pose que vous voulez (je serais ravi de vous donner quelques conseils ici en mode hors connexion).

Vous avez un prêt à imprimer le fichier, vous pouvez l'envoyer à un chemin d'accès de l'imprimante partagée, directement à une imprimante installée localement, ou encore à l'adresse IP de l'appareil (RAW ou LPR type de données).

Si, toutefois, vous allez en bas de la PDF de chemin d'accès, la méthode la plus simple est d'envoyer le fichier PDF de sortie sur une imprimante qui prend en charge impression PDF directe (beaucoup le font maintenant).Dans ce cas, il vous suffit d'envoyer le fichier PDF à l'appareil et à l'écart de l'impression.

L'autre option est de lancer Ghostscript qui devrait être gratuit pour vos besoins (vérifier les licences qu'ils ont un peu différent de la version, certains GNU, GPL, etc.) et il est construit en fonction d'impression ou simplement de convertir en Postscript et de l'envoyer à l'appareil.J'ai utilisé Ghostscript à de nombreuses reprises dans les applications des Services, mais pas un grand fan comme vous sera fondamentalement les bombardements et l'exécution d'une application en ligne de commande pour effectuer la conversion.Cela étant dit, c'est une application plus stable que ne l'ont tendance à échouer gracieusement

Cela peut ne pas être ce que vous cherchez, mais si j'avais besoin pour ce faire de quick&dirty, je voudrais:

  1. Créer une application WPF (si je pouvais utiliser l'intégré dans le document de manutention)
  2. Donner le service, la capacité à interagir avec le bureau (notez que vous n'avez pas à montrer quoi que ce soit sur le bureau, ou d'être connecté pour que cela fonctionne)
  3. Avoir le service de l'exécution de l'application, et de lui donner les données à imprimer.

Vous pourriez probablement aussi turlutte cette option pour imprimer à partir d'un navigateur web que vous exécutez à partir du service (même si je vous recommande la construction de votre propre shell, c'est à dire, plutôt que d'utiliser un navigateur complet).

Pour plus de détail (également gratuit) de la solution, votre meilleur pari est probablement manuellement le format du document vous-même (en utilisant GDI+ pour faire de la mise en page).C'est fastidieux, source d'erreurs, beaucoup de temps, et gaspille beaucoup de papier au cours du développement, mais aussi vous donne le plus de contrôle sur ce qui se passe à l'imprimante.

Si vous pouvez obtenir en sortie de post script certaines imprimantes imprimer tout ce qui se FTPed à un répertoire précis sur eux.

Nous avons utilisé pour obtenir passé l'impression de crédits que notre université exposés sur nous, mais si votre service de sorties pour un ps, alors vous pouvez simplement ftp le fichier ps à l'imprimante.

Nous sommes à l'aide de DevExpress' XtraReports pour imprimer à partir d'un service sans aucun problème.Leur modèle de rapport est similaire à celle de Windows Forms, de sorte que vous pourriez insérer dynamiquement des éléments de texte et puis le problème de la commande d'impression.

Je pense que nous allons aller à la troisième partie de l'itinéraire.J'aime le XSL -> HTML -> PDF -> Imprimante flux...Winnovative de l' HTML au format PDF semble bon pour la première partie, mais je suis en cours d'exécution dans un bloc de trouver une bonne impression PDF solution...toutes les suggestions?Idéalement, la licence serait un développeur de base, non pas sur un déployés exécution de base.

En réponse à votre question à propos de l'impression PDF, je n'ai pas trouvé une solution élégante.J'ai été "shell" ing pour Adobe qui a été peu fiables et nécessaires à un utilisateur d'être connecté en tout temps.Pour résoudre ce problème, j'ai demandé à ce que les dossiers que nous traitons (factures) être au format Tiff de plusieurs pages à la place les fichiers qui peuvent être séparées et imprimé à l'aide de maternelle .NET les fonctions d'impression.Adobe position semble être "obtenir de l'utilisateur pour afficher le fichier dans Adobe Reader et ils peuvent cliquer sur imprimer".Inutile.

Je suis toujours désireux de trouver une bonne façon de produire des rapports de qualité qui peut être transmis par le serveur web...

Impression à l'aide du Système.De dessin.L'impression n'est pas pris en charge par MS, comme par Yann Trevin de réponse.Cependant, vous pourriez être en mesure d'utiliser la nouvelle fonction de WPF, Système.L'Impression (Je pense)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top