C#使用Free Spire.PDF for .NET实现为PDF文档添加页码

 更新时间:2026年07月08日 08:28:35   作者:咕白m625  
在文档管理场景中,为PDF文件添加页码是一项常见需求,本文将介绍如何使用 Free Spire.PDF for .NET 免费库,通过 C# 码为现有PDF文档批量添加页码,文中的示例代码讲解详细,有需要的小伙伴可以了解下

一、背景与需求

在文档管理场景中,为PDF文件添加页码是一项常见需求。无论是财务报表、项目文档还是合同协议,规范的页码都能显著提升文档的可读性和专业性。手动为每页添加页码不仅效率低下,还容易出错。对于 .NET 开发者而言,利用 C# 实现 PDF 页码的自动化插入,是提升文档处理效率的有效途径。

本文将介绍如何使用 Free Spire.PDF for .NET 免费库,通过 C# 码为现有PDF文档批量添加页码。

二、环境准备

2.1 安装方式

Free Spire.PDF for .NET 可通过NuGet直接安装:

dotnet add package FreeSpire.PDF

或在Visual Studio的包管理器控制台中执行:

Install-Package FreeSpire.PDF

2.2 命名空间引用

代码中需要引入以下命名空间:

using Spire.Pdf;
using Spire.Pdf.Graphics;
using Spire.Pdf.AutomaticFields;
using System.Drawing;

三、核心实现

动态字段方式利用 PdfPageNumberFieldPdfPageCountFieldPdfCompositeField 三个类组合实现页码的自动生成与渲染。

  • PdfPageNumberField:显示当前页码
  • PdfPageCountField:显示文档总页数
  • PdfCompositeField:将多个动态字段组合为一个复合字段

以下是完整的实现代码:

using Spire.Pdf;
using Spire.Pdf.AutomaticFields;
using Spire.Pdf.Graphics;
using System.Drawing;

namespace AddPageNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 加载PDF文档
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("示例文档.pdf");

            // 2. 创建字体(建议使用系统中存在的通用字体)
            PdfTrueTypeFont font = new PdfTrueTypeFont("宋体", 10f, PdfFontStyle.Regular, true);

            // 3. 创建页码字段和总页数字段
            PdfPageNumberField pageNumber = new PdfPageNumberField();
            PdfPageCountField pageCount = new PdfPageCountField();

            // 4. 组合字段,格式为"第X页,共Y页"(支持中文)
            PdfCompositeField compositeField = new PdfCompositeField(
                font, 
                PdfBrushes.Black, 
                "第 {0} 页 / 共 {1} 页", 
                pageNumber, 
                pageCount);

            // 5. 设置页码位置(基于第一页尺寸,通常各页尺寸一致)
            //    定位到页面底部居中靠左,距左边距72点(1英寸),距底边45点
            float leftMargin = 72f;
            float bottomMargin = 45f;
            SizeF pageSize = pdf.Pages[0].Size;   // 获取基准页面尺寸
            compositeField.Location = new PointF(leftMargin, pageSize.Height - bottomMargin);

            // 6. 遍历每一页,在页面底部绘制页码
            for (int i = 0; i < pdf.Pages.Count; i++)
            {
                PdfPageBase page = pdf.Pages[i];
                // 使用无参 Draw,自动应用 Location
                compositeField.Draw(page.Canvas);
            }

            // 7. 保存文档
            pdf.SaveToFile("添加页码后的文档.pdf");
            pdf.Close();
            pdf.Dispose();
        }
    }
}

四、高级定制

4.1 页码格式自定义

通过修改 PdfCompositeField 的格式化字符串,可以灵活调整页码的显示格式:

// 中文格式
"第 {0} 页 / 共 {1} 页"

// 英文格式
"Page {0} of {1}"

// 简单格式
"{0}/{1}"

4.2 页码位置控制

页码的位置可通过 Location 属性精确控制。

示例1:底部居中

// 需要先测量文本宽度,再计算居中坐标
string sampleText = "第 999 页 / 共 999 页";  // 最宽情况
SizeF textSize = font.MeasureString(sampleText);
float x = (pageSize.Width - textSize.Width) / 2;
float y = pageSize.Height - bottomMargin;
compositeField.Location = new PointF(x, y);

示例2:底部右侧

float rightMargin = 72f;
string sampleText = "第 999 页 / 共 999 页";
SizeF textSize = font.MeasureString(sampleText);
float x = pageSize.Width - textSize.Width - rightMargin;
float y = pageSize.Height - bottomMargin;
compositeField.Location = new PointF(x, y);

示例3:页眉居中

float topMargin = 30f;
string sampleText = "第 999 页 / 共 999 页";
SizeF textSize = font.MeasureString(sampleText);
float x = (pageSize.Width - textSize.Width) / 2;
float y = topMargin;
compositeField.Location = new PointF(x, y);

4.3 页码样式调整

字体、颜色、大小等样式均可自定义:

// 设置字体为 Arial、12号、粗体
PdfTrueTypeFont font = new PdfTrueTypeFont("Arial", 12f, PdfFontStyle.Bold, true);

// 设置颜色为蓝色
PdfBrush brush = PdfBrushes.Blue;

4.4 处理不同尺寸的页面

如果PDF中各页面尺寸不一致,应逐页获取尺寸并计算位置:

for (int i = 0; i < pdf.Pages.Count; i++)
{
    PdfPageBase page = pdf.Pages[i];
    SizeF pageSize = page.Size;
    // 根据当前页尺寸计算位置
    float x = (pageSize.Width - textWidth) / 2;
    float y = pageSize.Height - bottomMargin;
    compositeField.Location = new PointF(x, y);
    compositeField.Draw(page.Canvas);
}

五、注意事项

1. 免费版限制:Free Spire.PDF 社区版对处理页数有一定限制(通常为10页以内),适用于小型文档。

2. 字体支持:使用 PdfTrueTypeFont 时需要确保指定的字体在系统中可用,否则可能出现渲染异常。

3. 坐标系统:页面画布的坐标系原点位于左上角X轴向右为正,Y轴向下为正。使用 Location 属性时,默认以文本的左上角为定位点。因此,Location.Y 值越大,文本位置越靠下。本文示例中通过 pageSize.Height - bottomMargin 计算底部位置,正是基于这一坐标系。

4. 文本宽度测量:当需要居中或右对齐时,使用 font.MeasureString() 获取文本宽度,建议以最长的页码格式(如“第 999 页 / 共 999 页”)为基准进行测量,避免因页码位数变化导致位置偏移。

5. 文档保存:建议使用 SaveToFile 方法保存为新文件,避免覆盖原始文档造成数据丢失。

6. 资源释放:处理完成后调用 Dispose() 方法释放文档占用的资源,确保内存安全。

六、总结

通过以上示例,开发者可以用简洁的 C# 代码实现 PDF 文档的批量页码添加。采用 PdfCompositeField 动态字段方式,可以灵活定制“第X页,共Y页”等丰富格式,并通过 Location 属性精确控制页码位置。该方式稳定可靠,适用于各类文档处理场景。在实际开发中,注意字体选择、坐标计算以及免费版的页数限制,即可快速为PDF文档添加规范的页码,提升文档的专业性和可读性。

到此这篇关于C#使用Free Spire.PDF for .NET实现为PDF文档添加页码的文章就介绍到这了,更多相关C# PDF添加页码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# 断点续传的实现

    c# 断点续传的实现

    这篇文章主要介绍了c# 断点续传的实现,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • C# 基础入门--注释

    C# 基础入门--注释

    本文主要介绍了C#中注释的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • C#基础语法:方法参数详解

    C#基础语法:方法参数详解

    这篇文章主要介绍了C#基础语法:方法参数详解,本文讲解了值参数、引用参数、输出参数、参数数组等参数类型,并分别给出代码实例,需要的朋友可以参考下
    2015-06-06
  • MessageBox的Buttons和三级联动效果

    MessageBox的Buttons和三级联动效果

    这篇文章主要介绍了MessageBox的Buttons和三级联动的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • C#学习笔记之适配器模式详解

    C#学习笔记之适配器模式详解

    这篇文章主要为大家详细介绍了C#学习笔记之适配器模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • C#多线程开发实战记录之线程基础

    C#多线程开发实战记录之线程基础

    线程是一个独立的运行单元,每个进程内部有多个线程,每个线程可以各自同时执行指令,每个线程有自己独立的栈,但是与进程内的其他线程共享内存,这篇文章主要给大家介绍了关于C#多线程开发实战记录之线程基础的相关资料,需要的朋友可以参考下
    2021-09-09
  • C#中环境变量示例详解

    C#中环境变量示例详解

    环境变量是操作系统中存储的一种机制,用于保存与操作系统环境和应用程序运行相关的配置信息,在 C# 中,可以使用 Environment.GetEnvironmentVariable 方法来获取特定环境变量的值,下面给大家介绍C#中环境变量示例代码,一起看看吧
    2024-05-05
  • 使用TypeScript开发微信小程序的方法

    使用TypeScript开发微信小程序的方法

    TypeScript是C#之父Anders Hejlsberg的又一力作,很多喜欢c#语法的朋友对typescript都爱不释手,今天小编给大家介绍下TypeScript开发微信小程序的方法,感兴趣的朋友一起看看吧
    2016-11-11
  • C#客户端程序调用外部程序的3种实现方法

    C#客户端程序调用外部程序的3种实现方法

    这篇文章主要给大家介绍了关于C#客户端程序调用外部程序的3种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • C#操作Excel的多种方式小结

    C#操作Excel的多种方式小结

    在项目开发过程和办公过程中,经常要遇到对Excel进行创建,读写等操作,本文为大家整理了一些C#操作Excel的方法,感兴趣的小伙伴可以了解一下
    2024-11-11

最新评论