2

设置 - 本地 Windows 10 PC 安装了多台网络打印机。GUI C# WinForm 应用程序 (.NET) 在后台持续运行,偶尔会从预定义的 URL 下载 PDF 文件(从 *.ini 文件中读取)。

打印上述 PDF 文件时会出现问题。打印机不接受从应用程序发送的副本数,而是继续打印文件的一份副本。

这是我的代码的相关部分:

        string webPrinter = "HP LaserJet PCL 6"; // is set in another part of the code
        string iniFilePrinter = "hp LaserJet 1320 PCL 5"; // is set in another part of the code - read from the ini file
        string dirName = "C:\\mydir";
        string newDocName = "mydoc.pdf";
        short numCopies = 1;

        if(event1 == "event1") {        // taken from another part of the code
            numCopies = webNumCopies;   // taken from another part of the code
        } else if(event2 == "event2") {
            numCopies = iniNumCopies;   // taken from another part of the code - read from the ini file
        }

        var path = dirName + "\\" + newDocName;

        try
        {
            using (var document = PdfiumViewer.PdfDocument.Load(path))
            {
                using (var printDocument = document.CreatePrintDocument())
                {
                    System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings();
                    string defaultPrinterName = settings.PrinterName;

                    printDocument.DocumentName = newDocName;
                    printDocument.PrinterSettings.PrintFileName = newDocName;
                    printDocument.PrinterSettings.Copies = numCopies;
                    printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
                    printDocument.PrinterSettings.PrinterName = webPrinter;

                    MessageBox.Show("Before: " + printDocument.PrinterSettings.Copies.ToString() + " --- " + newDocName);

                    if (!printDocument.PrinterSettings.IsValid)
                    {
                        printDocument.PrinterSettings.PrinterName = iniFilePrinter;

                        if(!printDocument.PrinterSettings.IsValid)
                        {
                            printDocument.PrinterSettings.PrinterName = defaultPrinterName;
                        }
                    }

                    MessageBox.Show("After: " + printDocument.PrinterSettings.Copies.ToString() + " --- " + newDocName);

                    printDocument.Print();
                }
            }
        }
        catch (Exception ex) {
            MessageBox.Show(ex.Message);
        }

从未触发异常,每次尝试打印都会成功。在满足条件时也会更改 if/else 中的副本数,并且MessageBox.Show()代码的部分确实会立即显示预期的副本数(2、3、7,除了 1 之外的任何值,当它不应该是 1 时)在调用printDocument.Print().

我还尝试过从其他各种程序(MS Word、各种自定义应用程序、PDF 阅读器等)打印不相关的文档,副本数一直是 1。但是,像 Google Chrome 或 FireFox 这样的软件可以打印出来在指定的份数中。

我在想,打印机的设置可能会导致它忽略发送的份数。基于这个假设,我检查了所有打印机的设置,发现份数实际上设置为 1。

如果这确实是我的问题的原因,我该如何绕过该设置(而不实际更改它),Google Chrome 和 Firefox 似乎能够做到这一点?我知道我可能会以编程方式更改该限制(将其设置为我的份数,然后在打印完成后将其更改回原始值),但这似乎不是正确的做法.

编辑

我通过包含一个打印对话框来扩展我的代码,如下所示:

                PrintDialog printDlg = new PrintDialog();
                printDlg.Document = printDocument;
                printDlg.AllowSelection = true;
                printDlg.AllowSomePages = true;

                if (printDlg.ShowDialog() == DialogResult.OK)
                {
                    printDocument.Print();
                }

尽管如此,结果是相同的——即使用户在打印对话框中更改了份数,打印机也会忽略它们。相同的代码在另一台(本地)打印机上测试,连接到不相关的 Windows 10 PC,并且对话框中的副本数量没有被忽略。

我还注意到我的应用程序中的打印对话框和 notepad.exe 中的打印对话框不同(下图)。有没有办法让我调用 notepad.exe 使用的相同打印对话框?我想这样做的原因是因为完成了工作(打印对话框中的 xy 份数,打印的 xy 份数)。

在此处输入图像描述

4

0 回答 0