Frage

Ich bin an einem Projekt arbeiten, gerade jetzt, das beinhaltet das empfangen einer Nachricht aus einer anderen Anwendung, die Formatierung der Inhalt der Nachricht, und senden es an einen Drucker.Die Technologie der Wahl ist in C# windows-Dienst.Die Ausgabe könnte aufgerufen werden, ein Bericht, nehme ich an, aber eine reporting-engine ist nicht notwendig.Eine einfache Template-engine, wie StringTemplate, oder sogar XSLT-Ausgabe der HTML wäre in Ordnung.Das problem das ich habe ist es, eine Kostenlose Möglichkeit zu drucken Sie diese Art von Leistung aus einem service.Da es scheint dass es funktioniert, ich arbeite an einem Prototyp mit Microsoft RDLC, das Auffüllen von einem lokalen Bericht, und dann Rendern Sie es als ein Bild, um ein Speicher-stream, die ich dann drucken.Themen sind:

  • Multi-page-Druck wird eine große Kopfschmerzen.
  • Dennoch ein PrintDocument-ausdrucken der Speicher-stream, der nicht unterstützt wird in einem Windows-Dienst (auch wenn es vielleicht funktionieren - noch nicht so weit gekommen mit dem Prototyp noch)
  • Wenn die Daten kommen über änderungen muss ich ändern das dataset und die Klasse, die die Daten deserialisiert in.bad bad bad.

Hat jemand zu tun hatte, auch nur im entferntesten wie das?Irgendwelche Ratschläge?Ich habe bereits gepostet eine Frage über das drucken von HTML, ohne die Benutzer zu Eingang, und nachdem verschwenden zu 3 Tagen auf, dass ich zu dem Schluss gekommen, dass es nicht getan werden kann, zumindest nicht mit dem frei verfügbaren tool.

Alle Hilfe wird geschätzt.

EDIT:Wir sind auf der version 2.0 des .NET-framework.

War es hilfreich?

Lösung

Vertrauen Sie mir, Sie werden mehr Geld ausgeben, versuchen, zu suchen/eine Lösung entwickeln, die für diese im Vergleich zum Kauf einer Dritten Komponente.Nicht das Rad neu erfinden und gehen Sie für die kostenpflichtige Lösung.

- Druck ist ein Komplexes problem, und ich würde lieben zu sehen, wie der Tag, wenn es bessere framework-Unterstützung Hinzugefügt für diese.

Andere Tipps

Drucken von einem Windows-Dienst ist wirklich schmerzhaft.Es scheint zu funktionieren...manchmal...aber endlich ist es craches oder löst eine Ausnahme aus, die von Zeit zu Zeit ohne klaren Grund.Es ist wirklich hoffnungslos.Offiziell ist es noch nicht unterstützt, ohne Erklärung, noch ein Vorschlag für eine Alternative Lösung.

Kürzlich wurde ich konfrontiert mit dem problem, und nach mehreren erfolglosen versuchen und Experimenten, kam ich schließlich mit zwei praktikable Lösungen:

  • Schreiben Sie Ihre eigenen Druck-DLL mit der Win32-API (in C/C++ zum Beispiel), dann benutzen Sie es von Ihrem service-mit P/Invoke (funktioniert einwandfrei)
  • Schreiben Sie Ihren eigenen Druck von COM+ - Komponente, dann verwendet Sie von Ihrem service.Ich habe diese Lösung gewählt, mit Erfolg, vor kurzem (es war aber die Dritte Partei, die COM+ - Komponente, nicht selbst geschrieben), Es funktioniert absolut in Ordnung.

Ich habe es getan.Es ist ein Schmerz in der A*s.Das problem ist, dass das drucken erfordert, dass GDI-Motor in Ort, die normalerweise bedeutet, dass Sie haben, um den desktop, die nur geladen, wenn Sie angemeldet sind.Wenn Sie versucht sind, dies zu tun von einem Dienst auf einem Server, dann werden Sie normalerweise nicht eingeloggt.

So kann man zuerst nicht laufen wie die normalen service-Benutzer, sondern als echte Benutzer mit interaktiven login-Rechte.Dann müssen Sie zwicken die service registry-Einträge (ich habe vergessen, wie im moment, würde finden müssen, um die code, die kann ich heute Abend tun, wenn Sie wirklich interessiert sind).Schließlich, Sie haben zu beten.

Ihre größte langfristige Kopfschmerzen werden mit drucken-Treiber.Wenn Sie als Dienst ausgeführt wird, ohne dass ein Benutzer eingeloggt ist, können einige Druckertreiber wie pop-up-Dialoge, die von Zeit zu Zeit.Was passiert, wenn Ihr Drucker toner?Oder Papier?Der Fahrer kann ein pop-up-dialog, der niemals gesehen werden, und halten Sie die Drucker-Warteschlange da ist niemand angemeldet!

Drucken von einem service ist eine schlechte Idee.Netzwerk-Drucker angeschlossen sind "pro-user".Sie können markieren Sie den Dienst unter einem bestimmten Benutzerkonto ausgeführt, aber ich würde erwägen, dass eine schlechte Sicherheitspraxis.Sie könnten in der Lage sein, eine Verbindung zu einem lokalen Drucker, aber ich würde immer noch zögern, bevor Sie diesen Weg gehen.

Die beste option ist, um den Dienst zu speichern die Daten und eine vom Benutzer gestartete Anwendung tun die Druck, indem er die service für die Daten.Oder eine gemeinsame Stelle, die die Daten gespeichert werden, wie eine Datenbank.

Wenn Sie benötigen die darauf abgedruckten Daten, wie regelmäßigen Abständen, setup-eine Aufgabe, die Veranstaltung durch den Task-Scheduler.Starten eines Prozesses von einer-Dienst benötigen, zu wissen, den Benutzernamen und das Kennwort, die wiederum die schlechten Sicherheit der Praxis.

Als der Druck selbst, verwenden Sie ein Drittanbieter-tool, um den Bericht zu generieren, wird das einfachste sein.

Zur Beantwortung Ihrer ersten Frage, das kann ziemlich geradlinig abhängig von den Daten.Wir haben eine Vielzahl von Service-basierten Anwendungen, die genau das tun, was Sie Fragen.In der Regel, wir analysieren die eingehende Datei und wickeln unserer eigenen Postscript-oder PCL-um ihn herum.Wenn Sie das layout ist ziemlich einfach, dann gibt es einige sehr grundlegende PCL-codes Sie können wickeln Sie es mit der schriftart/print-layup Sie möchten (ich wäre mehr als glücklich, Ihnen einige Hinweise hier offline).

Eines haben Sie eine druckfertige Datei, die Sie senden können, um einem UNC-Drucker, der freigegeben ist, direkt auf eine lokal installierte Drucker, oder auch die IP des Gerätes (RAW oder LPR-Daten).

Wenn, jedoch, Sie gehen hinunter den PDF-Pfad, die einfachste Methode ist zu senden Sie die PDF-Ausgabe zu einem Drucker, unterstützt, direkter PDF-Druck (viele jetzt tun).In diesem Fall senden Sie einfach das PDF auf dem Gerät entfernt und druckt es.

Die andere option ist das starten von Ghostscript die frei sein sollte für Ihre Bedürfnisse (aktivieren Sie die Lizenzierung, wie Sie ein paar verschiedene version, einige GNU, manche GPL etc.) und verwenden Sie entweder den integrierten drucken-Funktion oder einfach zu konvertieren von Postscript und senden an das Gerät an.Ich habe Ghostscript viele Male in Service-apps aber nicht ein großer fan, wie Sie im Grunde Beschuss aus und Ausführung einer Befehlszeile app, um die Konvertierung zu tun.That being said, es ist eine stabile app, die nicht dazu neigen, richtig scheitern

Dies kann nicht sein, was Sie suchen für, aber wenn ich musste das tun, quick&dirty, würde ich:

  1. Erstellen Sie eine separate WPF-Anwendung (so könnte ich die built-in-Dokument-handling)
  2. Geben Sie dem Dienst die Interaktion mit dem desktop (beachten Sie, dass Sie nicht wirklich haben, um zu zeigen, dass etwas auf dem desktop, oder eingeloggt sein, damit dies funktioniert)
  3. Das service-führen Sie die Anwendung, und geben Sie die zu druckenden Daten.

Sie könnten wahrscheinlich auch jigger das drucken von einem Webbrowser aus, dass Sie von den service (obwohl ich empfehlen würde, bauen Sie Ihre eigenen shell-DH, anstatt eine vollständige browser).

Für eine detailliertere (auch Kostenlose) Lösung, Ihre beste Wette ist wahrscheinlich manuell formatieren Sie das Dokument selbst (mithilfe von GDI+, um das layout für Sie).Das ist mühsam, fehleranfällig, zeitaufwendig und verschwendet viel Papier während der Entwicklung, sondern gibt Ihnen auch die Kontrolle darüber, was zum Drucker.

Wenn Sie die Ausgabe in post script einige Drucker druckt alles, was FTPed in einem bestimmten Verzeichnis auf Sie.

Wir haben dieses in der Vergangenheit in der print-credits, die unsere Universität ausgestellt auf uns, aber wenn Ihr service-Ausgänge an einem ps dann können Sie einfach die ftp-ps-Datei an den Drucker.

Wir sind mit DevExpress' XtraReports drucken von einem Dienst ohne Probleme.Ihr Bericht Modell ist ähnlich wie bei Windows Forms -, so könnte man dynamisch einfügen, text-Elemente, und geben Sie dann den Befehl drucken.

Ich denke, wir sind gehen, die Dritte route.Ich mag die XSL -> HTML -> PDF -> Drucker-flow...Winnovative s HTML-zu-PDF - sieht gut aus für den ersten Teil, aber ich bin in einem block der Suche nach einem guten PDF-Druck-Lösung...irgendwelche Vorschläge?Idealerweise wird die Lizenz auf einem Entwickler-basis, nicht auf eine bereitgestellte runtime basis.

In Antwort auf Ihre Frage zu PDF-Druck, ich habe nicht gefunden, eine elegante Lösung.Ich war "shell" ing aus, um Adobe die war unzuverlässig und benötigt ein Benutzer angemeldet zu sein zu allen Zeiten.Um dieses problem zu lösen, habe ich beantragt, dass die Dateien, die wir verarbeiten (Rechnungen) formatiert werden als multi-page-Tiff-Dateien, stattdessen werden kann split auseinander, und gedruckt mit einheimischen .NET Druck-Funktionen.Adobe position zu sein scheint "Holen Sie sich die Benutzer zum anzeigen der Datei in Adobe Reader und klicken Sie auf "drucken".Nutzlos.

Ich bin immer noch daran interessiert, finden eine gute Möglichkeit der Herstellung von Qualitäts-reports, welche ausgegeben werden von dem web-server...

Drucken mithilfe von System.Zeichnung.Druck ist nicht unterstützt durch MS pro Yann Trevin Antwort.Jedoch, Sie könnte in der Lage sein zu verwenden die neue WPF-basierten System.Drucken (Ich denken)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top