前言
本文主要是关于PDF文件的打印。
这里大体分为三种方案
调用系统支持文件所对应的软件打印。
这种方式可以支持所有可打印的文件,只要安装打开对应文件的软件即可。
当软件需要支持多种文件打印的时候使用。
使用特定的软件打印。
这种方式只能打印特定格式,不会出现同样的文件打开方式被更改而导致打印效果不好的情况。
当打印格式固定,但是要求效果精细的时候使用。
使用DLL打印。
这种方式在打印普通文件没问题,但是打印点阵的时候,因为内部会把点阵转为图片,所以会占用很大的内存,效果也不好。
打印格式固定,文件效果不要求特别精细,但是不需要用户设置打印属性,自动打印的时候使用。
Aspose.PDF、Spire.Pdf、PDFRender4NET都是这种形式,优缺点也都一样。
调用打印命令打印
这种方法会使用文件在系统中默认的打开工具打开进行打印。
这种方式
缺点在于
- 需要下载PDF阅读器,并且将其设置文件的默认打开方式。
- 必须设置默认的打印机(可以代码中设置)。
- 不能同时打印多份。
- 没有设置默认PDF的打开软件的时候会报错。
优点
- 不用安装额外的库。
- 如果打印的精度较高的情况下,调用其他库打印的效果没有这种调用专门软件打印的效果好。
工具类
1 | namespace z_pdf_printer.Utils |
下载PDF查看软件
系统默认浏览器下载
1 | string fileurl="https://xhkjedu.oss-cn-huhehaote.aliyuncs.com/runtime/AcroRdrDC1900820071_zh_CN.exe"; |
IE下载
1 | string fileurl="https://xhkjedu.oss-cn-huhehaote.aliyuncs.com/runtime/readerdc_cn_ha_crd_install.exe"; |
这里上传了两个安装包地址如下
在线安装包地址
https://xhkjedu.oss-cn-huhehaote.aliyuncs.com/runtime/readerdc_cn_ha_crd_install.exe
离线安装包地址
https://xhkjedu.oss-cn-huhehaote.aliyuncs.com/runtime/AcroRdrDC1900820071_zh_CN.exe
调用AcroRdrDC打印
上面的方式有个弊端,就是我们设置的默认软件可能被其他软件更换,就导致高精度打印的时候,使用的并不是我们设置的软件。
工具类
1 | /// <summary> |
自动下载安装和重启
这种方式能自动下载AcroRd32并安装,但是部分软件会拦截应用自动安装软件。
1 | /// <summary> |
只下载
这种方式只下载,让用户安装。
1 | public static void InstallAcroRd32ByUser() |
命令行
命令行文档
https://www.robvanderwoude.com/commandlineswitches.php#Acrobat
关闭GUI
1 | taskkill /IM "acrord32.exe" /F |
打印命令
1 | AcroRd32.exe /t "C:\Path\To\Your\File.pdf" "PrinterName" |
所有参数
以下是AcroRd32.exe打印的所有参数:
1 | acrord32.exe /t path printername drivername monitorname [options] |
其中:
path:要打印的文件的路径。
printername:指定要使用的打印机的名称。
drivername:指定要使用的驱动程序的名称。
monitorname:指定所使用的端口监视器的名称。
options:可选参数,用于设置打印作业的其他选项。可以使用以下任意一个选项:
/h
:隐藏Acrobat Reader窗口。/n
:禁止Acrobat Reader显示打印对话框。/s
:打印作业无需确认。/o
:打印作业完成后退出Acrobat Reader。/p
:打印作业完成后立即退出Acrobat Reader。
静默打印
后边的第一个是文件路径 第二个是打印机名称
1 | AcroRd32.exe /N /T "D:\Tools\微课打印PDF\空白.pdf" "Microsoft Print to PDF" |
只打开文件
1 | AcroRd32.exe "D:\Tools\微课打印PDF\空白.pdf" |
弹出打印窗口(推荐)
这种方式能够打印多份和设置各种其他属性。
1 | AcroRd32.exe /P "D:\Tools\微课打印PDF\空白.pdf" |
使用Aspose.PDF打印
这种方式在打印高精度的PDF时直接崩溃了。其他PDF没问题。
安装
1 | Install-Package Aspose.PDF -Version 19.1.0 |
工具类
1 | using System.IO; |
使用Spire.Pdf库打印
这种方式
缺点
- 需要引用库。
- 精度较高的文件打印的效果不好。
- 进度较高的文件在打印机队列里数据量太大,达到200-300多M。
优点
- 可以设置打印的数量及其他打印参数。
添加依赖
1 | Install-Package Spire.PDF -Version 9.6.0 |
示例
1 | public static void Print(string pdfPath, string printerName) |
设置自适应方式
按实际尺寸打印
1 | doc.PrintSettings.SelectSinglePageLayout(PdfSinglePageScalingMode.ActualSize, true); |
自适应
1 | //需要选择FitSize打印模式 |
设置打印页面范围
1 | doc.PrintSettings.SelectPageRange(1, 5); |
打印不连续的页面
1 | doc.PrintSettings.SelectSomePages(new int[] { 1, 3, 5, 7 }); |
静默打印
1 | doc.PrintSettings.PrintController = new StandardPrintController(); |
双面打印
1 | //判断打印机是否支持双面打印 |
黑白打印
1 | //黑白打印PDF文档 |
打印多份
1 | //设置打印份数为2份 |
一页为多页/多页为一页
调用PdfPrintSettings类的SelectMultiPageLayout方法将一个PDF文档的多张页面打印到一张纸上。
1 | //将PDF文档的每两张页面打印到一张纸上(排版格式为1行,2列) |
PdfPrintSettings类的SelectSplitPageLayout方法支持将一个PDF文档的单张页面打印到多张纸上。
该方法是根据A4纸的标准尺寸595pt*842pt
对PDF页面进行拆分,超过该大小的页面,打印时其超过部分将会被打印到下一张纸。
1 | //将PDF文档的单张页面根据标准页面大小进行拆分并打印 |
自定义纸张大小
保持原来页面大小打印到PDF
1 | //获取原文档第一页的纸张大小,这里的单位是Point |
将原来A4的文档打印成A3的大小。
1 | //加载需要打印的PDF文档 |
使用PDFRender4NET打印
这一种和前面的方式优缺点一致
需要引用O2S.Components.PDFRender4NET.dll
1 | using O2S.Components.PDFRender4NET; |
ComboBox数据源及事件
在C#中,可以通过以下步骤将数据源绑定到ComboBox控件:
定义数据源,可以是列表、数组或其他集合:
创建ComboBox并设置数据源:1
2List<string> dataSource = new List<string> { "Item1", "Item2", "Item3" };
MyCb.ItemsSource = dataSource;
这时选中的值和显示的值一样
1 | //选中的值 |
也可以设置显示字段和值字段,如果数据源是对象列表:
1 | List<Product> products = new List<Product> { |
绑定SelectionChanged事件来获取选择的值:1
2
3
4
5
6
7
8
9MyCb.SelectionChanged +=
(
s,
e
) =>
{
string text = MyCb.Text;
// ...
};
也可以在代码中设置选中项:1
2MyCb.SelectedIndex = 0; // 选中第一项
MyCb.SelectedValue = 2; // 选中Id为2的项
以上就是在C#中将数据源绑定到ComboBox并获取选择值的主要步骤。除此之外,也可以设置ComboBox的各种属性,如是否可编辑、是否下拉显示选项列表等。
总结一下主要的属性和事件:
- ItemsSource: 设置数据源
- DisplayMemberPath: 显示字段
- SelectedValuePath: 值字段
- SelectedIndex/SelectedValue: 获取或设置选中项