.NET 6中如何无需外部进程实现PDF打印?
.NET无外部进程PDF打印实现方案
.NET标准库的局限
.NET自带的PrintDocument类本身不支持直接解析和打印PDF文件,它仅负责将自定义绘制的内容(如文本、图形)发送到打印机。如果要通过它打印PDF,必须先自行实现PDF内容的渲染逻辑(将PDF页面转换为可绘制的图像/图形对象),但.NET标准库没有内置PDF解析能力,因此单独使用PrintDocument无法完成需求。
MIT协议开源库推荐
以下是几个符合MIT协议、可直接在进程内处理PDF打印的开源库:
PdfiumViewer
基于Google的Pdfium库开发,支持直接加载PDF并生成PrintDocument对象,无需额外渲染步骤,使用简单:
- 安装NuGet包:
PdfiumViewer - 示例代码:
using PdfiumViewer; using System.Drawing.Printing; public void PrintPdf(string pdfFilePath, string targetPrinter) { using var pdfDoc = PdfDocument.Load(pdfFilePath); using var printDoc = pdfDoc.CreatePrintDocument(); printDoc.PrinterSettings.PrinterName = targetPrinter; // 可选:配置打印参数(页码范围、份数等) // printDoc.PrinterSettings.FromPage = 1; // printDoc.PrinterSettings.ToPage = pdfDoc.PageCount; // printDoc.PrinterSettings.Copies = 2; printDoc.Print(); }
PdfSharpCore
一款.NET跨平台PDF处理库,可将PDF页面渲染为GDI+图形后通过PrintDocument打印:
- 安装NuGet包:
PdfSharpCore - 示例代码:
using PdfSharpCore.Drawing; using PdfSharpCore.Pdf; using System.Drawing.Printing; public void PrintPdfViaRender(string pdfFilePath, string targetPrinter) { using var pdfDoc = PdfReader.Open(pdfFilePath, PdfDocumentOpenMode.Import); var printDoc = new PrintDocument { PrinterSettings = { PrinterName = targetPrinter } }; printDoc.PrintPage += (sender, e) => { var pageIndex = e.PageSettings.PrintableArea.Page; if (pageIndex < pdfDoc.PageCount) { var pdfPage = pdfDoc.Pages[pageIndex]; using var gfx = XGraphics.FromGraphics(e.Graphics, new XSize(e.PageBounds.Width, e.PageBounds.Height)); gfx.DrawPage(pdfPage, 0, 0); } }; printDoc.Print(); }
方案对比
相比你之前通过ProcessStartInfo调用外部阅读器的方式,上述开源库方案无需依赖外部进程,避免了进程等待、强制终止等不确定问题,打印逻辑完全可控。
内容的提问来源于stack exchange,提问作者Eagle
相关产品推荐
相关产品推荐

