C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#打印PDF

C#实现高效打印PDF文档的示例代码

作者:Eiceblue

PDF作为现代办公的标准格式,其打印需求无处不在,本文将全面解析PDF打印的基础操作,并深入介绍多种自动打印方法,希望可以帮助大家大幅提升工作效率

一、基础打印操作详解

通过Adobe Acrobat Reader 打印(最常用)

1.打开PDF:使用 Acrobat Reader 或其他PDF阅读器打开文件。

2.访问打印设置:

3.核心设置项:

a.打印机选择:从下拉菜单选择目标设备

b.打印范围:

c.页面处理:

d.注释和表单:决定是否打印文档中的批注、表单域内容等。

e.高级选项:

作为图像打印:解决字体或格式异常问题(但可能降低质量)。

4.执行打印:确认设置后点击“打印”。

关键提示:打印前务必在预览窗口检查最后一页内容,避免因格式问题导致空白页或内容缺失!

浏览器打印(无需安装软件)

在Chrome/Firefox/Edge中打开PDF

快捷键 “Ctrl + P” 调出打印界面

设置基础打印参数 如打印份数、打印范围、页面方向、缩放比例等。

一些关键设置:

二、自动打印方法

当需要定时、批量或无人值守打印时,手动操作效率低下。以下是两种自动化方案:

方案1:借助Print Conductor 软件批量自动打印

Print Conductor 是一款高效的批量打印工具,用户只需将多个 PDF 文件拖入其界面,配置打印参数(如打印机选择、份数、页面范围、双面模式等),即可一键自动按序打印所有文档,大幅简化重复性打印任务。

方法2:通过 C# 编程实现自动打印(免费.NET库)

在.NET 开发领域中,有时可能会需要将打印 PDF 的功能集成到应用程序中。这个时候可以借助国产 免费库 Free Spire.PDF for .NET  通过C# 代码实现PDF文档打印,无需安装Adobe。(需注意免费版有页数限制)

安装免费.NET库:在 “NuGet包管理器” 中搜索 “FreeSpire.PDF” 并安装。

基本PDF打印示例:下面是一个简单C#代码演示了如何将指定的 PDF 文件打印到系统默认的打印机上:

using Spire.Pdf;
 
namespace PrintWithDefaultPrinter
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建一个 PdfDocument 对象
            PdfDocument pdf = new PdfDocument();
 
            // 加载一个 PDF 文件
            pdf.LoadFromFile("示例文档.pdf");
 
            // 打印到默认打印机
            pdf.Print();
 
            // 清理资源
            pdf.Dispose();
 
        }
    }
}

除了简单打印之外, 该免费PDF库还支持自定义打印设置,例如选择特定的打印机设置打印页面范围调整打印份数静默打印将不同页面打印到不同纸盒

方法补充

C# 打印PDF的常用方法

1.使用默认程序打印

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Printing;
using System.IO;
using System.Runtime.InteropServices;

namespace PDF
{
    public static class PrintHelper
    {
        #region 打印机操作核心方法

        /// <summary>
        /// // 设置默认打印机
        /// </summary>
        /// <param name="Name"></param>
        /// <returns></returns>
        [DllImport("winspool.drv")]
        public static extern bool SetDefaultPrinter(String Name);

        /// <summary>
        /// 获取系统默认打印机名称
        /// </summary>
        public static string DefaultPrinterName()
        {
            PrintDocument fPrintDocument = new PrintDocument();
            return fPrintDocument.PrinterSettings.PrinterName;
        }

        /// <summary>
        /// 获取本机所有打印机列表
        /// </summary>
        public static List<string> GetLocalPrinters()
        {
            List<string> fPrinters = new List<string>();
            fPrinters.Add(DefaultPrinterName());

            foreach (string fPrinterName in PrinterSettings.InstalledPrinters)
            {
                if (!fPrinters.Contains(fPrinterName))
                {
                    fPrinters.Add(fPrinterName);
                }
            }
            return fPrinters;
        }

        /// <summary>
        /// 设置指定打印机为默认打印机
        /// </summary>
        public static bool SetLocalPrinter(string defaultPrinter)
        {
            foreach (string item in GetLocalPrinters())
            {
                if (item.Contains(defaultPrinter))
                {
                    return SetDefaultPrinter(item);
                }
            }
            return false;
        }

        #endregion

        /// <summary>
        /// 打印
        /// 通过系统关联程序打印文件
        /// 需注意的是,这种方式依赖于文件类型的默认关联程序
        /// </summary>
        public static void PrintByDefaultProcess(string LocalPath)
        {
            Process p = new Process();
            ProcessStartInfo startInfo = new ProcessStartInfo
            {
                CreateNoWindow = true,
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = true,
                FileName = LocalPath,
                Verb = "print",  // 它会调用与文件类型关联的默认应用程序来执行打印文件,如Adobe Reader或者word或图片查看器或其他PDF阅读器进行打印
                Arguments = $"/p /h \"{LocalPath}\" \"{DefaultPrinterName()}\"",
                //WorkingDirectory = Path.GetDirectoryName(Application.ExecutablePath)   // 设置工作目录为应用程序启动目录
            };
            p.StartInfo = startInfo;
            p.Start();
            p.WaitForExit(5); // 等待5秒钟,确保打印任务已提交
        }
    }
}

需要注意的是,它虽然是一种简单且常用的方法。但这种方法依赖于系统关联的默认应用程序来处理打印任务,适用于大多数情况,但存在一些限制和潜在问题。如pdf后缀没有关联默认程序会报错。

所以我一般不会使用这种方式。

下面会罗列其他的方法和优缺点

2.使用命令行工具(如 Adobe Reader 的 /t 参数)​

public static void PrintWithAdobeCommandLine(string filePath, string printerName)
{
    string adobePath = @"C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe";
    Process.Start(adobePath, $"/t \"{filePath}\" \"{printerName}\"");
}

优点​:绕过默认应用程序,强制使用 Adobe Reader。

​缺点​:需硬编码 Adobe 路径,可能因版本或安装位置不同失效。

3.直接调用 Adobe Acrobat 的 COM 接口

如果系统中安装了 Adobe Acrobat Pro,可以通过 COM 对象直接控制打印:

using Adobe.Acrobat;

public static void PrintWithAdobePdf(string filePath)
{
    Acrobat.AcroApp app = new Acrobat.AcroApp();
    Acrobat.AcroAVDoc avDoc = new Acrobat.AcroAVDoc();

    if (avDoc.Open(filePath, ""))
    {
        Acrobat.AcroPDDoc pdDoc = (Acrobat.AcroPDDoc)avDoc.GetPDDoc();
        pdDoc.PrintPages(0, 0, 0, 0, 0, 0, 0); // 参数需根据需求调整
        avDoc.Close(true);
    }
    app.Exit();
}

优点​:直接控制 Adobe 软件,可靠性高。

​缺点​:依赖 Adobe Acrobat Pro,非免费版;需处理 COM 引用和资源释放。

4. 使用 .NET 的 PrintDocument 类​

结合 System.Drawing 处理 PDF(需将 PDF 渲染为图像):

public static void PrintPdfAsImage(string filePath)
{
    using (var document = PdfDocument.Load(filePath)) // 需要 PdfiumViewer 或其他库
    {
        var printDoc = new System.Drawing.Printing.PrintDocument();
        printDoc.PrintPage += (sender, e) =>
        {
            e.Graphics.DrawImage(document.RenderToImage(), e.MarginBounds);
            e.HasMorePages = false;
        };
        printDoc.Print();
    }
}

**优点​:纯 .NET 实现。

缺点​:**渲染质量依赖库,可能丢失文本选中等特性。

到此这篇关于C#实现高效打印PDF文档的示例代码的文章就介绍到这了,更多相关C#打印PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文