一、合并和拆分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. 【Electron Playground 系列】文件下载篇

    作者:long.woo 文件下载是我们开发中比较常见的业务需求,比如:导出 excel. web 应用文件下载存在一些局限性,通常是让后端将响应的头信息改成 Content-Disposition: ...

  2. Linux命令-2.文件属性

    在Linux系统中文件的属性有:文件类型.属主属性.属组属性.其他属性,使用10个字符表示,如下图: 其中第0位表示文件类型: 当为[ d ]则是目录 当为[ - ]则是文件: 若是[ l ]则表示为 ...

  3. Numpy的学习2-基础转换

    import numpy as np A = np.arange(2, 14).reshape((3, 4)) # array([[ 2, 3, 4, 5] # [ 6, 7, 8, 9] # [10 ...

  4. TP学习第二天—

    一.控制器和对应方法的创建 2.路由解析 传统的路由解析方法: 具体url地址模式设置(配置文件在 ThinkPHP/Conf/convertion.php) 停到了之前的 黑马传智的 TP课,换了个 ...

  5. SQLServer之 Stuff和For xml path

    示例 昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行,比如表中有两列数据 : 类别 名称 AAA 企业1 AAA ...

  6. ASP.NET Core 3.1使用JWT认证Token授权 以及刷新Token

    传统Session所暴露的问题 Session: 用户每次在计算机身份认证之后,在服务器内存中会存放一个session,在客户端会保存一个cookie,以便在下次用户请求时进行身份核验.但是这样就暴露 ...

  7. 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64

    期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...

  8. [leetcode]TwoSum系列问题

    1.普通数组找两个数,哈希表建立数值和下标的映射,遍历时一边判断一边添加 /* 哇,LeetCode的第一题...啧啧 */ public int [] twoSum(int[] nums, int ...

  9. 22. Generate Parentheses生成指定个括号

    生成指定个数的括号,这些括号可以相互包括,但是一对括号的格式不能乱(就是配对的一个括号的左括号要在左边,右括号要在右边) 思维就是从头递归的添加,弄清楚什么时候要添加左括号,什么时候添加右括号 有点像 ...

  10. 686. Repeated String Match判断字符串重复几次可以包含另外一个

    public static int repeatedStringMatch(String A, String B) { //判断字符串a重复几次可以包含另外一个字符串b,就是不断叠加字符串a直到长度大 ...