检测PrintDocument何时成功打印(不仅仅是预览)

我在我的应用程序中使用PrintDocument进行一些自定义打印。 我的项目成功打印时需要记录。 我最初通过以下方式实现了这个目标

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

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

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

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

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

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

我也设法找出一种对我有用的不同方式……

我有一个MyPrintFileDetail类列表,每个类包含一个PrintDocument和一个StreamReader用于所述文档。

在设置我的PrintDocument时,我添加了一个PrintPage事件。 在PrintPage事件处理程序中,我通过将“sender”转换为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; } }