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


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

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

为了让我的 printed_callback 打印完成后调用。但是,现在我正在添加预览支持,我正在通过 PrintDocument 以完全相同的方式构造成一个 PrintPreviewDialog上。这样做会导致 EndPrint 在初始呈现预览所需的打印输出之后调用的事件。

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

有关如何区分真实打印输出和“预览打印”的任何建议?不幸的是,我不能只是不联系 EndPrint 为了 PrintDocument 传递给了 PrintPreviewDialog 因为用户可以点击预览对话框中的“打印”按钮并触发打印输出。


9329
2018-06-07 19:28


起源



答案:


好吧,所以我实际上设法自己解决这个问题,使用了 PrintDocument.PrintController 财产,并检查 IsPreview 控制器的属性。我的最终编码最终如下:

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

    print_callback ();
}

14
2018-06-07 19:54



双+1,问题和答案:-D - peenut
上面的方法是PrintDocument中的所有页面都已假脱机。它不会检查作业是否已完成。如果要检查作业何时完成,请查看 打印队列 代替。 - Kraang Prime


答案:


好吧,所以我实际上设法自己解决这个问题,使用了 PrintDocument.PrintController 财产,并检查 IsPreview 控制器的属性。我的最终编码最终如下:

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

    print_callback ();
}

14
2018-06-07 19:54



双+1,问题和答案:-D - peenut
上面的方法是PrintDocument中的所有页面都已假脱机。它不会检查作业是否已完成。如果要检查作业何时完成,请查看 打印队列 代替。 - Kraang Prime


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

我有一个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;
        }
    }

0
2018-06-18 22:03