C#,在没有虚拟打印机的情况下,如何直接打印到文件,不输出到打印机

Lyu_KingT 2010-07-06 11:02:27
首先列出我们处理打印的过程:

// 打印
protected void PrintDialog()
{
PrintDocument printDoc = new PrintDocument();
printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();
printDoc.DocumentName = "报告-" + this.ReportNo;

if (PrinterName != "") // 如指定过打印机,则用指定的,一般使用默认打印机
printDoc.PrinterSettings.PrinterName = PrinterName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("打印机不可用!! \"{0}\".", PrinterName);
Console.WriteLine(msg);
ErrMessage = msg;
return;
}

printDoc.PrintPage += new PrintPageEventHandler(PrintPage);

try
{
printDoc.Print(); // 开始打印
// ...

}
catch (Exception e)
{
if (!e.Message.Contains("成功")) // 对于提示"操作成功完成"的提醒,不做处理!
MessageBox.Show("现在不能打印," + e.Message);
}
}

// 页打印事件处理
protected 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);
}


这样处理将直接输出到打印机,我如果将PrintPage事件处理做如下修改,就能够输出到临时文件,但是在任务栏里面会出现打印机图标。
怎么才能够实现标题这个功能,又不会在任务栏上显示图标,谢谢


protected void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); // 根据数据流,生成图形数据

// 保存到临时文件并终止打印事件
pageImage.Save(@"c:\Swap\metaFile_caach.bmp");
ev.Cancel = true;

// ev.Graphics.DrawImage(pageImage, ev.PageBounds);

m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}




最后附上稍微完整的代码,这是团队对里别人写的。

// 设置报告的设备信息
protected void SetDeviceInfo(LocalReport report)
{
Warning[] warnings;
m_streams = new List<Stream>();
m_currentPageIndex = 0;

try
{
report.Render("Image", DeviceInfo, CreateStream, out warnings);
}
catch (Exception e)
{
ErrMessage = e.Message + e.InnerException.Message;
System.Windows.Forms.MessageBox.Show(ErrMessage);
}

foreach (Stream stream in m_streams)
stream.Position = 0;
}

// 构建流
protected Stream CreateStream(string name, string fileNameExtension, Encoding enfcoding, string mimeType, bool willSeek)
{
Stream stream;
m_currentPageIndex++;
stream = new FileStream(ReportNo + "-" + m_currentPageIndex.ToString() + ".emf", FileMode.OpenOrCreate);
m_streams.Add(stream);
return stream;
}

// 打印报告
protected void PrintDialog()
{
if (m_streams == null || m_streams.Count == 0)
return;

m_currentPageIndex = 0; // 从首页开始打印

PrintDocument printDoc = new PrintDocument();
printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();
printDoc.DocumentName = "报告-" + ReportNo + "-" + SpecimenXhSet;

if (PrinterName != "") // 如指定过打印机,则用指定的,一般使用默认打印机
printDoc.PrinterSettings.PrinterName = PrinterName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("打印机不可用!! \"{0}\".", PrinterName);
Console.WriteLine(msg);
ErrMessage = msg;
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
try
{
printDoc.Print(); // 开始打印
Thread.Sleep(500);
foreach (Stream stream in m_streams) // 使用完后,一定要关闭文件流对象!!
{
stream.Close();
}
if (System.IO.File.Exists(ReportNo + ".emf")) // 删除报告图像文件名!
File.Delete(ReportNo + ".emf");
for (int j = 0; j <= m_currentPageIndex; j++)
{
if (System.IO.File.Exists(ReportNo + "-" + j.ToString() + ".emf")) // 删除报告图像文件名!
File.Delete(ReportNo + "-" + j.ToString() + ".emf");
}
}
catch (Exception e)
{
if (!e.Message.Contains("成功")) // 对于提示"操作成功完成"的提醒,不做处理!
MessageBox.Show("现在不能打印," + e.Message);
}
}

// 页打印事件处理
protected 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);
}
...全文
965 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lyu_KingT 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zgke 的回复:]

明白点了 你自己写一个类继承 PreviewPrintController

然后重写OnEndPage方法

public override void OnEndPage(PrintDocument document, PrintPageEventArgs e)
{
base.OnEndPage(document, e);
……
[/Quote]

谢谢,虽然现在没看懂,但我晚上去试试。。
Lyu_KingT 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zxp8819 的回复:]

引用 17 楼 lyu_kingt 的回复:
引用 15 楼 zxp8819 的回复:



这是what表情?

你看不出我很感动吗
[/Quote]

你感动什么?感动大家的热情,还是感动我提的问题真是太动人了??
呵呵
zgke 2010-07-09
  • 打赏
  • 举报
回复
明白点了 你自己写一个类继承 PreviewPrintController

然后重写OnEndPage方法

public override void OnEndPage(PrintDocument document, PrintPageEventArgs e)
{
base.OnEndPage(document, e);
PreviewPageInfo[] PageInfos = GetPreviewPageInfo();
PreviewPageInfo PageInfo = PageInfos[PageInfos.Length - 1];
PageInfo.Image.Save("");
}

在你PrintDocument.PrintController = new 你继承出来的类();
铛铛 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lyu_kingt 的回复:]
引用 15 楼 zxp8819 的回复:



这是what表情?
[/Quote]
你看不出我很感动吗
Lyu_KingT 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zxp8819 的回复:]

[/Quote]

这是what表情?
Lyu_KingT 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zxp8819 的回复:]

[/Quote]

这是什么表情?
铛铛 2010-07-08
  • 打赏
  • 举报
回复
Lyu_KingT 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jietuan 的回复:]

是必须要有虚拟打印机的
[/Quote]

不好意思,可能是我描述得不好。打印机是要有的,虚拟或是实际的都行。
我的操作是将打印的内容输出但临时文件,而不是到打印机。但是原来的处理方法是要保留的,而我输出到临时文件的代码也最好放到PrintPage()里面,测试之后,我可以用个if语句,既能满足我的要求,又可以使用原来的处理(即输出到打印机)

谢谢大家的热心。
imoyo 2010-07-07
  • 打赏
  • 举报
回复
学习 帮顶
Lyu_KingT 2010-07-07
  • 打赏
  • 举报
回复
谢谢大家的顶,也希望有人能帮我,谢谢
mayonglong 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zanfeng 的回复:]
C#,在没有虚拟打印机的情况下,如何直接打印到文件,不输出到打印机??

你直接保存成图片不就可以了。又不需要打印干嘛还要弄PrintDocument

你把你绘制的代码直接绘到图片里。然后把图片保存一下不就可以了嘛。
[/Quote]

用不着PrintDocument了~
zgke 2010-07-07
  • 打赏
  • 举报
回复
看糊涂了!
lsq667 2010-07-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jietuan 的回复:]
是必须要有虚拟打印机的
[/Quote]同意楼上的,至少据我所知,是需要虚拟打印机的
足球中国 2010-07-07
  • 打赏
  • 举报
回复
C#,在没有虚拟打印机的情况下,如何直接打印到文件,不输出到打印机??

你直接保存成图片不就可以了。又不需要打印干嘛还要弄PrintDocument

你把你绘制的代码直接绘到图片里。然后把图片保存一下不就可以了嘛。
jietuan 2010-07-07
  • 打赏
  • 举报
回复
是必须要有虚拟打印机的
zhuhongjia1987 2010-07-07
  • 打赏
  • 举报
回复
学习 正好需要 我试试!
yypf2540017 2010-07-06
  • 打赏
  • 举报
回复
学习 帮顶
huminghua 2010-07-06
  • 打赏
  • 举报
回复
xuexi!学习!
平生我自如 2010-07-06
  • 打赏
  • 举报
回复
帮顶一下…………

110,536

社区成员

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

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

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