C# rdlc直接打印怎样才能控制纸张大小

mageYY 2015-12-06 12:34:56
在网上搜索了一些方法,请大家帮忙看一下,要怎么样才能控制纸张的大小,我在打印的时候加入了这一段ev.PageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Custom", 800, 400);后,才能控制后边两张的大小,第一张的小大还是A4的。


private void PrintForm_Load(object sender, EventArgs e)
{
LocalReport report = new LocalReport();
//设置需要打印的报表的文件名称。
report.ReportPath = "Report2.rdlc";
//创建要打印的数据源
ReportDataSource source = new ReportDataSource("DataSet1", myDs.Tables["PrintTable"]);
report.DataSources.Add(source);
//刷新报表中的需要呈现的数据
report.Refresh();
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>19.1cm</PageWidth>" +
" <PageHeight>10.2cm</PageHeight>" +
" <MarginTop>0cm</MarginTop>" +
" <MarginLeft>0cm</MarginLeft>" +
" <MarginRight>0cm</MarginRight>" +
" <MarginBottom>0cm</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();

//将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
report.Render("Image", deviceInfo, CreateStream, out warnings);
foreach (Stream stream in m_streams)
stream.Position = 0;

Print();
}
//声明一个Stream对象的列表用来保存报表的输出数据
//LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
private List<Stream> m_streams;
//用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
private Stream CreateStream(string name, string fileNameExtension,
Encoding encoding, string mimeType, bool willSeek)
{
//如果需要将报表输出的数据保存为文件,请使用FileStream对象。
Stream stream = new FileStream(name + "." + fileNameExtension,FileMode.Create);
m_streams.Add(stream);
return stream;
}

//用来记录当前打印到第几页了
private int m_currentPageIndex;

private void Print()
{
m_currentPageIndex = 0;

if (m_streams == null || m_streams.Count == 0)
return;
//声明PrintDocument对象用于数据的打印
PrintDocument printDoc = new PrintDocument();
//指定需要使用的打印机的名称,使用空字符串""来指定默认打印机
printDoc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer";
//判断指定的打印机是否可用
if (!printDoc.PrinterSettings.IsValid)
{
MessageBox.Show("Can't find printer");
return;
}
//声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
//执行打印操作,Print方法将触发PrintPage事件。
printDoc.Print();
}

private void PrintPage(object sender, PrintPageEventArgs ev)
{
//Metafile对象用来保存EMF或WMF格式的图形,
//我们在前面将报表的内容输出为EMF图形格式的数据流。

m_streams[m_currentPageIndex].Position = 0;

Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
//指定是否横向打印
ev.PageSettings.Landscape = false;
//这里的Graphics对象实际指向了打印机
//ev.Graphics.DrawImage(pageImage, 0, 0);
ev.PageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Custom", 800, 400);
ev.Graphics.DrawImage(pageImage, ev.PageBounds, 0, 0, ev.PageBounds.Width, ev.PageBounds.Height, System.Drawing.GraphicsUnit.Millimeter);

m_streams[m_currentPageIndex].Close();
m_currentPageIndex++;
//设置是否需要继续打印
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}


...全文
794 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mageYY 2015-12-06
  • 打赏
  • 举报
回复
找到了,不应该那样加。应该在这里边来加printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Custom", 800, 400); private void Print() { m_currentPageIndex = 0; if (m_streams == null || m_streams.Count == 0) return; //声明PrintDocument对象用于数据的打印 PrintDocument printDoc = new PrintDocument(); //指定需要使用的打印机的名称,使用空字符串""来指定默认打印机 printDoc.PrinterSettings.PrinterName = "Microsoft XPS Document Writer"; printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("Custom", 800, 400); //判断指定的打印机是否可用 if (!printDoc.PrinterSettings.IsValid) { MessageBox.Show("Can't find printer"); return; } //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。 printDoc.PrintPage += new PrintPageEventHandler(PrintPage); //执行打印操作,Print方法将触发PrintPage事件。 printDoc.Print(); }

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧