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#串口通信总是丢数据的原因及解决方案

    在上位机开发中,串口通信是一个非常常见的通信方式,尤其是在与嵌入式设备、PLC、传感器等硬件设备进行交互时,串口通信简单、直接且广泛应用,但它也有自己的局限性,那么,为什么你的C#串口通信总是丢数据?本文将深度分析串口通信丢数据的原因,并提供一些有效的解决方案
    2025-02-02
  • C#下使用XmlDocument操作XML详解

    C#下使用XmlDocument操作XML详解

    本文详细讲解了C#使用XmlDocument操作XML的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#实现快速排序算法

    C#实现快速排序算法

    本文详细讲解了C#实现快速排序算法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • DataGridView自定义单元格表示值、Error图标显示的方法介绍

    DataGridView自定义单元格表示值、Error图标显示的方法介绍

    这篇文章介绍了DataGridView自定义单元格表示值、Error图标显示的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • WPF中的ListBox实现按块显示元素的方法

    WPF中的ListBox实现按块显示元素的方法

    这篇文章主要介绍了WPF中的ListBox实现按块显示元素的方法,涉及ListBox属性设置相关操作技巧,需要的朋友可以参考下
    2016-09-09
  • C#连接数据库的几种方法

    C#连接数据库的几种方法

    这篇文章介绍了C#连接数据库的几种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 浅析C# AsyncLocal如何实现Thread间传值

    浅析C# AsyncLocal如何实现Thread间传值

    这篇文章主要是来和大家一起讨论一下C# AsyncLocal如何实现Thread间传值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • C# 禁用鼠标中间键的方法

    C# 禁用鼠标中间键的方法

    关于 C# System.Windows.Forms.NumericUpDown 控件,如何禁用鼠标中间键?
    2013-03-03
  • C#汉字转拼音实例(支持多音字)

    C#汉字转拼音实例(支持多音字)

    几年前就在网上看到过汉字转拼音的程序,大都就是按汉字的编码转换,单字对应的算法实现的。但是都有一个共同的缺点,不能支持多音字。本篇文章主要介绍了C#汉字转拼音实例(支持多音字),有兴趣的可以了解一下。
    2016-12-12
  • 基于WPF实现弹幕效果的示例代码

    基于WPF实现弹幕效果的示例代码

    这篇文章主要为大家详细介绍了如何利用WPF实现弹幕效果,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2022-09-09

最新评论