如何在WPF中打印PDF文件

最近遇到有客户需要打印PDF的需求,这里分享一下两种解决方案:

1、使用"谓词(verb)"

当用户右键单击 Shell 对象(如文件)时,Shell 会显示 (上下文) 菜单的快捷方式。 此菜单包含一个命令列表,用户可以选择这些命令对项执行各种操作。 这些命令也称为快捷菜单项或谓词。 可以自定义快捷菜单。

当我们在创建进程时,Verb 指定为print 时,系统会到注册表寻找当前类型文件的注册程序节点下的shell/print/command,并执行其中的命令。

例如我本地默认的PDF打开程序是Foxit Reader,当使用下面的代码执行时:

复制代码
1 Process p = new Process( );
2 p.StartInfo = new ProcessStartInfo( )
3 {
4     CreateNoWindow = true,
5     Verb = "print",
6     FileName = path //PDF文件路径
7 };
8 p.Start( );

系统会找到如下路径:

计算机\HKEY_CLASSES_ROOT\FoxitReader.Document\shell\print\command

并调用里面的命令:

%1代表的是文件路径。

2、使用PdfiumViewer库

PdfiumViewer 库是一个基于PDFium 项目的PDF查看器。项目地址:GitHub - pvginkel/PdfiumViewer: PDF viewer based on Google's PDFium.

PDFiumChrome 所使用的的PDF渲染引擎。项目地址:GitHub - chromium/pdfium: The PDF library used by the Chromium project

使用示例代码如下:

复制代码
 1   public bool PrintPDF(string printer,string paperName,int copies, Stream stream, Duplex duplex)
 2   {
 3       try
 4       {
 5           var printerSettings = new PrinterSettings
 6           {
 7               PrinterName = printer,
 8               Copies = (short)copies,
 9               Duplex = duplex
10           };
11 
12           var pageSettings = new PageSettings(printerSettings)
13           {
14               Margins = new Margins(0, 0, 0, 0),
15           };
16 
17           foreach (PaperSize paperSize in printerSettings.PaperSizes)
18           {
19               if (paperSize.PaperName == paperName)
20               {
21                   pageSettings.PaperSize = paperSize;
22                   break;
23               }
24           }
25 
26           using (var document = PdfiumViewer.PdfDocument.Load(stream))
27           {
28               using (var printDocument = document.CreatePrintDocument())
29               {
30                   printDocument.PrinterSettings = printerSettings;
31                   printDocument.DefaultPageSettings = pageSettings;
32                   printDocument.PrintController = new StandardPrintController();
33                   printDocument.Print();
34               }
35           }
36           return true;
37       }
38       catch (Exception ex)
39       {
40           return false;
41       }
42   }

注意:需要配合PdfiumViewer.Native.x86_64.v8-xfa包使用,这是PDFium的运行时文件。

方法1简单方便,但是不支持设置打印机参数。

参考资料:

https://stackoverflow.com/questions/5566186/print-pdf-in-c-sharp

https://stackoverflow.com/questions/6103705/how-can-i-send-a-file-document-to-the-printer-and-have-it-print

相关推荐
cosinmz2 小时前
PDF 发票合并经验分享:月初高效整理发票的实用方法
经验分享·小程序·pdf·pdf转换·pdf发票合并·发票合并打印
一个博客2 小时前
pdf-viewer 实现预览pdf文件
开发语言·javascript·pdf
代码小库2 小时前
免费在线简历工具「面试帮」——18 款模板 + PDF 导出
面试·职场和发展·pdf
庖丁AI2 小时前
文档比对工具怎么选?Word、PDF、扫描件差异检测思路
pdf·word·扫描件·文档比对
asdzx6711 小时前
使用 Python 快速提取 PDF 中的表格
python·pdf
南风微微吹14 小时前
2026英语六级作文模版万能句子PDF电子版
pdf·英语六级
又是被bug折磨的一天15 小时前
对多个pdf合同文件批量命名
pdf
南风微微吹16 小时前
2026年英语四级作文模版万能句子PDF电子版
pdf·英语四级
这是个假程序员19 小时前
PDF分色、智能PDF黑彩识别工具
pdf
夜勤月19 小时前
HarmonyOS 6.0 ArkWeb实战:PDF背景色自定义功能全解析(附完整代码+避坑指南)
华为·pdf·harmonyos