using Microsoft.Reporting.WinForms; using SteamWare.IO; using SteamWare.Logger; using SteamWare.Reports; using System; using System.Collections.Generic; using System.Data; using System.Drawing.Imaging; using System.Drawing.Printing; using System.IO; using System.Text; namespace MagData { /// /// Classe che si occupa di stampare report da reportViewer via printer remota /// public class reportPrinter { #region Private Fields private int m_currentPageIndex; /// /// stream del report... /// private IList m_streams; #endregion Private Fields #region Protected Fields protected bool doPdfCopy = false; protected int logLevel = 0; #endregion Protected Fields #region Public Fields /// /// singleton pubblico /// public static reportPrinter obj = new reportPrinter(); #endregion Public Fields #region Protected Constructors /// /// oggetto protected /// /// protected reportPrinter() { logLevel = memLayer.ML.CRI("_logLevel"); doPdfCopy = memLayer.ML.CRB("doPdfCopy"); } #endregion Protected Constructors #region Private Methods /// /// ciclo da fornire al renderizzatore dei report, per salvare 1 immagine da ogni pagina del report /// /// /// /// /// /// /// private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { // creo files con nomi univoci... string filePathName = string.Format(@"~\temp\{0}_{1:HHmmss}_{1:ffff}.{2}", name, DateTime.Now, fileNameExtension); Stream stream = new FileStream(fileMover.getFilePath(filePathName), FileMode.Create); //Stream stream = new FileStream(fileMover.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); m_streams.Add(stream); return stream; } /// /// ciclo da fornire al renderizzatore dei report, per salvare 1 pdf da ogni pagina del report /// /// /// /// /// /// /// private Stream CreateStreamPdf(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { // creo Directory se non c'è fileMover fm = new fileMover(string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\", memLayer.ML.confReadString("PdfFolder"), DateTime.Now), ""); fm.checkDir(); string pdfPathName = string.Format(@"{0}\{1:yyyy}\{1:MM}\{1:dd}\{2}_{1:HHmmss}_{1:ffff}.{3}", memLayer.ML.confReadString("PdfFolder"), DateTime.Now, name, fileNameExtension); //Stream stream = new FileStream(fileMover.getFilePath(@"~\temp\" + name + "." + fileNameExtension), FileMode.Create); Stream stream = new FileStream(fileMover.getFilePath(pdfPathName), FileMode.Create); m_streams.Add(stream); return stream; } /// /// esegue print vero e proprio /// /// /// /// private void doEmfPrint(string printerName, LocalReport report, string deviceInfo) { // export in EMF Export(report, deviceInfo); m_currentPageIndex = 0; // stampo Print(printerName); // do dispose? Dispose(); } /// /// effettua stampa in PDF dei vari report in una cartella Anno/Mese/Giorno /// /// /// private void doLocalPdfPrint(LocalReport report, string deviceInfo) { // export in PDF ExportPDF(report, deviceInfo); m_currentPageIndex = 0; // do dispose? Dispose(); } /// /// Export del report come EMF (Enhanced Metafile) file. /// /// private void Export(LocalReport report, string deviceInfo) { Warning[] warnings; m_streams = new List(); report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) { stream.Position = 0; } } /// /// Export del report come PDF file. /// /// private void ExportPDF(LocalReport report, string deviceInfo) { Warning[] warnings; m_streams = new List(); report.Render("PDF", deviceInfo, CreateStreamPdf, out warnings); foreach (Stream stream in m_streams) { stream.Position = 0; } } /// /// funzione di stampa... /// private void Print(string printerName) { //const string printerName = "Microsoft Office Document Image Writer"; //const string printerName = "Brother HL-2170W series"; if (m_streams == null || m_streams.Count == 0) { return; } PrintDocument printDoc = new PrintDocument(); printDoc.PrinterSettings.PrinterName = printerName; if (!printDoc.PrinterSettings.IsValid) { Logging.Instance.Error($"Impostazioni non valide per la stampante {printerName}"); return; } printDoc.PrintPage += new PrintPageEventHandler(PrintPage); printDoc.Print(); } /// /// Handler per PrintPageEvents /// /// /// private void PrintPage(object sender, PrintPageEventArgs ev) { Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); ev.Graphics.DrawImage(pageImage, ev.PageBounds); m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } #endregion Private Methods #region Public Methods /// /// dispone l'applicazione e rilascia le risorse /// public void Dispose() { if (m_streams != null) { foreach (Stream stream in m_streams) { stream.Close(); } m_streams = null; } } /// /// effettua pulizia della cartella temp x i files più vecchi di X ore (web.config) /// public void pulisciDir() { // num max ore di età x files "vecchi" da tenere in temp area... int maxOre = memLayer.ML.CRI("maxAgeTempAreaHours"); int eliminati = 0; // ottengo elenco files *.emf fileMover.obj.setDirectory(@"~\temp\"); FileInfo[] _fis = fileMover.obj.elencoFiles_FI("*.emf"); bool fatto = false; foreach (FileInfo _file in _fis) { if (_file.CreationTime < DateTime.Now.AddHours(-maxOre)) // elimino files vecchi... { fatto = fileMover.obj.eliminaFile(_file); if (fatto) { Logging.Instance.Info(String.Format("Eliminato file {0}", _file.Name)); eliminati++; } } } // salvo il log degli update if (eliminati > 0) { Logging.Instance.Info(String.Format("Eliminati {0} files temporanei da area temp", eliminati)); } } /// /// Effettua la stampa del documento indicato /// /// tipo di documento dastampare /// coda di stampa da utilizzare /// Chiave del documento /// public bool stampaReport(tipoDocumento documento, string printerName, string keyParam) { bool answ = false; MagDataLayer dtProx = new MagDataLayer(); // gestione coda stampa... // incomincio con gestione della coda di stampa... inserisco in tab la richiesta di stampa... if (memLayer.ML.CRB("disable_singleton")) { dtProx.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); } else { MagDataLayer.man.taPJQ.insertQuery(documento.ToString(), keyParam, printerName); } return answ; } #endregion Public Methods } }