+ -
当前位置:首页 → 问答吧 → C#求把word文档内容实现自己的窗体的打印预览方法

C#求把word文档内容实现自己的窗体的打印预览方法

时间:2011-12-16

来源:互联网

C#把word的内容读取出来并显示在自己建的窗体的打印预览界面中,同时实现打印,C#的printDocument都要把打印的东西画成图片的,有没有其它办法?如果没有,如何控制文字好格式(不需要字体颜色等,只要控制好每一行的字数和排版像word内的,如第一行A字结束,在图片中也是一样)

作者: liao_ken   发布时间: 2011-12-16

1、预览时、可弹出层、层进行内容绑定
 2、层上放置打印按钮、页面设定参见下面代码!  
  /// <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, "报表打印");
  }
  }

作者: yuan521929   发布时间: 2011-12-16

不想用报表不行吗?安装个报表搞得太麻烦了,其实我 的都是动态生成的word文件,但预览的时候不希望直接打开个word给用户看,所以不想调用word本身的打印预览

作者: liao_ken   发布时间: 2011-12-16

。。。我今天也在做这个,也不想用报表,想直接打窗体上的内容

作者: pmjsmallworm   发布时间: 2011-12-17