设置 - 本地 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 份数)。