Domanda

Sto provando a stampare su stampanti Dot Matrix (vari modelli) da C #, attualmente sto usando le API Win32 (puoi trovare molti esempi online) per inviare codici di escape direttamente alla stampante dal mio C # applicazione. Funziona benissimo, ma ...

Il mio problema è che sto generando i codici di escape e non facendo affidamento sul sistema di stampa di Windows, le stampe non possono essere inviate a nessun "normale". stampanti o cose come driver di stampa PDF. (Questo sta causando un problema mentre stiamo provando a utilizzare l'applicazione su un Terminal Server 2008 utilizzando Easy Print [che è basato su XPS])

La domanda è: Come posso stampare documenti formattati (fatture su supporti prestampati) su stampanti Dot Matrix (Epson, Oki e Panasonic ... vari modelli) da C # senza usare la stampa diretta, codici di escape ecc.

** Giusto per chiarire, sto provando cose come GDI + (System.Drawing.Printing) ma il problema è che è molto difficile far allineare le cose come faceva il vecchio codice. (Il vecchio codice ha inviato i caratteri direttamente alla stampante bypassando il driver di Windows.) Qualche suggerimento su come le cose potrebbero essere migliorate in modo che possano usare GDI + ma si allineano come il vecchio codice?

È stato utile?

Soluzione

Probabilmente dovresti usare uno strumento di reporting per creare modelli che consentano a te o agli utenti di posizionare correttamente i campi rispetto alla carta da lettere prestampata.

Usando le stampanti ad aghi, in pratica devi lavorare in una delle 2 modalità:

  • semplice modalità di scrittura del testo di riga / colonna in cui si inviano sequenze di escape per gestire un numero ridotto di caratteri inclusi nell'hardware della stampante e che devono gestire i ritorni di riga, ecc.
  • output grafico in cui la pagina viene rasterizzata e il driver della stampante guida semplicemente la testina di stampa e i perni per generare i punti.

Il primo utilizzo è per lo più deprecato in Windows poiché non offre molto in termini di controllo dell'output e ogni stampante con le sue caratteristiche diventa ingombrante e difficile per il software prevedere e posizionare le cose sulla pagina (no WYSIWYG).

Il secondo utilizza solo un paradigma di una pagina grafica che rende il posizionamento di testo e grafica indipendente dalle effettive capacità della stampante.
Quando si utilizza la cancelleria prestampata, il lavoro viene svolto per posizionare correttamente i dati sulla pagina.
Fare questo a mano è dispendioso in termini di risorse e la creazione del layout in codice non è certamente consigliata poiché rimarrai bloccato con il codice per cambiare in caso di modifica della stampante, del formato della pagina o della cancelleria stampata.

La cosa migliore è usare semplicemente il modello di stampa standard offerto da .Net e uno strumento di reporting che ti consenta di definire modelli e modelli in cui posizionare il testo e la grafica corretti, e quindi guidarli dal codice.

Visual Studio viene fornito con una versione di Crystal Reports ma esistono altri sistemi di reportistica migliori (io uso quello di developer express ad esempio), alcuni di essi sono persino gratuiti .

Altri suggerimenti

Dalla mia esperienza, è più facile utilizzare due tipi di rapporti per gli stessi dati:

  • è richiesto un rapporto per le stampanti ad aghi che utilizzano codici di escape e qualsiasi altra cosa, che viene salvato in un file di testo e quindi stampato con vari metodi ( type file.txt > lpt1 o selezionando nel codice la stampante predefinita e usando NOTEPAD / P file.txt ) - vedi questa pagina per più metodi di stampa.
  • un altro report per stampanti laser / inkjet che utilizzano uno strumento per la creazione di report (Crystal Reports, Gestione report , < a href = "http://rlib.sicompos.com/" rel = "nofollow noreferrer"> RLIB o qualsiasi altro oggetto disponibile)

Poiché non è raro acquistare il giusto tipo di stampante per il giusto tipo di report, questo approccio ha il vantaggio di consentire al cliente di decidere: stampante ad aghi per report di testo in formato carta A3 / A4 (di solito per la contabilità dipartimento) o stampante laser / inkjet per report grafici.

Non so come usare la sequenza di escape in C #. Ma ho tutta la sequenza di escape per stampante generico / solo testo. Spero che sia d'aiuto.

Sequenza di escape di stampa generica 1) Imposta interlinea a) 1/8 di pollice - 27,48 b) 1/6 pollici - 27,50

2) Seleziona Qualità bozza a) 27.120,0 / 27.120,48

3) Qualità delle lettere a) 27.120,1 / 27.120,49

4) Doppia altezza a) 27.119, n i) n = 1 attivo ii) n = 0 No

5) Stampa bidirezionale a) 27,85, n i) 0 - In entrambe le direzioni ii) 1 - One Way

6) Aumenta lo spazio dei caratteri a) 27,32, n (aumento di n / 12 pollici)

7) Seleziona Carattere grassetto a) 27,69

8) Annulla carattere grassetto a) 27,70

9) Seleziona il carattere corsivo a) 27,52

10) Annulla carattere corsivo a) 27,53

11) Seleziona a) 10cpi 27,8 b) 12cpi 27,77 c) 15cpi 27.103 d) 18cpi 27.103

12) Imposta il margine destro a) 27,81, n

13) Imposta margine sinistro a) 27.108, n

14) Feed modulo a) 12

15) Stampa condensata a) 0F Acceso b) 12 Off

16) Stampa a doppio colpo a) 27,71

17) Annulla stampa con sciopero a) 27,72

18) Sotto la linea a) 27,45,0 di sconto b) 27,45,1 On

19) Doppia larghezza a) 27,84,0 di sconto b) 27,84,1 ON

Prima converti i comandi della sequenza in carattere, quindi passa alla stampante

Esempio di carattere grassetto 27,69

string.Format (" {0} {1} ", Convert.ToChar (27), Convert.ToChar (69));

Forse un po 'più breve di:

string.Format (" {0} {1} ", (char) (27), (char) (69));

Dai un'occhiata al System.Drawing.Printing spazio dei nomi.

Se la stampante ha un driver da installare, è possibile utilizzare il normale sistema di stampa Windows. La maggior parte delle stampanti, comprese quelle POS, dispongono di driver Windows funzionanti. (La maggior parte delle stampanti ad aghi sono comunque compatibili con Epson.) Alcuni driver di stampante POS consentono di inviare codici di escape direttamente anche alla stampante (utilizzando caratteri speciali); probabilmente non hai bisogno di tale funzionalità.

In caso contrario, è possibile aggiungere la stampante (driver) generico / solo testo con l'aiuto dell'Installazione guidata stampante. Una volta fatto, è possibile configurare determinati comandi (sequenze di escape) per esso - Dimensione carattere 10/12/17, Grassetto on / off, Sottolineato on / off, inizio / fine lavoro, avanzamento carta e selezione formato.

Sto usando la stampante generica associata alla porta FILE per testare vari rapporti per le stampanti POS - è facile guardare il file di testo per convalidare i numeri nella stampa. Naturalmente per la formattazione è necessario un driver di stampante specifico.

Sembra che ciò che vorrei fare non fosse possibile.

Le mie scelte per la stampa sono non gestite direttamente dalla stampa della stampante (usando winspool.drv) che mi permette di fare tutto ciò che mi piace alla stampante e mi permette di allineare facilmente le cose. Esempio VB.NET Oppure posso usare GDI + (System.Drawing.Printing) che è complicato da ottenere cose da allineare ma funzionerà con stampanti non a matrice di punti come stampanti XPS e PDF.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top