C# 合并和拆分PDF文件
一、合并和拆分PDF文件的方式
PDF文件使用了工业标准的压缩算法,易于传输与储存。它还是页独立的,一个PDF文件包含一个或多个“页“,可以单独处理各页,特别适合多处理器系统的工作。PDF文件结构主要可以分为四个部分:首部、文件体、交叉引用表、尾部。PDF操作类非常多,如下图所示,常用的操作PDF文件的类库有:Spire.Pdf、iTextSharp。

二、使用 Spire.Pdf 合并和拆分PDF文件
使用 Nuget 添加Spire.Pdf 类库,然后添加如下代码:
1 /// <summary>
2 /// 合并PDF文件
3 /// </summary>
4 /// <param name="files">待合并文件列表</param>
5 /// <param name="outFile">合并生成的文件名称</param>
6 static void SpirePdfMerge(string[] files, string outFile)
7 {
8 var doc = Spire.Pdf.PdfDocument.MergeFiles(files);
9 doc.Save(outFile, FileFormat.PDF);
10 }
11
12 /// <summary>
13 /// 按每页拆分PDF文件
14 /// </summary>
15 /// <param name="inFile">待拆分PDF文件名称</param>
16 static void SpirePdfSplit(string inFile)
17 {
18 var doc = new Spire.Pdf.PdfDocument(inFile);
19 doc.Split("SpirePdf_拆分-{0}.pdf");
20 doc.Close();
21 }
三、使用 iTextSharp 合并和拆分PDF文件
使用使用 Spire.Pdf 操作PDF文件,使用简单高效,但生成的PDF文件带有水印,使用破解版在第一页还是有水印,可以使用 Nuget 添加 iTextSharp 类库,该类库生成的PDF无水印,具体使用如下:
1 /// <summary>
2 /// 合并PDF文件
3 /// </summary>
4 /// <param name="inFiles">待合并文件列表</param>
5 /// <param name="outFile">合并生成的文件名称</param>
6 static void iTextSharpPdfMerge(List<String> inFiles, String outFile)
7 {
8 using (var stream = new FileStream(outFile, FileMode.Create))
9 {
10 using (var doc = new Document())
11 {
12 using (var pdf = new PdfCopy(doc, stream))
13 {
14 doc.Open();
15 inFiles.ForEach(file =>
16 {
17 var reader = new PdfReader(file);
18 for (int i = 0; i < reader.NumberOfPages; i++)
19 {
20 var page = pdf.GetImportedPage(reader, i + 1);
21 pdf.AddPage(page);
22 }
23 pdf.FreeReader(reader);
24 reader.Close();
25 });
26 }
27 }
28 }
29 }
30
31 /// <summary>
32 /// 按每页拆分PDF文件
33 /// </summary>
34 /// <param name="inFile">待拆分PDF文件名称</param>
35 static void iTextSharpPdfSplit(string inFile)
36 {
37 using (var reader = new PdfReader(inFile))
38 {
39 // 注意起始页是从1开始的
40 for (int i = 1; i <= new PdfReader(inFile).NumberOfPages; i++)
41 {
42 using (var sourceDocument = new Document(reader.GetPageSizeWithRotation(i)))
43 {
44 var pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream($"iTextSharp_拆分_{i}.pdf", System.IO.FileMode.Create));
45 sourceDocument.Open();
46 var importedPage = pdfCopyProvider.GetImportedPage(reader, i);
47 pdfCopyProvider.AddPage(importedPage);
48 }
49 }
50 }
51 }
四、测试结果
完整代码如下:
1 using Spire.Pdf;
2 using System;
3 using System.Collections.Generic;
4 using System.IO;
5 using System.Linq;
6 using System.Net.Mime;
7 using System.Text;
8 using System.Threading.Tasks;
9 using iTextSharp.text;
10 using iTextSharp.text.pdf;
11 using PdfDocument = iTextSharp.text.pdf.PdfDocument;
12
13 namespace Pdf
14 {
15 class Program
16 {
17 static void Main(string[] args)
18 {
19 try
20 {
21 SpirePdfMerge(Directory.GetFiles("Merge"), "SpirePdfMerge.pdf");
22 Console.WriteLine("使用 Spire.Pdf 合并文件完成...");
23
24 SpirePdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\1.pdf");
25 Console.WriteLine("使用 Spire.Pdf 拆分文件完成...");
26
27 iTextSharpPdfMerge(Directory.GetFiles("Merge").ToList(), "iTextSharpPdfMerge.pdf");
28 Console.WriteLine("使用 iTextSharp 合并文件完成...");
29
30 iTextSharpPdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\2.pdf");
31 Console.WriteLine("使用 iTextSharp 拆分文件完成...");
32
33 }
34 catch (Exception e)
35 {
36 Console.WriteLine(e);
37 }
38 finally
39 {
40 Console.ReadKey();
41 }
42 }
43
44 #region Spire.Pdf
45
46 /// <summary>
47 /// 合并PDF文件
48 /// </summary>
49 /// <param name="files">待合并文件列表</param>
50 /// <param name="outFile">合并生成的文件名称</param>
51 static void SpirePdfMerge(string[] files, string outFile)
52 {
53 var doc = Spire.Pdf.PdfDocument.MergeFiles(files);
54 doc.Save(outFile, FileFormat.PDF);
55 }
56
57 /// <summary>
58 /// 按每页拆分PDF文件
59 /// </summary>
60 /// <param name="inFile">待拆分PDF文件名称</param>
61 static void SpirePdfSplit(string inFile)
62 {
63 var doc = new Spire.Pdf.PdfDocument(inFile);
64 doc.Split("SpirePdf_拆分-{0}.pdf");
65 doc.Close();
66 }
67
68 #endregion
69
70 #region iTextSharp.text.pdf
71
72 /// <summary>
73 /// 合并PDF文件
74 /// </summary>
75 /// <param name="inFiles">待合并文件列表</param>
76 /// <param name="outFile">合并生成的文件名称</param>
77 static void iTextSharpPdfMerge(List<String> inFiles, String outFile)
78 {
79 using (var stream = new FileStream(outFile, FileMode.Create))
80 {
81 using (var doc = new Document())
82 {
83 using (var pdf = new PdfCopy(doc, stream))
84 {
85 doc.Open();
86 inFiles.ForEach(file =>
87 {
88 var reader = new PdfReader(file);
89 for (int i = 0; i < reader.NumberOfPages; i++)
90 {
91 var page = pdf.GetImportedPage(reader, i + 1);
92 pdf.AddPage(page);
93 }
94 pdf.FreeReader(reader);
95 reader.Close();
96 });
97 }
98 }
99 }
100 }
101
102 /// <summary>
103 /// 按每页拆分PDF文件
104 /// </summary>
105 /// <param name="inFile">待拆分PDF文件名称</param>
106 static void iTextSharpPdfSplit(string inFile)
107 {
108 using (var reader = new PdfReader(inFile))
109 {
110 // 注意起始页是从1开始的
111 for (int i = 1; i <= new PdfReader(inFile).NumberOfPages; i++)
112 {
113 using (var sourceDocument = new Document(reader.GetPageSizeWithRotation(i)))
114 {
115 var pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream($"iTextSharp_拆分_{i}.pdf", System.IO.FileMode.Create));
116 sourceDocument.Open();
117 var importedPage = pdfCopyProvider.GetImportedPage(reader, i);
118 pdfCopyProvider.AddPage(importedPage);
119 }
120 }
121 }
122 }
123
124 #endregion
125
126 }
127 }
测试效果如下图所示:

C# 合并和拆分PDF文件的更多相关文章
- C# 合并及拆分PDF文件
C# 合并及拆分PDF文件 有时我们可能会遇到下图这样一种情况 — 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯定想要把这些PDF文件合并为一个 ...
- C# 将多个office文件转换及合并为一个PDF文件
PDF文件介绍 PDF(Portable Document Format )文件源于20世纪90年代初期,如今早已成为了一种最流行的的文件格式之一.因为PDF文件有很多优点: 支持跨平台和跨设备共享 ...
- 如何用Latex合并多个pdf文件?
如何用Latex合并多个pdf文件? 用TeX合并pdf, 用LaTeX合并pdf 代码: \documentclass[a4paper]{article} \usepackage{pdfpage ...
- Java 合并、拆分PDF文档
处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...
- [.NET开发] C# 合并、拆分PDF文档
在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...
- Aspose.Pdf合并图片到PDF文件
将图片和PDF文件合成为新的PDF文件,可以先将图片转换为PDF文件, 然后合成PDF即可, 将图片转换成PDF文件有如下方法: Aspose.Pdf.Document Aspose.Pdf.Gene ...
- 如何将多个网页合并成一个PDF文件
pdfFactory是一款PDF虚拟打印软件,但与其他虚拟打印机软件不同的是,它使用起来更加简单高效.由于无需Acrobat就能生成Adobe PDF文件,它可以帮助用户在系统没有连接打印机的情况下, ...
- 用itext合并多个pdf文件【转】【补】
java代码 package c; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arra ...
- PDF 补丁丁 0.4.2.891 测试版发布:合并PDF文件时设置书签文本和样式
新的测试版在合并文件界面增加了设置书签样式的功能.除了可以为所合并的图片(或PDF文件)指定书签文本之外,还可以指定其文本样式(文本颜色.粗体.斜体).如下图所示. 此外,合并文件界面还添加了文件夹历 ...
随机推荐
- 总结 Visual Studio 2019 发布以来 XAML 工具的改进
不知不觉,Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了.虽然每次更新都林林总总地一大堆新功能和改进,但关于 XAML 的内容总是,always,每次都只有 ...
- VMware提示Device/Credential Guard不兼容
问题环境 win10系统版本 win10 2004企业版 vmware 版本 vmware 15 pro 问题 虚拟机开启时候弹窗提示:"VMware与Device/Credential G ...
- css 13-CSS3属性:Flex布局图文详解
13-CSS3属性:Flex布局图文详解 #前言 CSS3中的 flex 属性,在布局方面做了非常大的改进,使得我们对多个元素之间的布局排列变得十分灵活,适应性非常强.其强大的伸缩性和自适应性,在网页 ...
- vue第十四单元(认识单页面应用,理解vue-router的基本用法)
第十四单元(认识单页面应用,理解vue-router的基本用法) #课程目标 1.了解单页应用与多页应用以及各自的优缺点 2.掌握路由如何实现单页应用 3.精通路由的基本语法 #知识点 #一.单页应用 ...
- Spring Data JPA 基础第二篇
主要调用工具类JpaUtils类 package cn.itcast.utils;import javax.persistence.EntityManager;import javax.persist ...
- Erlang那些事儿第1回之我是变量,一次赋值永不改变
第1回先从不变的变量说开来,学过其他编程语言的人都知道,变量之所以叫变量,是因为它会经常变,被修改.假设原本X = 10,后来再执行X = 24,那么X就从10变成了24,这对于程序新手和老鸟来说, ...
- 深入浅出JVM(一):你写得.java文件是如何被加载到内存中执行的
众所周知,.java文件需要经过编译生成.class文件才能被JVM执行. 其中,JVM是如何加载.class文件,又做了些什么呢? .class文件通过 加载->验证->准备->解 ...
- Redis 设计与实现 6:五大数据类型之列表
列表对象有 3 种编码:ziplist.linkedlist.quicklist. ziplist 和 linkedlist 是 3.2 版本之前的编码. quicklist 是 3.2 版本新增的编 ...
- 如何利用Typora编写博客,快速发布到多平台?
在不同的平台发布同样的文章,最让人头疼的就是图片问题,如果要手动一个个去重新上传,耗时耗力,还容易搞错.下面分享的方法,可以将Typora编写的文章快速发布到CSDN.微信公众号.博客园.简书等平台. ...
- 风炫安全web安全学习第三十节课 命令执行&代码执行基础
风炫安全web安全学习第三十节课 命令执行&代码执行基础 代码执行&命令执行 RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行 ...