当前位置: 首页 > article >正文

如何在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


http://www.kler.cn/a/419292.html

相关文章:

  • MySQL 核心基础 | Pandaer杂货铺
  • 树莓派5+文心一言 -> 智能音箱
  • uniapp input只输入一个字符就自动失去焦点
  • Mybatis:CRUD数据操作之删除一行数据
  • 设计模式---建造者模式
  • 11、数组
  • CAD深度清理工具-AVappsDrawingPurge9.0.0(2024.8.27版本) 支持版本CAD2022-2025-供大家学习研究参考
  • 挑战用React封装100个组件【007】
  • LabVIEW实现串口调试助手
  • Linux驱动开发基础(有源蜂鸣器模块)
  • 跨地域 SD-WAN 网络专线解决方案
  • RabbitMq死信队列(详解)
  • 构建鸿蒙5.0应用(一)
  • 13 设计模式之外观模式(家庭影院案例)
  • JavaScript(JS)的对象
  • 「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)
  • python:windows无法使用cx_Oracle模块
  • 【k8s深入理解之 Scheme 补充-4】理解资源的内外部版本(存放位置不同、版本转换函数自动生成、版本新增字段等)
  • C++11(下)
  • Pinia管理用户数据
  • 【Unity-摩擦力】
  • 【K8s】【部署】集群部署
  • 4.3_CMS漏洞
  • 区块链学习笔记(2)--区块链的交易模型part1
  • 每日速记10道java面试题04
  • transformer学习笔记-词嵌入embedding原理