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

本文关键字:不仅仅是 PrintDocument 何时 成功 打印 检测 | 更新日期: 2023-09-27 17:58:40

我正在应用程序中使用PrintDocument进行一些自定义打印。当我们的项目成功打印时,我有一个记录的要求。我最初是通过以下方式实现的:

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

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

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

关于如何区分真实打印和"预览打印",有什么建议吗?不幸的是,我不能将传递给PrintPreviewDialogPrintDocument连接到EndPrint,因为用户可以单击预览对话框中的"打印"按钮并触发打印输出。

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

好的,所以我实际上自己设法解决了这个问题,使用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。

然后,在处理MyPrintFileDetail对象列表的Timer回调中,我检查了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;
        }
    }
相关文章: