using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Diagnostics;
namespace PrintTest
{
public class ReportPrint
{
private int m_currentPageIndex;
private IList<Stream> m_streams;
/// <summary>
/// 建立流
/// </summary>
/// <param name="name"></param>
/// <param name="fileNameExtension"></param>
/// <param name="encoding"></param>
/// <param name="mimeType"></param>
/// <param name="willSeek"></param>
/// <returns></returns>
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;
}
/// <summary>
///
/// </summary>
/// <param name="report"></param>
private void Export(LocalReport report)
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
//" <PageWidth>8.5in</PageWidth>" +
//" <PageHeight>11in</PageHeight>" +
//" <MarginTop>0.25in</MarginTop>" +
//" <MarginLeft>0.25in</MarginLeft>" +
//" <MarginRight>0.25in</MarginRight>" +
//" <MarginBottom>0.25in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
try
{
report.Render("Image", deviceInfo, CreateStream, out warnings);
}
catch (Exception ex)
{
Exception innerEx = ex.InnerException;//get the InnerException
while (innerEx != null)
{
MessageBox.Show(innerEx.ToString());
innerEx = innerEx.InnerException;
}
throw innerEx;
}
foreach (Stream stream in m_streams)
stream.Position = 0;
}
/// <summary>
/// Print the event handler function
/// </summary>
/// <param name="sender"></param>
/// <param name="ev"></param>
private void PrintPage(object sender, PrintPageEventArgs ev)
{
//<<<EDT
//Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
//ev.Graphics.DrawImage(pageImage, 0, 0);
//m_currentPageIndex++;
//ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
//>>>EDT
// 畫面解像度(dpi)を取得
Control ctrl = new Control();
Graphics g = ctrl.CreateGraphics();
float DisplayDpiX = g.DpiX;
float DisplayDpiY = g.DpiY;
// 印刷対象を取得
PrintDocument p = (PrintDocument)sender;
int DisplayPixelX = 0;
int DisplayPixelY = 0;
if (p.DefaultPageSettings.Landscape == true)
{
// 畫面のピクセルを取得
//橫向きの帳票
DisplayPixelX = (int)(297 * DisplayDpiX / 25.4 + 0.5);
DisplayPixelY = (int)(210 * DisplayDpiY / 25.4 + 0.5);
}
else
{
//縦向きの帳票
DisplayPixelX = (int)(210 * DisplayDpiX / 25.4 + 0.5);
DisplayPixelY = (int)(297 * DisplayDpiY / 25.4 + 0.5);
}
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
ev.Graphics.DrawImage(pageImage, 0, 0, DisplayPixelX, DisplayPixelY);
m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
/// <summary>
/// Print dialog box to configure
/// </summary>
private void Print()
{
//const string printerName = "";//Printer Name 如果不指定列印機,則預設是目前系統的預設列印機
if (m_streams == null || m_streams.Count == 0)
{
return;
}
PrintDocument printDoc = new PrintDocument();
//printDoc.PrinterSettings.PrinterName = printerName; //Specify the printer name
//printDoc.PrinterSettings.PaperSizes.
if (!printDoc.PrinterSettings.IsValid)
{
string msg = "Can't find printer!";
Debug.WriteLine(msg);
return;
}
//Print the event handler function
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
//Show the Print Dialog Box
PrintDialog printDia = new PrintDialog();
printDia.AllowSomePages = true;
printDia.ShowHelp = true;
printDia.Document = printDoc;
DialogResult result = printDia.ShowDialog();
if (result == DialogResult.OK)
{
printDoc.Print(); //Print
}
}
/// <summary>
/// 執行列印(豎向)
/// </summary>
/// <param name="dDataTable">資料源(Datatable或list等)</param>
/// <param name="RDLCName">rdlc名稱</param>
/// <param name="parameters">參數集合</param>
public void Run(DataTable dDataTable, string RDLCName, ReportParameter[] parameters)
{
try
{
LocalReport report = new LocalReport();
report.ReportPath = Application.StartupPath + "//" + RDLCName + ".rdlc";//Loading path report
report.DataSources.Add(new ReportDataSource(dDataTable.TableName, dDataTable));//Add Data Source
if (parameters != null)
{
report.SetParameters(parameters);
}
report.Refresh();
Export(report);
m_currentPageIndex = 0;
//run
Print();
Dispose();
}
catch (Exception e)
{
//Debug.Print(e.InnerException.Message);
throw e;
}
}
/// <summary>
/// 執行列印(橫向)
/// </summary>
/// <param name="dDataTable">資料源(Datatable或list等)</param>
/// <param name="RDLCName">rdlc名稱</param>
/// <param name="parameters">參數集合</param>
/// <param name="isLandscape">橫向列印</param>
public void Run(DataTable dDataTable, string RDLCName, ReportParameter[] parameters, bool isLandscape)
{
try
{
LocalReport report = new LocalReport();
report.ReportPath = Application.StartupPath + "//" + RDLCName + ".rdlc";//Loading path report
report.DataSources.Add(new ReportDataSource(dDataTable.TableName, dDataTable));//Add Data Source
if (parameters != null)
{
report.SetParameters(parameters);
}
report.Refresh();
Export(report);
m_currentPageIndex = 0;
//run
Print(isLandscape);
Dispose();
}
catch (Exception e)
{
//Debug.Print(e.InnerException.Message);
throw e;
}
}
/// <summary>
/// </summary>
/// <param name="isLandscape">橫向設定</param>
private void Print(bool isLandscape)
{
if (m_streams == null || m_streams.Count == 0)
{
return;
}
PrintDocument printDoc = new PrintDocument();
//printDoc.PrinterSettings.PrinterName = printerName; //Specify the printer name
//printDoc.PrinterSettings.PaperSizes.
if (!printDoc.PrinterSettings.IsValid)
{
string msg = "Can't find printer!";
Debug.WriteLine(msg);
return;
}
printDoc.DefaultPageSettings.Landscape = isLandscape;
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.Print();
}
/// <summary>
/// 釋放buffer
/// </summary>
public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}
}
}
***************************************************************
以下不屬于列印類内容
//添加并引用命名空間
using Microsoft.Reporting.WinForms;
/// <summary>
/// 給報表參數指派(前提是RDLC報表中有這些參數)
/// </summary>
/// <returns></returns>
private ReportParameter[] SetReportParameters()
{
string TTOrder = "";
string TTOrderDate = "";
string TTCustomerID = "";
string TTCustomerName = "";
string TTDirectSendName = "";
string TTSendDate = "";
string TTDayt = "";
string TTSaffName = "";
string TTArrivePlaceCode = "";
string TTArrivePlaceName = "";
string TTUseCartName = "";
string TTPostCartKind = "";
string TTMemo = "";
ReportParameter[] parameters ={
new ReportParameter("TTOrder", TTOrder,true),
new ReportParameter("TTOrderDate", TTOrderDate,true),
new ReportParameter("TTSaffName", TTSaffName,true),
new ReportParameter("TTCustomerID", TTCustomerID,true),
new ReportParameter("TTCustomerName", TTCustomerName,true),
new ReportParameter("TTDirectSendName", TTDirectSendName,true),
new ReportParameter("TTSendDate", TTSendDate,true),
new ReportParameter("TTDay", TTDay,true),
new ReportParameter("TTArrivePlaceCode", TTArrivePlaceCode,true),
new ReportParameter("TTArrivePlaceName", TTArrivePlaceName,true),
new ReportParameter("TTUseCartName", TTUseCartName,true),
new ReportParameter("TTPostCartKind", TTPostCartKind,true),
new ReportParameter("TTMemo", TTMemo,true)
};
return parameters;
}