C# 打印PDF文件之使用不同打印机打印所有页面或部分页面
最近在逛国外各大编程社区论坛的时候,发现很多人都在问一个关于PDF文件打印的问题:打印时如何选择非默认打印机并设置打印页面的范围。而一般情况下,打印时选择的打印机是默认打印机,打印页面范围是所有页面,如果要选择其他打印机或打印部分页面,需要对代码进行一定的设置。通过在百度和各大网站上查找资料,终于在MSDN上找到了一个解决方案,我把它在这里分享出来,让其他有同样需求的朋友少走点冤枉路。
在该解决方案中我使用了一个免费的PDF控件,感兴趣的博友可以从Codeplex官网:https://freepdf.codeplex.com上下载。
下面是该解决方案的详细代码分步解析:
第一步:添加项目引用。
安装控件后,创建一个新的项目,找到控件的安装目录,在项目的“解决方案”窗口右击->添加引用,选择和项目.NET Framework版本对应的dll文件进行添加;
如下图:
第二步:使用命名空间。
在该方案中,我使用的命名空间如下:
|
1
2
3
|
using Spire.Pdf;
using System.Windows.Forms;
using System.Drawing.Printing;
|
第三步:创建一个新的PDF文档,并加载待打印的PDF文件。
|
1
2
|
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("sample.pdf");
|
如果需要使用默认打印机打印所有页面,请看第四步。如果需要使用其他打印机并设置打印页面范围,请看第五步。
第四步:使用默认打印机打印所有页面。
|
1
|
doc.PrintDocument.Print();
|
第五步:选择打印机和设置打印页面范围。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
PrintDialog dialogPrint = new PrintDialog();
dialogPrint.AllowPrintToFile = true;
dialogPrint.AllowSomePages = true;
dialogPrint.PrinterSettings.MinimumPage = 1;
dialogPrint.PrinterSettings.MaximumPage = doc.Pages.Count;
dialogPrint.PrinterSettings.FromPage = 1;
dialogPrint.PrinterSettings.ToPage = doc.Pages.Count;
if (dialogPrint.ShowDialog() == DialogResult.OK)
{
//设置打印的起始页码
doc.PrintFromPage = dialogPrint.PrinterSettings.FromPage;
//设置打印的终止页码
doc.PrintToPage = dialogPrint.PrinterSettings.ToPage;
//选择打印机
doc.PrinterName = dialogPrint.PrinterSettings.PrinterName;
PrintDocument printDoc = doc.PrintDocument;
dialogPrint.Document = printDoc;
printDoc.Print();
}
|
运行项目,输出的效果图如下(打印机和打印页面范围可以自己选择):
全部代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
using Spire.Pdf;
using System.Windows.Forms;
using System.Drawing.Printing;
namespace PrintPDF
{
class Program
{
static void Main(string[] args)
{
PdfDocument doc = new PdfDocument();
doc.LoadFromFile("sample.pdf");
//选择默认打印机打印所有页面
//doc.PrintDocument.Print();
//选择打印机并设置打印页面范围
PrintDialog dialogPrint = new PrintDialog();
dialogPrint.AllowPrintToFile = true;
dialogPrint.AllowSomePages = true;
dialogPrint.PrinterSettings.MinimumPage = 1;
dialogPrint.PrinterSettings.MaximumPage = doc.Pages.Count;
dialogPrint.PrinterSettings.FromPage = 1;
dialogPrint.PrinterSettings.ToPage = doc.Pages.Count;
if (dialogPrint.ShowDialog() == DialogResult.OK)
{
doc.PrintFromPage = dialogPrint.PrinterSettings.FromPage;
doc.PrintToPage = dialogPrint.PrinterSettings.ToPage;
doc.PrinterName = dialogPrint.PrinterSettings.PrinterName;
PrintDocument printDoc = doc.PrintDocument;
dialogPrint.Document = printDoc;
printDoc.Print();
}
}
}
}
|
以上是我亲测以后觉得可用的方案,放在这里供大家参考,如果有什么不周到的地方,希望大家不吝赐教,谢谢!
打印都能实现,但是怎么能静默打印,不弹出打印设置页面呢
var doc = new PdfDocument();
doc.LoadFromFile("E:\\Sample1.pdf");
PrintDocument printDoc = doc.PrintDocument;
printDoc.PrintController = new StandardPrintController(); printDoc.Print();
doc.Close();
参考这段代码吧。
——————————————————————————
教育是什么,教育就是把你记住的东西全部忘记后,剩下的那些品质就是教育的实质。只有高考结束后才是你自己人生个性的开始,大学以前的教育全部是共性教育。
pharmar 2 年前北京时间2020年2月22日晚9点,沃伦·巴菲特发表了致股东信。他表示,我们不断寻求收购符合三个标准的新企业。首先,它们的净有形资本必须取得良好回报。其次,它们必须由能干而诚实的管理者管理。最后,它们必须以合理的价格买到。
pharmar 2020-02-25 09:03初效过滤器:初阻力≤29.42Pa(3mm水柱),主要滤>10μm粒子。中效:初阻力≤98.07Pa(10mm水柱),主要滤1~10μm粒子。亚高效:初阻力≤147.1Pa(15mm水柱),主要滤<5μm粒子。高效:初阻力≤245.17Pa(25mm水柱),主要滤<1μm粒子。
pharmar 2015-07-18 16:58哪些传感器或探头可以不用计量所校验:性能稳定且不易改变的低值易耗计量器具。其它与质量、EHS等无直接关系的较低准确度的仪表,只作入账管理,失准或损坏更换。
pharmar 2015-04-26 11:25哪些传感器或探头可以不用计量所校验:开关量一般不需要校准;还有一些精度比较低、不太关键的……也可以不校准;D级(首次校准终生使用,用坏即更换) 在设备上仅起指示作用,没有准确度要求的计量器具。 使用环境恶劣、寿命短、低值易耗的无严格准确度要求的计量器具。
pharmar 2015-04-26 11:25| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |