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

 更新时间:2025年06月22日 08:15:00   作者:Eiceblue  
PDF作为现代办公的标准格式,其打印需求无处不在,本文将全面解析PDF打印的基础操作,并深入介绍多种自动打印方法,希望可以帮助大家大幅提升工作效率

一、基础打印操作详解

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

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

2.访问打印设置:

  • 快捷键:Ctrl + P
  • 按钮:工具栏上的打印机图标

3.核心设置项:

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

b.打印范围:

  • 所有页面:打印整个文档
  • 当前视图:打印屏幕显示区域
  • 指定页面:输入如"1,3-5"打印第1页和第3-5页

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C#制作一个颜色拾取器

    基于C#制作一个颜色拾取器

    这篇文章主要为大家详细介绍了如何基于C#制作一个颜色拾取器,可以获取屏幕上任意位置像素的色值,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2024-01-01
  • 详解C#如何实现一个事件总线

    详解C#如何实现一个事件总线

    Event Bus(事件总线)是一种用于在应用程序内部或跨应用程序组件之间进行事件通信的机制,它允许不同的组件通过发布和订阅事件来进行解耦和通信,本文给大家介绍了C# 如何实现一个事件总线,需要的朋友可以参考下
    2024-10-10
  • Unity3d实现跑马灯广播效果

    Unity3d实现跑马灯广播效果

    这篇文章主要为大家详细介绍了Unity3d实现跑马灯广播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 解读C#中ReadString的一些小疑惑

    解读C#中ReadString的一些小疑惑

    这篇文章主要介绍了关于C#中ReadString的一些小疑惑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#抓取当前屏幕并保存为图片的方法

    C#抓取当前屏幕并保存为图片的方法

    这篇文章主要介绍了C#抓取当前屏幕并保存为图片的方法,实例分析了C#操作图片的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#读取多条数据记录导出到Word之图片输出改造

    C#读取多条数据记录导出到Word之图片输出改造

    这篇文章主要为大家详细介绍了C#读取多条数据记录并导出到Word标签模板中的图片输出问题,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-11-11
  • c# 进程之间的线程同步

    c# 进程之间的线程同步

    这篇文章主要介绍了c# 进程之间的线程同步,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-10-10
  • Unity3D Ui利用shader添加效果

    Unity3D Ui利用shader添加效果

    这篇文章主要为大家详细介绍了Unity3D Ui利用shader添加效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • c#基础之数组与接口使用示例(遍历数组 二维数组)

    c#基础之数组与接口使用示例(遍历数组 二维数组)

    本文主要介绍了c#基础知识中的数组与接口使用方法,结合示例,大家一看就明白
    2014-01-01
  • C# WPF 父控件通过使用可视化树找到子控件的示例代码

    C# WPF 父控件通过使用可视化树找到子控件的示例代码

    这篇文章主要介绍了C# WPF 父控件通过使用可视化树找到子控件的示例代码,需要的朋友可以参考下
    2018-08-08

最新评论