丢了 發表於 2021-1-21 00:21:00

C# 合并和拆分PDF文件

<p><strong>一、合并和拆分PDF文件的方式</strong></p>
<p>PDF文件使用了工业标准的压缩算法,易于传输与储存。它还是页独立的,一个PDF文件包含一个或多个“页“,可以单独处理各页,特别适合多处理器系统的工作。PDF文件结构主要可以分为四个部分:<strong>首部</strong>、<strong>文件体</strong>、<strong>交叉引用表</strong>、<strong>尾部</strong>。PDF操作类库非常多,如下图所示,常用的类库有:<strong>Spire.Pdf</strong>、<strong>iTextSharp</strong>。</p>
<p><img src="https://img2020.cnblogs.com/blog/1164630/202101/1164630-20210121002042112-1898610717.png" alt="img" loading="lazy"></p>
<p><strong>二、使用 Spire.Pdf 合并和拆分PDF文件</strong></p>
<p>使用 Nuget 添加Spire.Pdf 类库,然后添加如下代码:</p>
<pre><code class="language-c#"> 1 /// &lt;summary&gt;
2         /// 合并PDF文件
3         /// &lt;/summary&gt;
4         /// &lt;param name="files"&gt;待合并文件列表&lt;/param&gt;
5         /// &lt;param name="outFile"&gt;合并生成的文件名称&lt;/param&gt;
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         /// &lt;summary&gt;
13         /// 按每页拆分PDF文件
14         /// &lt;/summary&gt;
15         /// &lt;param name="inFile"&gt;待拆分PDF文件名称&lt;/param&gt;
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         }
</code></pre>
<p><strong>三、使用 iTextSharp 合并和拆分PDF文件</strong></p>
<p>使用 Spire.Pdf 操作PDF文件,简单高效,但生成的PDF文件带有水印,即使使用破解版在第一页还是有水印,我们可以使用 iTextSharp 类库,该类库生成的PDF无水印,具体使用如下:</p>
<pre><code class="language-c#"> 1 /// &lt;summary&gt;
2         /// 合并PDF文件
3         /// &lt;/summary&gt;
4         /// &lt;param name="inFiles"&gt;待合并文件列表&lt;/param&gt;
5         /// &lt;param name="outFile"&gt;合并生成的文件名称&lt;/param&gt;
6         static void iTextSharpPdfMerge(List&lt;String&gt; 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 =&gt;
16                         {
17                           var reader = new PdfReader(file);
18                           for (int i = 0; i &lt; 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         /// &lt;summary&gt;
32         /// 按每页拆分PDF文件
33         /// &lt;/summary&gt;
34         /// &lt;param name="inFile"&gt;待拆分PDF文件名称&lt;/param&gt;
35         static void iTextSharpPdfSplit(string inFile)
36         {
37             using (var reader = new PdfReader(inFile))
38             {
39               // 注意起始页是从1开始的
40               for (int i = 1; i &lt;= 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         }
</code></pre>
<p><strong>四、测试结果</strong></p>
<p>完整代码如下:</p>
<pre><code class="language-c#">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         /// &lt;summary&gt;
47         /// 合并PDF文件
48         /// &lt;/summary&gt;
49         /// &lt;param name="files"&gt;待合并文件列表&lt;/param&gt;
50         /// &lt;param name="outFile"&gt;合并生成的文件名称&lt;/param&gt;
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         /// &lt;summary&gt;
58         /// 按每页拆分PDF文件
59         /// &lt;/summary&gt;
60         /// &lt;param name="inFile"&gt;待拆分PDF文件名称&lt;/param&gt;
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         /// &lt;summary&gt;
73         /// 合并PDF文件
74         /// &lt;/summary&gt;
75         /// &lt;param name="inFiles"&gt;待合并文件列表&lt;/param&gt;
76         /// &lt;param name="outFile"&gt;合并生成的文件名称&lt;/param&gt;
77         static void iTextSharpPdfMerge(List&lt;String&gt; 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 =&gt;
87                         {
88                           var reader = new PdfReader(file);
89                           for (int i = 0; i &lt; 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         /// &lt;summary&gt;
103         /// 按每页拆分PDF文件
104         /// &lt;/summary&gt;
105         /// &lt;param name="inFile"&gt;待拆分PDF文件名称&lt;/param&gt;
106         static void iTextSharpPdfSplit(string inFile)
107         {
108             using (var reader = new PdfReader(inFile))
109             {
110               // 注意起始页是从1开始的
111               for (int i = 1; i &lt;= 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 }
</code></pre>
<p>测试效果如下图所示:</p>
<p><img src="https://img2020.cnblogs.com/blog/1164630/202101/1164630-20210121001825051-1014616312.png" alt="img" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/dongweian/p/14305928.html
頁: [1]
查看完整版本: C# 合并和拆分PDF文件