在 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页面内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论