C#打印 我用的是PrintDocumnet打印的 设定了纸张了以后再不同型号的打印机下面打印出来的位置偏离了一些有没有什么解决办法 让打印的位置固定啊? 不随着打印机的改变而改变位置倾家荡产啦! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为个人/电脑设置不一样的页边距就可以了,起码我现在是这么做的。要使用页边距,首先printDocument.OriginAtMargins = true;然后修改Margins 就可以了printDocument.DefaultPageSettings.Margins = new Margins(...);再具体些的可能要结合到你实际项目中才适合了。 /// <summary> /// 点击打印 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnPrint_Click(object sender, EventArgs e) { //this.m_pageSettings.Landscape = true; //获取当前默认打印机 m_printDocument = new PrintDocument(); //设置要使用的打印机的名称 this.m_printDocument.PrinterSettings.PrinterName = cmbSelectPrinter.SelectedItem.ToString(); if (this.m_printDocument.PrinterSettings.IsValid) { #region 页面设置 //获取当前报表的所需的页面设置 ReportPageSettings rptPageSettings = this.rptView.LocalReport.GetDefaultPageSettings(); this.m_pageSettings.Margins = rptPageSettings.Margins; this.m_pageSettings.PaperSize = rptPageSettings.PaperSize; //页面边距设定 this.m_pageSettings.Margins.Bottom = rptPageSettings.Margins.Bottom; this.m_pageSettings.Margins.Left = rptPageSettings.Margins.Left; this.m_pageSettings.Margins.Right = rptPageSettings.Margins.Right; this.m_pageSettings.Margins.Top = rptPageSettings.Margins.Top; //页面尺寸设定 PaperSize paperSize = new PaperSize(); if (this.m_isLandSapce) { //横向 paperSize.Height = rptPageSettings.PaperSize.Width; paperSize.Width = rptPageSettings.PaperSize.Height; } else { paperSize.Height = rptPageSettings.PaperSize.Height; paperSize.Width = rptPageSettings.PaperSize.Width; } paperSize.PaperName = rptPageSettings.PaperSize.PaperName; paperSize.RawKind = rptPageSettings.PaperSize.RawKind; this.m_pageSettings.PaperSize = paperSize; //打印方向 this.m_pageSettings.Landscape = m_isLandSapce; #endregion 页面设置 //根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机 unchecked { this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距 this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距 } //设置默认打印机页面 m_printDocument.DefaultPageSettings = (PageSettings)m_pageSettings.Clone(); //保存当前打印机设置 //导出后打印 Export(rptView.LocalReport, this.m_pageSettings); Application.DoEvents(); this.m_currentPageIndex = 0; this.m_printDocument.PrinterSettings.MaximumPage = this.m_streams.Count; this.m_printDocument.PrinterSettings.MinimumPage = 1; FrmPrint frmPrint = new FrmPrint(this.m_printDocument.PrinterSettings); if (frmPrint.ShowDialog(this) == DialogResult.OK) { this.m_duplex = frmPrint.Duplex; IList<Stream> streams = new List<Stream>(); //打印选定页 if (frmPrint.PrinterSettings.PrintRange == PrintRange.SomePages && frmPrint.PrinterSettings.FromPage >= 1 && frmPrint.PrinterSettings.ToPage <= this.m_streams.Count) {//打印部分页,且指定页码在当前页码范围内 //剔除未被选中的页 for (int i = 0; i <= this.m_streams.Count; i++) { //属于页码范围则选中 if (i >= (frmPrint.PrinterSettings.FromPage - 1) && i <= (frmPrint.PrinterSettings.ToPage - 1)) { streams.Add(this.m_streams[i]); } else { //this.m_streams[i].SetLength(0); //this.m_streams[i].Close(); } } this.m_streams.Clear(); this.m_streams = streams; } else if (frmPrint.PrinterSettings.PrintRange == PrintRange.Selection) {//打印当前页,guog2009-05-06新增 //剔除所有非当前页 if (this.rptView.CurrentPage < this.m_streams.Count && this.m_streams.Count > 0) { streams.Add(this.m_streams[this.rptView.CurrentPage - 1]); } this.m_streams.Clear(); this.m_streams = streams; } if (this.m_streams.Count > 0) { //打印 Print(); } else { string msg = "没有可打印的页面信息。"; MessageBox.Show(msg, "报表打印", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } else { this.btnPrint.Enabled = true; this.Cursor = Cursors.Default; string msg = String.Format("由于当前打印机安装有问题,无法打印。\r\n\"{0}\"请检查打印机设置或重新选择打印机。", this.m_printDocument.PrinterSettings.PrinterName); MessageBox.Show(msg, "报表打印"); } }//根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机 unchecked { this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距 this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距 } //根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机 unchecked { this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距 this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距 }=================================================我现在做的也是用代码直接连打印,可是在公司里调了边距已经好了,为什么在客户哪里还是一样的。上边据过大,导致表格下边的线出不了,因为没的纸了?请问是什么原因? 唉.. 现在看到写打印类的人 我就很纳闷, 也许我的要求不高,但是我的solution绝对满足我的要求了. 你就调用下IE的打印不就好了.. 又可以通过拉边距,简单易用 就一句话的事情。 何必写那么多代码?当然你如果为了挑战下自己的逻辑思维能力或者有更加高的需求,比如跨平台,那就当我没说。 晕了 我什么时候说了是在WEB底下用的打印撒? m_pageSettings 是什么控件啊? 查MSDN吧,那里来的什么控件! C#能用OpenGL做出三维的模型吗? 代码更改后再运行还是不变?据说涉及到工程文件?新手问题,谢谢大家 c# 使用odbc源调用存储过程 WebBrowser 重新导航后 Document 内容不一样的问题 MapXtreme难题 高兴,散分。新注册的马甲不要了 INSERT语句的问题,如何给一个列赋予NULL值啊? 有关活动目录的问题——如何得到当前用户名以及所登陆的域控制器? 如何继承 DataRow? 长期javaWEB开发打算做一个window平台的应用请问有啥好的解决方案? C# WINFORM 进度条 关于如何编程实现远程windows用户账户的建立
要使用页边距,首先
printDocument.OriginAtMargins = true;
然后修改Margins 就可以了
printDocument.DefaultPageSettings.Margins = new Margins(...);
再具体些的可能要结合到你实际项目中才适合了。
/// 点击打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnPrint_Click(object sender, EventArgs e)
{
//this.m_pageSettings.Landscape = true;
//获取当前默认打印机
m_printDocument = new PrintDocument();
//设置要使用的打印机的名称
this.m_printDocument.PrinterSettings.PrinterName = cmbSelectPrinter.SelectedItem.ToString();
if (this.m_printDocument.PrinterSettings.IsValid)
{
#region 页面设置
//获取当前报表的所需的页面设置
ReportPageSettings rptPageSettings = this.rptView.LocalReport.GetDefaultPageSettings(); this.m_pageSettings.Margins = rptPageSettings.Margins;
this.m_pageSettings.PaperSize = rptPageSettings.PaperSize;
//页面边距设定
this.m_pageSettings.Margins.Bottom = rptPageSettings.Margins.Bottom;
this.m_pageSettings.Margins.Left = rptPageSettings.Margins.Left;
this.m_pageSettings.Margins.Right = rptPageSettings.Margins.Right;
this.m_pageSettings.Margins.Top = rptPageSettings.Margins.Top;
//页面尺寸设定
PaperSize paperSize = new PaperSize();
if (this.m_isLandSapce)
{
//横向
paperSize.Height = rptPageSettings.PaperSize.Width;
paperSize.Width = rptPageSettings.PaperSize.Height;
}
else
{
paperSize.Height = rptPageSettings.PaperSize.Height;
paperSize.Width = rptPageSettings.PaperSize.Width;
}
paperSize.PaperName = rptPageSettings.PaperSize.PaperName;
paperSize.RawKind = rptPageSettings.PaperSize.RawKind;
this.m_pageSettings.PaperSize = paperSize;
//打印方向
this.m_pageSettings.Landscape = m_isLandSapce;
#endregion 页面设置
//根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机
unchecked
{
this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距
this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距
} //设置默认打印机页面
m_printDocument.DefaultPageSettings = (PageSettings)m_pageSettings.Clone();
//保存当前打印机设置 //导出后打印
Export(rptView.LocalReport, this.m_pageSettings);
Application.DoEvents();
this.m_currentPageIndex = 0;
this.m_printDocument.PrinterSettings.MaximumPage = this.m_streams.Count;
this.m_printDocument.PrinterSettings.MinimumPage = 1;
FrmPrint frmPrint = new FrmPrint(this.m_printDocument.PrinterSettings);
if (frmPrint.ShowDialog(this) == DialogResult.OK)
{
this.m_duplex = frmPrint.Duplex;
IList<Stream> streams = new List<Stream>();
//打印选定页
if (frmPrint.PrinterSettings.PrintRange == PrintRange.SomePages &&
frmPrint.PrinterSettings.FromPage >= 1 &&
frmPrint.PrinterSettings.ToPage <= this.m_streams.Count)
{//打印部分页,且指定页码在当前页码范围内
//剔除未被选中的页
for (int i = 0; i <= this.m_streams.Count; i++)
{
//属于页码范围则选中
if (i >= (frmPrint.PrinterSettings.FromPage - 1) && i <= (frmPrint.PrinterSettings.ToPage - 1))
{
streams.Add(this.m_streams[i]);
}
else
{
//this.m_streams[i].SetLength(0);
//this.m_streams[i].Close();
}
}
this.m_streams.Clear();
this.m_streams = streams;
}
else if (frmPrint.PrinterSettings.PrintRange == PrintRange.Selection)
{//打印当前页,guog2009-05-06新增
//剔除所有非当前页
if (this.rptView.CurrentPage < this.m_streams.Count && this.m_streams.Count > 0)
{
streams.Add(this.m_streams[this.rptView.CurrentPage - 1]);
}
this.m_streams.Clear();
this.m_streams = streams;
}
if (this.m_streams.Count > 0)
{
//打印
Print();
}
else
{
string msg = "没有可打印的页面信息。";
MessageBox.Show(msg, "报表打印", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
}
else
{
this.btnPrint.Enabled = true;
this.Cursor = Cursors.Default;
string msg = String.Format("由于当前打印机安装有问题,无法打印。\r\n\"{0}\"请检查打印机设置或重新选择打印机。", this.m_printDocument.PrinterSettings.PrinterName);
MessageBox.Show(msg, "报表打印");
}
}
//根据打印机物理边距(可打印区域距离纸张边距)重新调整页边距,以适应不同的打印机
unchecked
{
this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距
this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距
}
unchecked
{
this.m_pageSettings.Margins.Left -= (int)m_printDocument.DefaultPageSettings.HardMarginX;//左边距减去打印机可打印区域边距
this.m_pageSettings.Margins.Top -= (int)m_printDocument.DefaultPageSettings.HardMarginY;//上边距减去可打印区域边距
}=================================================
我现在做的也是用代码直接连打印,可是在公司里调了边距已经好了,为什么在客户哪里还是一样的。上边据过大,导致表格下边的线出不了,因为没的纸了?请问是什么原因?
查MSDN吧,那里来的什么控件!