C# 检测打印文档何时成功打印(不仅仅是预览)

C# 检测打印文档何时成功打印(不仅仅是预览),c#,.net,winforms,printing,C#,.net,Winforms,Printing,我正在我的应用程序中使用a进行一些自定义打印。我有一个记录的要求,当我们的项目成功打印。我最初是通过以下方式实现的: print_doc.EndPrint += (o,e) => printed_callback (); 在打印完成时调用我的printed\u回调。但是,现在我添加了预览支持,我将以完全相同的方式构造一个PrintDocument,并将其传递到一个应用程序中。这样做会导致在预览所需打印输出的初始呈现之后调用EndPrint事件 因此,即使用户单击“预览”,然后关闭预览,

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

 print_doc.EndPrint += (o,e) => printed_callback ();
在打印完成时调用我的
printed\u回调
。但是,现在我添加了预览支持,我将以完全相同的方式构造一个
PrintDocument
,并将其传递到一个应用程序中。这样做会导致在预览所需打印输出的初始呈现之后调用
EndPrint
事件

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


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

好,所以我实际上自己使用该属性解决了这个问题,并检查控制器的
IsPreview
属性。我的最终编码结果如下:

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

    print_callback ();
}

我也设法找到了另一种适合我的方式

我有一个MyPrintFileDetail类的列表,每个类都包含一个PrintDocument和一个用于该文档的StreamReader

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

然后,在处理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;
        }
    }
private void PD_PrintPage(对象发送方,PrintPageEventArgs e)
{
打印文档p=(打印文档)发送方;
PrintFileDetail pfdWorkingOn=null;
foreach(pfds中的打印文件详细pfd)
{
如果(pfd.\u PrintDoc.DocumentName==p.DocumentName)
{
pfdWorkingOn=pfd;
打破
}
}
浮动yPos=0f;
整数计数=0;
浮动左边距=e.MarginBounds.Left;
浮动顶部边距=e.MarginBounds.Top;
字符串行=null;
float linesPerPage=e.MarginBounds.Height/_TextFilePrintingFont.GetHeight(e.Graphics);
while(计数
double+1,用于问答:-d上述方法是在打印文档中的所有页面都已后台打印时使用的。它不会检查作业是否已完成。如果要检查作业何时完成,请查看。