2011-06-07 46 views
11

我在应用程序中使用PrintDocument进行一些自定义打印。当我们的项目成功打印时,我有要求记录日志。本来我实现了这个的东西,如:检测PrintDocument是否成功打印(不仅仅是预览)

print_doc.EndPrint += (o,e) => printed_callback(); 

要当打印完成我printed_callback被调用。但是,现在我添加了预览支持,我将以完全相同的方式构建的PrintDocument传递给PrintPreviewDialog。这样做会导致EndPrint事件在预览所需的打印输出的初始呈现后被调用。

因此,即使用户单击“预览”,然后关闭预览,我们的日志记录代码也会被调用。

有关如何区分真实打印输出和“预览打印”的任何建议?不幸的是,由于用户可以点击预览对话框中的“打印”按钮并触发打印输出,因此我不能仅仅连接EndPrint传递给PrintPreviewDialogPrintDocument

回答

14

好吧,所以我真的设法弄清楚了自己,使用PrintDocument.PrintController属性,并检查控制器的IsPreview属性。我最后来编码结束如下:

doc.EndPrint += (o,e) => 
{ 
    if (doc.PrintController.IsPreview) 
     return; 

    print_callback(); 
} 
+1

双+1,对于问题和答案:-D – peenut 2012-10-12 11:01:27

+0

以上方法是在对PrintDocument的所有页面都被缠绕。它不检查工作是否完成。如果您想检查作业何时完成,请查看[PrintQueue](https://msdn.microsoft.com/en-us/library/system.printing.printqueue(v = vs.110).aspx)。 – 2016-04-12 05:06:09

0

我也设法弄清楚,为我工作用不同的方式...

我MyPrintFileDetail类的列表中的每个包含的PrintDocument和一个StreamReader说文件。

设置我的PrintDocument时,我添加了一个PrintPage事件。在PrintPage事件处理程序中,我通过将“发件人”投射到PrintDocument来识别正在处理的PrintDocument。然后编写一个foreach循环来从列表中识别正在工作的MyPrintFileDetail对象以获取我用来打印的StreamReader。一旦没有更多的行要打印,我放弃了StreamReader并将其设置为null。

然后在我的Timer回调中处理MyPrintFileDetail对象列表,我检查了StreamReader为null,如果为null,我完成了打印。

有点笨重,但它的工作。

private void PD_PrintPage(object sender, PrintPageEventArgs e) 
    { 
     PrintDocument p = (PrintDocument)sender; 

     PrintFileDetail pfdWorkingOn = null; 

     foreach (PrintFileDetail pfd in pfds) 
     { 
      if (pfd._PrintDoc.DocumentName == p.DocumentName) 
      { 
       pfdWorkingOn = pfd; 
       break; 
      } 
     } 

     float yPos = 0f; 
     int count = 0; 
     float leftMargin = e.MarginBounds.Left; 
     float topMargin = e.MarginBounds.Top; 
     string line = null; 
     float linesPerPage = e.MarginBounds.Height/_TextFilePrintingFont.GetHeight(e.Graphics); 

     while (count < linesPerPage) 
     { 
      line = pfdWorkingOn._TxtFileBeingPrinted.ReadLine(); 
      if (line == null) 
      { 
       break; 
      } 
      yPos = topMargin + count * _TextFilePrintingFont.GetHeight(e.Graphics); 
      e.Graphics.DrawString(line, _TextFilePrintingFont, Brushes.Black, leftMargin, yPos, new StringFormat()); 
      count++; 
     } 

     if (line != null) 
     { 
      e.HasMorePages = true; 
     } 
     else 
     { 
      pfdWorkingOn._TxtFileBeingPrinted.Dispose(); 
      pfdWorkingOn._TxtFileBeingPrinted = null; 
     } 
    }