一、合并和拆分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文件的更多相关文章

  1. C# 合并及拆分PDF文件

    C# 合并及拆分PDF文件 有时我们可能会遇到下图这样一种情况 — 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯定想要把这些PDF文件合并为一个 ...

  2. C# 将多个office文件转换及合并为一个PDF文件

    PDF文件介绍 PDF(Portable Document Format )文件源于20世纪90年代初期,如今早已成为了一种最流行的的文件格式之一.因为PDF文件有很多优点: 支持跨平台和跨设备共享 ...

  3. 如何用Latex合并多个pdf文件?

    如何用Latex合并多个pdf文件?   用TeX合并pdf, 用LaTeX合并pdf 代码: \documentclass[a4paper]{article} \usepackage{pdfpage ...

  4. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  5. [.NET开发] C# 合并、拆分PDF文档

    在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...

  6. Aspose.Pdf合并图片到PDF文件

    将图片和PDF文件合成为新的PDF文件,可以先将图片转换为PDF文件, 然后合成PDF即可, 将图片转换成PDF文件有如下方法: Aspose.Pdf.Document Aspose.Pdf.Gene ...

  7. 如何将多个网页合并成一个PDF文件

    pdfFactory是一款PDF虚拟打印软件,但与其他虚拟打印机软件不同的是,它使用起来更加简单高效.由于无需Acrobat就能生成Adobe PDF文件,它可以帮助用户在系统没有连接打印机的情况下, ...

  8. 用itext合并多个pdf文件【转】【补】

    java代码 package c; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arra ...

  9. PDF 补丁丁 0.4.2.891 测试版发布:合并PDF文件时设置书签文本和样式

    新的测试版在合并文件界面增加了设置书签样式的功能.除了可以为所合并的图片(或PDF文件)指定书签文本之外,还可以指定其文本样式(文本颜色.粗体.斜体).如下图所示. 此外,合并文件界面还添加了文件夹历 ...

随机推荐

  1. 使用Jmeter测试thrift接口

    术语描述 jmeter:一款性能压力测试工具,支持多种协议,java .http 等,但是不支持thrift thrift:跨语言的RPC调用框架,提供编译器,可以将thrift接口生成不同语言的接口 ...

  2. 群晖DS218+部署Harbor(1.10.3)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Atlas 2.1.0 实践(1)—— 编译Atlas

    为什么要做数据治理? 业务繁多,数据繁多,业务数据不断迭代.人员流动,文档不全,逻辑不清楚,对于数据很难直观理解,后期很难维护. 在大数据研发中,原始数据就有着非常多的数据库,数据表. 而经过数据的聚 ...

  4. OSM地图本地发布-如何生成各省市矢量地图

    目录 1.缘起 2.问题 3.分析 4.生成自定义地区矢量瓦片 4.1.启动docker 4.2.启动postGIS容器 4.3.设置不清理上次的结果 4.4.删除默认切图范围 4.5.修改切图层级和 ...

  5. 最速下降法--MATLAB程序

    function x = fxsteep(f,e,a,b)x1 = a;x2 = b;Q = fxhesson(f,x1,x2);x0 = [x1,x2]';temp = [x0];fx1 = dif ...

  6. Python将文件夹下的文件名写入excel方便统计

    如题,贴代码: 1 ''' 2 #python将某文件夹下的文件名存储到excel中 3 ''' 4 5 #导入所需模块 6 import os 7 import xlwt 8 9 #定义要处理的文件 ...

  7. 配置redis服务器允许远程连接

    说明 默认情况下,redis只允许本机访问.如果需要外部访问,需要修改下配置文件. 配置修改 redis.windows.conf 将bind 127.0.0.1 注释 将protected-mode ...

  8. Autofac官方文档翻译--一、注册组件--4组件扫描

    官方文档:http://docs.autofac.org/en/latest/register/scanning.html Autofac 组件扫描 在程序集中Autofac 可以使用约定来找到并注册 ...

  9. ssms导入excel数据提示未安装插件的解决方法

    今天用ssms导入excel的时候,提示 然后去找了一下解决方案,安装了相对应的插件.但是还是会提示这个问题. 又去找了一下原因,找到一个原因是sqlserver启动的时候是32位的,但是导入需要64 ...

  10. Xtrabackup备份与恢复

    一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况 ...