一、合并和拆分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. 自顶向下redis4.0(2)文件事件与客户端

    redis4.0的文件事件与客户端 目录 redis4.0的文件事件与客户端 简介 正文 准备阶段 接受客户端连接 处理数据 返回数据结果 参考文献 简介 文件事件的流程大概如下: 在服务器初始化时生 ...

  2. Flink读写Redis(二)-flink-redis-connector代码学习

    源码结构 RedisSink package org.apache.flink.streaming.connectors.redis; import org.apache.flink.configur ...

  3. 2020-2021-1 20209307《Linux内核原理与分析》第四周作业

    一.Linux内核源代码简介 1.计算机三大法宝 存储程序计算机 函数调用堆栈 中断机制 2.操作系统两把宝剑 中断上下文的切换 进程上下文的切换 3.函数目录 Linux-3.18.6/arch/x ...

  4. 容器编排系统之DaemonSet、Job和CronJob控制器

    前文我们了解了k8s上的pod控制器中的常用的两种控制器ReplicaSet和Deployment控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/ ...

  5. CTF练习三 —— 命令注入&命令执行绕过

    这个题是第四届强网杯也就是2020.8.22号开始的那场一道简单的命令注入题,再这之前我并没有学习过命令注之类的知识,,,看到题之后先搜在学,,误打误撞解了出来,过段时间wp就会放出来,所以这里就不对 ...

  6. RocketMQ(七):高性能探秘之MappedFile

    RocketMQ作为消息中间件,经常会被用来和其他消息中间件做比较,比对rabbitmq, kafka... 但个人觉得它一直对标的,都是kafka.因为它们面对的场景往往都是超高并发,超高性能要求的 ...

  7. Python的精髓居然是方括号、花括号和圆括号!

    和其他编程语言相比,什么才是Python独一无二的特色呢?很多程序员会说,缩进.的确,缩进是Python语言的标志性特点,但这只是外在的.形式上的.从语言特性层面讲,Python的特点是什么呢?我尝试 ...

  8. C# Wpf 后台代码设定UIElement的Canvas位置属性值

    后台in-code设定元件UIElement的Canvas位置属性的两种方法: 1.UIElement.SetValue()方法 uiElement.SetValue(Canvas.TopProper ...

  9. 读取平台管理员xlsx文件

    package com.cn.peitest.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  10. feig中调用其他微服务接口无反应

    1.调用微服务时get请求接口中不能使用@RequestBody注解,不然接口调用无反应.post接口中可以使用@RequestBody注解