Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码

搜索了这么多有关 PDF 合并的信息后,很容易发现,无论您在线合并 PDF 文件还是使用 C#/VB.NET 来实现此任务,您都无法逃避对 PDF 文件安全等一些重要问题的担忧,因此需要花费多少时间或者合并后的文件是否支持打印页码等等。不过,只要来到这里,这些烦恼就不会出现。本节将专门向您介绍一种安全的解决方案,通过 .NET PDF 组件 Spire.PDF for .NET,使用 C#、VB.NET 将 PDF 文件合并为一个。

Spire.PDF for .NET 是一款独立 PDF 控件,用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 Spire.PDF 类库,开发人员可以新建一个 PDF 文档或者对现有的 PDF 文档进行处理,且无需安装 Adobe Acrobat。

E-iceblue 功能类库Spire 系列文档处理组件均由中国本土团队研发,不依赖第三方软件,不受其他国家的技术或法律法规限制,同时适配国产操作系统如中科方德、中标麒麟等,兼容国产文档处理软件 WPS(如 .wps/.et/.dps 等格式(qun:767755948)

Spire.PDF for.net下载   Spire.PDF for java下载

Spire.PDF for .NET使用 C# 从头开始构建,使程序员和开发人员能够在 .NET 应用程序中创建、读取、编写和操作 PDF 文档,而无需使用 Adobe Acrobat 或任何外部库。使用Spire.PDF for .NET,您不仅可以快速合并PDF文件,还可以打印带有页码的PDF页面。现在请预览下面的有效截图:

合并 PDF 文档

在执行以下步骤之前,请下载Spire.PDF for .NET并将其安装在系统上。

步骤1:您可以使用String数组保存将要合并为一个PDF的三个PDF文件的名称并演示Spire.Pdf.PdfDocument数组。然后,加载三个 PDF 文件并选择第一个PdfDocument,以便将第二个和第三个 PDF 文件合并到其中。为了将第二个 PDF 文件中的所有页面导入到第一个 PDF 文件中,您需要调用方法public void AppendPage(PdfDocument doc)。另外,通过调用另一个方法public PdfPageBase InsertPage(PdfDocument doc, int pageIndex),可以将第三个 PDF 文件的每一页导入到第一个 PDF 文件中。

[C#]

private void button1_Click(object sender, EventArgs e)
{
//pdf document list
String[] files = new String[]
{
@"..\PDFmerge0.pdf",
@"..\ PDFmerge1.pdf",
@"..\ PDFmerge2.pdf"
};
//open pdf documents
PdfDocument[] docs = new PdfDocument[files.Length];
for (int i = 0; i < files.Length; i++)
{
docs[i] = new PdfDocument(files[i]);
}
//append document
docs[0].AppendPage(docs[1]);//import PDF pages
for (int i = 0; i < docs[2].Pages.Count; i = i + 2)
{
docs[0].InsertPage(docs[2], i);
}

【VB.NET】

//set PDF magin
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
PdfMargins margin = new PdfMargins();
margin.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Bottom = margin.Top;
margin.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Right = margin.Left;
this.DrawPageNumber(docs[0].Pages, margin, 1, docs[0].Pages.Count);private void DrawPageNumber(PdfPageCollection pages, PdfMargins margin, int startNumber, int pageCount)
{
foreach (PdfPageBase page in pages)
{
page.Canvas.SetTransparency(0.5f);
PdfBrush brush = PdfBrushes.Black;
PdfPen pen = new PdfPen(brush, 0.75f);
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 9f, System.Drawing.FontStyle.Italic), true);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Right);
format.MeasureTrailingSpaces = true;
float space = font.Height * 0.75f;
float x = margin.Left;
float width = page.Canvas.ClientSize.Width - margin.Left - margin.Right;
float y = page.Canvas.ClientSize.Height - margin.Bottom + space;
page.Canvas.DrawLine(pen, x, y, x + width, y);
y = y + 1;
String numberLabel
= String.Format("{0} of {1}", startNumber++, pageCount);
page.Canvas.DrawString(numberLabel, font, brush, x + width, y, format);
page.Canvas.SetTransparency(1);
}
}

步骤2:在第一个PDF文件中绘制页码。在此步骤中,您可以通过调用 Spire.Pdf.Graphics 类来设置 PDF 页码边距。 pdf页边距。然后,调用自定义方法DrawPageNumber(PdfPageCollection pages, PdfMargins margin, int startNumber, int pageCount ) 在第一个 PDF 的每个页面的底部添加页码。详细代码请看下面

[C#]

//set PDF margin
PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
PdfMargins margin = new PdfMargins();
margin.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Bottom = margin.Top;
margin.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
margin.Right = margin.Left;
this.DrawPageNumber(docs[0].Pages, margin, 1, docs[0].Pages.Count);private void DrawPageNumber(PdfPageCollection pages, PdfMargins margin, int startNumber, int pageCount)
{
foreach (PdfPageBase page in pages)
{
page.Canvas.SetTransparency(0.5f);
PdfBrush brush = PdfBrushes.Black;
PdfPen pen = new PdfPen(brush, 0.75f);
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 9f, System.Drawing.FontStyle.Italic), true);
PdfStringFormat format = new PdfStringFormat(PdfTextAlignment.Right);
format.MeasureTrailingSpaces = true;
float space = font.Height * 0.75f;
float x = margin.Left;
float width = page.Canvas.ClientSize.Width - margin.Left - margin.Right;
float y = page.Canvas.ClientSize.Height - margin.Bottom + space;
page.Canvas.DrawLine(pen, x, y, x + width, y);
y = y + 1;
String numberLabel
= String.Format("{0} of {1}", startNumber++, pageCount);
page.Canvas.DrawString(numberLabel, font, brush, x + width, y, format);
page.Canvas.SetTransparency(1);
}
}

[VB.NET]

'set PDF margin
Dim unitCvtr As New PdfUnitConvertor()
Dim margin As New PdfMargins()
margin.Top = unitCvtr.ConvertUnits(2.54F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Bottom = margin.Top
margin.Left = unitCvtr.ConvertUnits(3.17F, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point)
margin.Right = margin.Left
Me.DrawPageNumber(docs(0).Pages, margin, 1, docs(0).Pages.Count)Private Sub DrawPageNumber(pages As PdfPageCollection, margin As PdfMargins, startNumber As Integer, pageCount As Integer)
For Each page As PdfPageBase In pages
page.Canvas.SetTransparency(0.5F)
Dim brush As PdfBrush = PdfBrushes.Black
Dim pen As New PdfPen(brush, 0.75F)
Dim font As New PdfTrueTypeFont(New Font("Arial", 9F, System.Drawing.FontStyle.Italic), True)
Dim format As New PdfStringFormat(PdfTextAlignment.Right)
format.MeasureTrailingSpaces = True
Dim space As Single = font.Height * 0.75F
Dim x As Single = margin.Left
Dim width As Single = page.Canvas.ClientSize.Width - margin.Left - margin.Right
Dim y As Single = page.Canvas.ClientSize.Height - margin.Bottom + space
page.Canvas.DrawLine(pen, x, y, x + width, y)
y = y + 1
Dim numberLabel As [String] = [String].Format("{0} of {1}", System.Math.Max(System.Threading.Interlocked.Increment(startNumber),startNumber - 1), pageCount)
page.Canvas.DrawString(numberLabel, font, brush, x + width, y, format)
page.Canvas.SetTransparency(1)
Next
End Sub

当您乍一看时,PDF合并代码可能会很长,实际上,如果您不需要在合并的PDF中添加页码,则应该避免第二步。然而,在很多情况下,页码为用户阅读PDF以及打印PDF带来了很大的便利。 Spire.PDF for .NET 可以满足您合并 PDF 文件和在合并的 PDF 文件中添加页码的需求。

以上便是如何查找并删除 PDF 中的空白页,如果您有其他问题也可以继续浏览本系列文章,获取相关教程~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python深度学习033:Python、PyTorch、CUDA和显卡驱动之间的关系

Python、PyTorch、CUDA和显卡驱动之间的关系相当紧密,它们共同构成了一个能够执行深度学习模型的高效计算环境。下面是它们之间关系的简要概述: Python Python 是一种编程语言,广泛用于科学计算、数据分析和机器学习。它是开发和运行PyTorch代码的基础环境。PyTorch PyTorc…

VSCode中6个AI顶级插件

Visual Studio Code (VSCode) 是通往一系列 AI 驱动的编码支持的门户。探索精心挑选的 VSCode 顶级扩展&#xff0c;这些扩展利用人工智能的强大功能&#xff0c;包括 GitHub Copilot、TabNine 等著名工具。 1. GitHub Copilot&#xff1a;你的强人工智能结对程序员 GitHub Co…

【Frida】【Android】 07_爬虫之网络通信库HttpURLConnection

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

Word、Excel、PPT文件转PDF文件(C#)

一、添加依赖 为wpf项目引用Microsoft.Office.Interop.Excel、Microsoft.Office.Interop.PowerPoint、Microsoft.Office.Interop.Word、Office&#xff0c;依赖文件已经打到源代码包里了。 二、先定义一些命名空间 using Word Microsoft.Office.Interop.Word;using Excel M…

零基础入门转录组数据分析——DESeq2差异分析

零基础入门转录组数据分析——DESeq2差异分析 目录 零基础入门转录组数据分析——DESeq2差异分析1. 转录组分析基础知识2. DESeq2差异分析&#xff08;Rstudio&#xff09;3. 结语 1. 转录组分析基础知识 1.1 什么是转录组&#xff1f; 转录组&#xff08;transcriptome&#…

n1.线性表及其实现

1.引入—多项式表示 对于多项式&#xff0c;如何使用程序进行编写呢&#xff1f; 方法一&#xff1a;一维数组。下标对应未知数的指数&#xff0c;元素个体对应系数。缺点就是都得全部表示&#xff0c;系数为0项的存在浪费空间。例如&#xff0c;x只有一次方和2000次方&#…

MySQL、Oracle查看字节和字符长度个数的函数

目录 0. 总结1. MySQL1.1. 造数据1.2. 查看字符/字节个数 2. Oracle2.1. 造数据2.2. 查看字符/字节个数 0. 总结 databasecharacterbyteMySQLchar_length()length()Oraclelength()lengthB() 1. MySQL 1.1. 造数据 drop table if exists demo; create table demo (id …

手机一键换ip地址,解锁网络自由

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着移动互联网的快速发展&#xff0c;手机用户对于网络安全和隐私保护的需求也日益增强。其中&#xff0c;IP地址作为手机在网络中的标识&#xff0c;扮演着重要的角色。有时&#xff0c;出于隐私保护或网络…

std::deque(双端队列)

std::deque&#xff08;双端队列&#xff09;是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它提供了在队列的两端进行插入和删除操作的高效实现。std::deque 可以被视为一个固定大小的数组&#xff0c;但它可以动态增长和缩减&#xff0c;且不需要在…

关于oracle切换mysql8总结

最近由于项目换库&#xff0c;特此记录 1.字段类型 number(8) -> int(8) number(16) -> bigint(16) varchar2() -> varchar() 2.导数据 从oracle迁移数据到mysql&#xff0c;除了用专门的数据泵&#xff0c;经常需要用csv导入到mysql&#xff1b; 导出的csv数据如果…

【bugfix】如何解决svg到线上显示空白或者svg的viewBox为空

svgo的默认机制是当width和height和viewbox一样会删除viewbox&#xff0c;这都是为了svg的压缩做的&#xff0c;详情可以看issue中的讨论&#xff0c;我们可以通过更改babel的配置来解决 https://github.com/svg/svgo/issues/1128 https://github.com/ant-design/ant-design-we…

WebSocket用户验证

在WebSocket中&#xff0c;如何携带用户的验证信息 一、在OnMessage中进行验证 客户端在连接到服务器后&#xff0c;客户端通过发送消息&#xff0c;服务器端在OnMessage方法中&#xff0c;进行信息验证&#xff0c;这种方式需要将用户身份验证及接收用户消息进行混合处理&am…

Python人工智能:推动气象科学研究与技术进步的新动力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

竞赛常考的知识点大总结(七)图论

最短路 最短路问题&#xff08;Shortest Path Problem&#xff09;是图论中的一个经典问题&#xff0c;它要求在给定的图中找到两个顶点之间的最短路径。最短路问题可以是单源最短路问题&#xff08;从一个顶点到其他所有顶点的最短路径&#xff09;或所有对最短路问题&#x…

Oracle 数据库中的全文搜索

Oracle 数据库中的全文搜索 0. 引言1. 整体流程2. 创建索引2-1. 创建一个简单的表2-2. 创建文本索引2-3. 查看创建的基础表 3. 运行查询3-1. 运行文本查询3-2. CONTAINS 运算符3-3. 混合查询3-4. OR 查询3-5. 通配符3-6. 短语搜索3-7. 模糊搜索&#xff08;Fuzzy searches&…

详细解释Javaweb、Spring和Spring Boot对数据库的使用

在传统的Javaweb中&#xff0c;对数据库进行访问通常使用JDBC&#xff08;Java Database Connectivity&#xff09;来实现。以下是一个简单的示例&#xff0c;演示如何使用JDBC连接数据库并执行查询操作&#xff1a; java import java.sql.Connection; import java.sql.Drive…

2021-08-06

yarn的简介&#xff1a; Yarn是facebook发布的一款取代npm的包管理工具。 yarn的特点&#xff1a; 速度超快。 Yarn 缓存了每个下载过的包&#xff0c;所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率&#xff0c;因此安装速度更快。超级安全。 在执行代码…

ChatGPT技巧分享:如何用AI提升学术写作水平

ChatGPT无限次数:点击直达 ChatGPT技巧分享&#xff1a;如何用AI提升学术写作水平 在当今信息爆炸的时代&#xff0c;学术写作是一个重要的技能&#xff0c;但如何提高自己的学术写作水平呢&#xff1f;AI技术的发展为我们提供了更多可能&#xff0c;其中ChatGPT作为一种强大的…

Redis性能瓶颈与安全隐患排查验证纪实

在写《Redis怎样保证数据安全&#xff1f;》这篇文章&#xff0c;我是有对redis设置密码需要哪些步骤&#xff0c;设置密码的性能损耗有验证的。这就涉及到要对redis的配置做修改。 开始时我是打算采用直接使用redis配置文件的方式。所以我从redis官网下载了一个默认的配置文件…

ROS 2边学边练(9)-- 用launch命令管理启动项

概念 我们在前面的ROS 2体验过程中&#xff0c;一直拿小海龟这个例子来练手&#xff0c;过程比较轻松&#xff0c;因为只有两个节点&#xff08;/turtlesim和/teleop_turtle&#xff09;&#xff0c;只需打开两个终端&#xff0c;ros2 run 节点就ok&#xff0c;但&#xff0c;现…