C#代码实现复制PDF页面

 更新时间:2026年05月14日 15:07:46   作者:咕白m625  
在 PDF 处理任务中,页面复制是一项常见需求,本文将介绍如何通过 C# 代码,利用该库实现同文档复制、跨文档复制以及多页面批量复制,有需要的小伙伴可以参考下

在 PDF 处理任务中,页面复制是一项常见需求:从某个 PDF 中提取一页或多页生成新文档,在同一文档内重复使用封面页,或将不同来源的页面合并到同一文件。Free Spire.PDF for .NET (Install-Package FreeSpire.PDF) 是一款可用于 .NET 平台的免费 PDF 操作库,提供了基本的页面创建、读取和绘制能力,能够满足小型 PDF(10 页以内)的页面复制需求。

本文将介绍如何通过 C# 代码,利用该库实现同文档复制、跨文档复制以及多页面批量复制。

核心 API 简介

本文采用组件原生模板绘制机制实现页面复制,这种方法避免了直接操作页面引用可能引起的状态异常,并且能够灵活控制目标页面的尺寸和边距。

核心 API 如下:

  • PdfDocument:PDF 文档核心操作类,用于加载、创建、保存 PDF 文档;
  • PdfPageBase:页面基类,用于获取源页面、创建新页面;
  • PdfTemplate:页面模板类,将源页面完整封装为可复用模板;
  • PdfPageBase.CreateTemplate():将指定页面创建为模板(保留所有页面内容);
  • PdfCanvas.DrawTemplate():将模板绘制到新页面,完成页面复制;
  • Pages.Add() / Pages.Insert():在文档末尾添加页面 / 指定位置插入页面。

关键规则:PDF 页面索引从 0 开始计数(第 1 页索引 = 0,第 2 页索引 = 1)。

场景一:同一 PDF 文档内部复制页面

需求:在同一个 PDF 文档中,复制指定页面,支持追加到文档末尾或插入到指定位置。

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

namespace DuplicatePage
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 初始化文档对象,using语句自动释放资源
                using (PdfDocument pdf = new PdfDocument())
                {
                    // 加载源PDF文件
                    pdf.LoadFromFile("input.pdf");

                    // 获取需要复制的源页面(第1页)
                    PdfPageBase sourcePage = pdf.Pages[0];
                    // 获取源页面尺寸
                    SizeF pageSize = sourcePage.Size;

                    // 基于源页面创建可复用模板(完整保留文本、图片、格式等内容)
                    PdfTemplate pageTemplate = sourcePage.CreateTemplate();

                    // ================= 两种复制方式二选一 =================
                    // 方式1:在文档末尾添加新页面(与源页面尺寸一致,无边距)
                    PdfPageBase newPage = pdf.Pages.Add(pageSize, new PdfMargins(0));

                    // 方式2:在指定索引位置插入新页面(示例:插入到第2页位置,索引1)
                    // PdfPageBase newPage = pdf.Pages.Insert(1, pageSize, new PdfMargins(0));

                    // 将模板绘制到新页面,完成复制
                    newPage.Canvas.DrawTemplate(pageTemplate, new PointF(0, 0));

                    // 保存文档
                    pdf.SaveToFile("CopyPDFPages.pdf");
                }
                Console.WriteLine("同文档页面复制完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"复制失败:{ex.Message}");
            }
            Console.ReadKey();
        }
    }
}

说明

  • 边距 PdfMargins(0) 确保内容紧贴页面边界,避免出现不必要的白边。
  • 绘制起始点 (0,0) 使模板内容位于新页面左上角。

场景二:跨文档复制页面(源文档 → 目标文档)

需求:将一个 PDF 文档的指定页面,复制到另一个现有 PDF 文档中。

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

namespace CopyPageToAnother
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 加载源PDF文档(提供需要复制的页面)
                using (PdfDocument sourcePdf = new PdfDocument())
                // 加载目标PDF文档(接收复制的页面)
                using (PdfDocument targetPdf = new PdfDocument())
                {
                    sourcePdf.LoadFromFile("input1.pdf");
                    targetPdf.LoadFromFile("input2.pdf");

                    // 获取源文档的第1页
                    PdfPageBase sourcePage = sourcePdf.Pages[0];
                    SizeF pageSize = sourcePage.Size;

                    // 创建源页面模板
                    PdfTemplate pageTemplate = sourcePage.CreateTemplate();

                    // 在目标文档指定位置插入新页面(示例:插入到第1页,索引0)
                    PdfPageBase newPage = targetPdf.Pages.Insert(0, pageSize, new PdfMargins(0));

                    // 绘制模板到目标文档新页面
                    newPage.Canvas.DrawTemplate(pageTemplate, new PointF(0, 0));

                    // 保存最终文档
                    targetPdf.SaveToFile("CopyPagesToAnotherPDF.pdf");
                }
                Console.WriteLine("跨文档页面复制完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"复制失败:{ex.Message}");
            }
            Console.ReadKey();
        }
    }
}

若希望将页面追加到目标文档末尾,可使用 Add 方法替代 Insert

场景三:复制多个页面到新文档

将一个源文档中的多个页面(如第 1、3、5 页)提取出来,生成一个新的 PDF 文件。

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

namespace CopyMultiPagesToNewDoc
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 加载源PDF文档
                using (PdfDocument sourceDoc = new PdfDocument())
                // 创建空白的新目标文档
                using (PdfDocument newDoc = new PdfDocument())
                {
                    sourceDoc.LoadFromFile("input1.pdf");

                    // ================= 配置:复制不连续页面(自定义索引数组) =================
                    int[] pageIndexes = new int[] { 0, 2, 4 }; // 复制第1、3、5页

                    // 遍历指定页面并复制
                    foreach (int index in pageIndexes)
                    {
                        PdfPageBase sourcePage = sourceDoc.Pages[index];
                        SizeF pageSize = sourcePage.Size;
                        PdfTemplate template = sourcePage.CreateTemplate();

                        // 新文档添加页面并绘制模板
                        PdfPageBase newPage = newDoc.Pages.Add(pageSize, new PdfMargins(0));
                        newPage.Canvas.DrawTemplate(template, new PointF(0, 0));
                    }

                    // 保存文档
                    newDoc.SaveToFile("CopyMultiplePages.pdf");
                }
                Console.WriteLine("多页复制完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"复制失败:{ex.Message}");
            }
            Console.ReadKey();
        }
    }
}

高级技巧与注意事项

页面尺寸与缩放控制

上述示例均使用源页面的原始尺寸创建目标页面。如果需要缩放内容,可以在调用 DrawTemplate 时指定缩放变换:

newPage.Canvas.Save();
newPage.Canvas.ScaleTransform(0.5f, 0.5f); // 缩小到50%
newPage.Canvas.DrawTemplate(template, new PointF(0, 0));
newPage.Canvas.Restore();

注意缩放会影响所有绘制内容的位置,可能需要配合偏移调整。

保留交互元素(表单、注释、书签)

CreateTemplate 方法捕获的是页面的绘图内容,对于 AcroForm 字段、批注、书签等高层交互元素,不保证完全复制。

性能优化

  • 复用 PdfDocument 实例:如果需要将多个来源的页面复制到同一个目标文档,可以只创建一个目标文档对象,循环添加页面,最后统一保存。
  • 避免在循环中重复加载和保存同一文档。

本文提供了三种最常用的 PDF 页面复制场景,开发者只需掌握创建模板→新建页面→绘制模板三步核心逻辑,配合页面索引、插入 / 追加方法,即可灵活实现页面复制需求。

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

相关文章

  • c# 闭包的相关知识以及需要注意的地方

    c# 闭包的相关知识以及需要注意的地方

    这篇文章主要介绍了c# 闭包的相关知识以及需要注意的地方,文中讲解非常细致,代码帮助大家理解和学习,感兴趣的朋友可以参考下
    2020-06-06
  • C#入门之索引器使用实例

    C#入门之索引器使用实例

    这篇文章主要介绍了C#的索引器使用方法,对此,C#初学者应予以牢固掌握,需要的朋友可以参考下
    2014-08-08
  • c#创建浮动工具栏功能示例

    c#创建浮动工具栏功能示例

    这篇文章主要介绍了c#创建浮动工具栏功能示例,大家参考使用吧
    2013-12-12
  • VS里使用C#制作窗口应用的项目实践

    VS里使用C#制作窗口应用的项目实践

    C#窗体的频率使用特别高,本文主要介绍了VS里使用C#制作窗口应用的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • WPF+ASP.NET SignalR实现后台通知功能的示例代码

    WPF+ASP.NET SignalR实现后台通知功能的示例代码

    本文以一个简单示例,简述如何通过WPF+ASP.NET SignalR实现消息后台通知以及数据的实时刷新,仅供学习分享使用,如有不足之处,还请指正
    2022-09-09
  • Unity控制指针旋转到指定位置

    Unity控制指针旋转到指定位置

    这篇文章主要为大家详细介绍了Unity控制指针旋转到指定位置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • 详解C#如何在不同工作簿之间复制选定单元格区域

    详解C#如何在不同工作簿之间复制选定单元格区域

    处理Excel文档时,我们经常需要将数据整合到一个工作表以便于我们进行管理或数据对比。本文将演示如何通过编程方式将选定的单元格区域从一个工作簿复制到另一个工作簿
    2023-02-02
  • C# 读写编辑INI文件的操作

    C# 读写编辑INI文件的操作

    INI就是扩展名为"INI"的文件,其实他本身是个文本文件,可以用记事本打开,主要存放的是用户所做的选择或系统的各种参数,这篇文章主要介绍了C#读写编辑INI文件的操作,需要的朋友可以参考下
    2023-05-05
  • C#实现tostring转换成16进制的方法

    C#实现tostring转换成16进制的方法

    本文介绍了在C#中将整数、字节数组、字符串转换为十六进制字符串,以及将十六进制字符串转换回整数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • 浅谈C# 类的继承

    浅谈C# 类的继承

    本文主要介绍了C# 类的继承相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论