using System; using System.IO; using System.Data; using System.Text; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Collections.Generic; using System.Windows.Forms; using Microsoft.Reporting.WinForms; public class stampaSchedaIdent : IDisposable { private int m_currentPageIndex; private IList m_streams; /// /// carica i dati richiesti dal report dalla StoredProcedure (filtrando quindi...) /// /// /// private DataTable caricaDati(string idxObj) { PrintLocalReport.DS_applicazioneTableAdapters.sp_schedaIdentTableAdapter taSp = new PrintLocalReport.DS_applicazioneTableAdapters.sp_schedaIdentTableAdapter(); return (DataTable)taSp.GetData(idxObj); } /// /// 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) { Stream stream = new FileStream(@"..\..\" + name + "." + fileNameExtension, FileMode.Create); m_streams.Add(stream); return stream; } /// /// Export del report come EMF (Enhanced Metafile) file. /// /// private void Export(LocalReport report) { string deviceInfo = "" + " EMF" + " 25cm" + " 17.6cm" + " 0.2cm" + " 0.2cm" + " 0.2cm" + " 0.2cm" + ""; Warning[] warnings; m_streams = new List(); report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) stream.Position = 0; } /// /// 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); } /// /// funzione di stampa... /// private void Print() { //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) { string msg = String.Format( "Can't find printer \"{0}\".", printerName); MessageBox.Show(msg, "Print Error"); return; } printDoc.PrintPage += new PrintPageEventHandler(PrintPage); printDoc.Print(); } // Create a local report for Report.rdlc, load the data, // export the report to an .emf file, and print it. private void Run(string idxObjRich) { LocalReport report = new LocalReport(); report.ReportPath = @"..\..\ReportSchedaIdentificazione.rdlc"; report.DataSources.Add(new ReportDataSource("Equa", caricaDati(idxObjRich))); ReportParameter[] idxObj = { new ReportParameter("IdxObj", idxObjRich) }; report.SetParameters(idxObj); Export(report); m_currentPageIndex = 0; Print(); } /// /// 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; } } public static void Main(string[] args) { using (stampaSchedaIdent stampaScheda = new stampaSchedaIdent()) { stampaScheda.Run(args[0]); } } }