如何在C#中实现文档列表的有序批量打印?
解决批量打印顺序混乱的问题
原代码问题分析
你当前的实现是通过逐个启动独立的打印进程来处理任务,即便加入了WaitForExit和固定延迟Thread.Sleep(5000),当任务量达到100+时,打印机驱动仍可能根据文档处理成本(比如小文档更快完成渲染)调整队列优先级,最终导致打印顺序混乱。这种基于独立进程的打印方式无法保证严格的提交顺序被打印机遵守。
可行解决方法
方法1:通过打印队列直接按顺序提交任务
使用System.Printing命名空间的API,直接将文档按顺序添加到目标打印机的队列中,利用打印队列的原生顺序保证机制,避免独立进程带来的不确定性。
using System.Printing; using System.IO; // ... PrintDialog printDialog = new PrintDialog(); DialogResult dialogResult = printDialog.ShowDialog(); if (dialogResult == DialogResult.OK) { // 获取目标打印机队列 string targetPrinter = printDialog.PrinterSettings.Name; PrintQueue printQueue = new PrintQueue(new PrintServer(), targetPrinter); foreach (Datei datei in dateienList.Where(d => d.dateiAuswählen)) { // 按指定份数重复提交 for (int copyIdx = 0; copyIdx < datei.anzahlKopien; copyIdx++) { // 将文件直接加入打印队列,保持提交顺序 PrintSystemJobInfo printJob = printQueue.AddJob(Path.GetFileName(datei.pfad), datei.pfad, false); // 统一设置较低优先级,避免被其他插队任务干扰 printJob.Priority = 1; } } }
方法2:统一使用PrintDocument处理(需对应文档类型库支持)
针对不同类型的文档(如PDF、Office文件),使用对应的库解析内容后,通过PrintDocument统一提交打印任务,确保任务按代码顺序执行。以PDF为例,使用PdfSharp库实现:
using PdfSharp.Pdf; using PdfSharp.Pdf.IO; using PdfSharp.Drawing; using System.Drawing.Printing; using System.IO; // ... PrintDialog printDialog = new PrintDialog(); DialogResult dialogResult = printDialog.ShowDialog(); if (dialogResult == DialogResult.OK) { foreach (Datei datei in dateienList.Where(d => d.dateiAuswählen)) { string ext = Path.GetExtension(datei.pfad).ToLower(); if (ext == ".pdf") { PdfDocument pdfDoc = PdfReader.Open(datei.pfad, PdfDocumentOpenMode.Import); PrintDocument printDoc = new PrintDocument(); printDoc.PrinterSettings = printDialog.PrinterSettings; printDoc.PrinterSettings.Copies = (short)datei.anzahlKopien; // 绑定打印页渲染逻辑 printDoc.PrintPage += (sender, e) => { PdfPage pdfPage = pdfDoc.Pages[e.PageSettings.PrintRange.Page - 1]; XGraphics gfx = XGraphics.FromGraphics(e.Graphics, e.PageBounds); gfx.DrawPage(pdfPage, new XRect(0, 0, e.PageBounds.Width, e.PageBounds.Height)); }; // 执行打印 printDoc.Print(); } // 其他文档类型(如Word/Excel)可通过OpenXML SDK或Office Interop实现类似逻辑 } }
关键注意事项
- 移除原代码中
Thread.Sleep(5000)这类不可靠的固定延迟,改用打印队列或PrintDocument的原生同步机制保证顺序。 - 方法1无需解析文档内容,兼容性更强,但需确保目标打印机支持直接打印对应文件格式。
- 方法2需要针对不同文档类型引入对应处理库,但能更精准控制打印过程。
内容的提问来源于stack exchange,提问作者LFLJM
相关产品推荐
相关产品推荐

