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 }

      測試效果如下圖所示:

     

 

Tags: