1、合併和拆分PDF文件的方式算法
PDF文件使用了工業標準的壓縮算法,易於傳輸與儲存。它仍是頁獨立的,一個PDF文件包含一個或多個「頁「,能夠單獨處理各頁,特別適合多處理器系統的工做。PDF文件結構主要能夠分爲四個部分:首部、文件體、交叉引用表、尾部。PDF操做類庫很是多,以下圖所示,經常使用的類庫有:Spire.Pdf、iTextSharp。ide
2、使用 Spire.Pdf 合併和拆分PDF文件測試
使用 Nuget 添加Spire.Pdf 類庫,而後添加以下代碼:spa
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 }
3、使用 iTextSharp 合併和拆分PDF文件code
使用 Spire.Pdf 操做PDF文件,簡單高效,但生成的PDF文件帶有水印,即便使用破解版在第一頁仍是有水印,咱們能夠使用 iTextSharp 類庫,該類庫生成的PDF無水印,具體使用以下:orm
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 }
4、測試結果blog
完整代碼以下:get
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 }
測試效果以下圖所示:string