Stampa automatica su più stampanti

Ciao,
in una applicazione di gestione della produzione mi è capitato di dover lanciare delle stampe in automatico su stampanti diverse.
Più in dettaglio, al termine di una produzione su una linea, deve essere lanciata la stampa dell’etichetta collegata alla produzione stessa e in ogni linea di produzione è collegata una stampante diversa.

La parte di creazione del pdf dell’etichetta da parte di IDF è relativamente semplice. In prima battuta usavo l’OnCommand, chiamato tramite URL dallo SCADA collegato ai PLC delle linee di produzione, ora invece ho un timer IDF che monitora una o più tabelle dove sempre lo SCADA scrive un record per ogni etichetta da stampare.
Quindi, in entrambi i casi, IDF crea il PDF dell’etichetta e lo posiziona in una cartella. Ho definito una cartella per ogni coda di stampa (stampante). Mi sono ovviamente creato una tabella di database con l’associazione Linea di produzione → Coda di stampa (cartella).

E qui è arrivata la parte difficile (almeno per me): una volta che il file PDF viene creato nella cartella della coda di stampa, poi come faccio a stamparlo?

Analizzando le varie opzioni, tra cui anche dei software a pagamento, ho deciso di creare un servizio windows che monitora le cartelle delle code di stampa e invia i file PDF alle stampanti.

Per monitorare le cartella uso la classe .NET FileSystemWatcher

System.IO.FileSystemWatcher

mentre per effettuare la stampa dei PDF uso la libreria PdfToPrinter

PDFtoPrinter for Windows
GitHub - svishnevsky/PDFtoPrinter: .Net Wrapper over PDFtoPrinter util allows to print PDF files.

Tutte le stampanti dovranno essere configurate sul server stesso e il loro “nome” verrà utilizzato nel file di configurazione del servizio windows per collegarle alla coda di stampa.
Questo è un esempio del file di configurazione in formato JSON:

[
	{
		"Folder": "C:\\temp\\IndePrintMonitor\\CodaStampanteLinea1",
		"Printer": "Brother HL-L6400DW Linea 1"
	}, 
	{
		"Folder": "C:\\temp\\IndePrintMonitor\\CodaStampanteLinea2",
		"Printer": "Brother HL-L6400DW Linea 2"
	}, 
	{
		"Folder": "C:\\temp\\IndePrintMonitor\\CodaStampanteLinea3",
		"Printer": "Brother HL-L6400DW Linea 3"
	}, 	
]

Io ho usato questo metodo in un ambito di produzione, ma può sicuramente essere usato anche in ambito gestionale dove devono essere inviate delle stampe senza interazione dell’utente o su stampanti non di “default”.

Senza dilungarmi nei tecnicismi vi allego il progetto Visual Studio del servizio IndePrintMonitor.

Rimango ovviamente a disposizione per chiarimenti.

Francesco

5 Mi Piace

Torno a ringraziare @francesco.guarnotta per le informazioni condivise anche in questo articolo, avanti così!

1 Mi Piace