Imprimarea de la un serviciu .NET

Lucrez acum la un proiect care implică primirea unui mesaj de la o altă aplicație, formatarea conținutului acelui mesaj și trimiterea acestuia la o imprimantă. Tehnologia de alegere este serviciul de ferestre C #. Rezultatul ar putea fi numit un raport, presupun, dar un motor de raportare nu este necesar. Un motor simplu de template, cum ar fi StringTemplate, sau chiar XSLT care iese HTML ar fi bine. Problema pe care o am este găsirea unei modalități libere de a tipări acest tip de ieșire dintr-un serviciu. Din moment ce pare că va funcționa, lucrez la un prototip folosind RDLC-ul Microsoft, populând un raport local și apoi redat ca o imagine într-un flux de memorie, pe care apoi îl voi imprima. Problemele cu care sunt:

  • Imprimarea pe mai multe pagini va fi o durere de cap mare.
  • Trebuie să utilizați încă PrintDocument pentru a imprima fluxul de memorie, care nu este suportat într-un serviciu Windows (deși poate funcționa - nu a ajuns încă cu prototipul încă)
  • În cazul în care datele trec peste modificări, trebuie să modific setul de date și clasa în care datele sunt deserializate. rău rău rău.

A trebuit cineva să facă ceva de la distanță de genul asta? Vreun sfat? Am pus deja o întrebare cu privire la tipărirea codului HTML fără intrarea utilizatorului, iar după ce am pierdut cam 3 zile în această privință, am ajuns la concluzia că nu se poate face, cel puțin nu cu orice instrument disponibil în mod gratuit.

Toate ajutoarele sunt apreciate.

EDIT: Suntem pe versiunea 2.0 a cadrului .NET.

0
fr hi bn

10 răspunsuri

I think we are going to go the third party route. I like the XSL -> HTML -> PDF -> Printer flow... Winnovative's HTML to PDF looks good for the first part, but I'm running into a block finding a good PDF printing solution... any suggestions? Ideally the license would be on a developer basis, not on a deployed runtime basis.

0
adăugat

Credeți-mă, veți cheltui mai mulți bani încercând să căutați/dezvoltați o soluție pentru aceasta în comparație cu cumpărarea unei componente terțe. Nu reinventați roata și mergeți la soluția plătită.

Imprimarea este o problemă complexă și mi-ar plăcea să văd ziua când se adaugă un sprijin mai bun pentru acest lucru.

0
adăugat

Imprimarea de pe un serviciu Windows este într-adevăr dureroasă. Se pare că funcționează uneori ... dar, în cele din urmă, se cade sau se aruncă o excepție din când în când, fără nici un motiv clar. Este cu adevărat fără speranță. Oficial, este chiar nu este acceptat , fără nici o explicație, nici o propunere pentru o soluție alternativă.

Recent, m-am confruntat cu problema și, după mai multe încercări și experimente nereușite, am ajuns în cele din urmă cu două soluții viabile:

  • Scrieți propriul DLL de imprimare utilizând API-ul Win32 (de exemplu în C/C ++), apoi utilizați-l din serviciul dvs. cu P/Invoke (funcționează bine)
  • Scrieți propria componentă de imprimare COM +, apoi o utilizați de la serviciul dvs. Am ales această soluție cu succes recent (dar a fost o componentă de COM + a treia parte, nu este scrisă în sine). Funcționează absolut deloc.
0
adăugat
GDI + nu a fost niciodată proiectat/testat pentru a funcționa în contextul serviciului. De aceea nu funcționează. Ar trebui să utilizați GDI și funcția de a desena. Consultați acest document pentru a găsi apeluri echivalente Win32: msdn.microsoft.com/ en-ne/biblioteca/& hellip;
adăugat autor Signcodeindie, sursa

Dacă puteți ieși la post script, unele imprimante vor imprima orice pe care le primește FTPed la un anumit director pe ele.

Am folosit acest lucru pentru a trece prin creditele imprimate pe care universitatea noastră le-a expus la noi, dar dacă serviciul dvs. trimite un ps, atunci puteți să transferați fișierul ps către imprimantă.

0
adăugat

Folosim DevExpress 'XtraReports pentru a imprima dintr-un serviciu fără probleme. Modelul lor de raport este similar cu cel din Windows Forms, astfel încât să puteți insera dinamic elemente de text și apoi să emiteți comanda de tipărire.

0
adăugat

Imprimarea dintr-un serviciu este o idee proastă. Imprimantele de rețea sunt conectate "per-utilizator". Puteți marca serviciul care va fi rulat ca utilizator particular, dar aș considera o practică serioasă de securitate. S-ar putea să vă conectați la o imprimantă locală, dar încă aș mai ezita înainte de a merge pe acest traseu.

Cea mai bună opțiune este ca serviciul să stocheze datele și să aibă o aplicație lansată de utilizator să facă imprimarea solicitând serviciului datele. Sau o locație obișnuită pe care datele sunt stocate, cum ar fi o bază de date.

Dacă trebuie să aveți datele tipărite la intervale regulate, configurați un eveniment Task prin intermediul Schedulerului de activități. Lansarea unui proces dintr-un serviciu va necesita cunoașterea numelui de utilizator și a parolei, ceea ce din nou este o practică de securitate defectuoasă.

În ceea ce privește tipărirea însăși, folosiți un instrument terț pentru a genera raportul va fi cel mai simplu.

0
adăugat

Am terminat. Este o durere în A * s. Problema este că imprimarea necesită existența unui motor GDI, ceea ce în mod normal înseamnă că trebuie să aveți desktopul, care se încarcă numai când sunteți conectat. Dacă încercați să faceți acest lucru dintr-un serviciu pe un server, atunci în mod normal nu sunteți conectat (ă).

Deci, mai întâi nu puteți rula ca utilizator de serviciu obișnuit, ci ca un utilizator real care are drepturi interactive de conectare. Apoi, trebuie să modificați înregistrările din registrul de servicii (uit cum, în momentul de față, va trebui să găsesc codul pe care îl pot face în seara asta dacă sunteți interesat). În cele din urmă, trebuie să te rogi.

Cea mai mare durere de cap pe termen lung va fi cu driverele de imprimare. Dacă rulați ca un serviciu fără un utilizator înregistrat, unii drivere de imprimare ar dori ca din când în când să deschidă dialoguri. Ce se întâmplă când imprimanta nu are toner? Sau din hârtie? Șoferul poate afișa un dialog care nu va fi văzut niciodată și să țineți coada de așteptare pentru că nimeni nu este conectat!

0
adăugat

Pentru a răspunde la prima întrebare, acest lucru poate fi destul de drept înainte, în funcție de date. Avem o varietate de aplicații bazate pe servicii care fac exact ceea ce cereți. În mod tipic, analizăm fișierul de intrare și înfășurăm propriile Postscript sau PCL în jurul acestuia. Dacă aspectul este destul de simplu, atunci există câteva coduri PCL foarte importante pe care le puteți împacheta pentru a furniza layup-ul de tipărire/imprimare dorit (aș fi mai mult decât bucuros să vă dau câteva sfaturi offline aici).

Unul dintre ele are un fișier pregătit pentru imprimare pe care îl puteți trimite la o imprimantă UNC care este partajată, direct la o imprimantă instalată local sau chiar la adresa IP a dispozitivului (date de tip RAW sau LPR).

Dacă, totuși, căutați calea PDF, cea mai simplă metodă este să trimiteți ieșirea PDF unei imprimante care acceptă imprimarea directă PDF (multe dintre ele fac acum). În acest caz, trebuie doar să trimiteți fișierul PDF pe dispozitiv și să îl imprimați.

Cealaltă opțiune este de a lansa Ghostscript care ar trebui să fie gratuit pentru nevoile dvs. (verificați licențierea deoarece acestea au o versiune diferită, unele GNU, unele GPL etc.) și fie că este folosită pentru a fi construită în funcție de imprimare, fie pur și simplu pentru a converti în Postscript și a le trimite la dispozitiv. Am folosit Ghostscript de multe ori în aplicațiile Service, dar nu și un fan imens, deoarece practic va fi scoaterea din afară și executarea unei aplicații de linie de comandă pentru a face conversia. Acestea fiind spuse, este o aplicație stabilă care tind să eșueze grațios

0
adăugat

This may not be what you're looking for, but if I needed to do this quick&dirty, I would:

  1. Creați o aplicație wpf separată (așadar, am putea utiliza manipularea încorporată a documentelor)
  2. Oferiți serviciului capacitatea de a interacționa cu spațiul de lucru (rețineți că nu trebuie să afișați nimic pe desktop sau să fiți conectat pentru ca acesta să funcționeze)
  3. Au serviciul să ruleze aplicația și să îi dea datele de imprimat.

Ați putea, de asemenea, să jigger acest lucru pentru a imprima de la un browser web pe care îl rulați de la serviciu (deși aș recomanda construirea propriului IE shell, mai degrabă decât folosind un browser complet).

Pentru o soluție mai detaliată (și gratuită), cel mai bun pariu este probabil formatarea manuală a documentului manual (utilizând GDI + pentru a face aspectul pentru dvs.). Acest lucru este obositor, predispus la erori, consumă mult timp și scade o mulțime de hârtie în timpul dezvoltării, dar vă oferă și cel mai mult control asupra a ceea ce se întâmplă cu imprimanta.

0
adăugat

Imprimarea utilizând System.Drawing.Printing nu este acceptat de MS, conform răspunsului lui Yann Trevin. Cu toate acestea, s-ar putea să utilizați noua versiune System.Printing (I think ) bazată pe WPF,

0
adăugat