AI智能
改变未来

C# 合并和拆分PDF文件

一、合并和拆分PDF文件的方式

PDF文件使用了工业标准的压缩算法,易于传输与储存。它还是页独立的,一个PDF文件包含一个或多个“页“,可以单独处理各页,特别适合多处理器系统的工作。PDF文件结构主要可以分为四个部分:首部文件体交叉引用表尾部。PDF操作类库非常多,如下图所示,常用的类库有:Spire.PdfiTextSharp

二、使用 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         }1112         /// <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文件带有水印,即使使用破解版在第一页还是有水印,我们可以使用 iTextSharp 类库,该类库生成的PDF无水印,具体使用如下:

1 /// <summary>2         /// 合并PDF文件3         /// </summary>4         /// <param name=\"inFiles\">待合并文件列表</parad0am>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 (int56ci = 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                     }2756c}28             }29         }3031         /// <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);47ad8pdfCopyProvider.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;1213 namespace Pdf14 {15     class Program16     {17         static void Main(string[] args)18         {19             try20             {21                 SpirePdfMerge(Directory.GetFiles(\"Merge\"), \"SpirePdfMerge.pdf\");22                 Console.WriteLine(\"使用 Spire.Pdf 合并文件完成...\");2324                 SpirePdfSplit($\"{AppDomain.CurrentDomain.BaseDirectory}Split\\\\1.pdf\");25                 Console.WriteLine(\"使用 Spire.Pdf 拆分文件完成...\");2627                 iTextSharpPdfMerge(Directory.GetFiles(\"Merge\").ToList(), \"iTextSharpPdfMerge.pdf\");28                 Console.WriteLine(\"使用 iTextSharp 合并文件完成...\");2930                 iTextSharpPdfSplit($\"{AppDomain.CurrentDomain.BaseDirectory}Split\\\\2.pdf\");31                 Console.WriteLine(\"使用 iTextSharp 拆分文件完成...\");3233             }34             catch (Exception e)35             {36                 Console.WriteLine(e);37             }38             finally39             {40                 Console.ReadKey();41             }42         }4344         #region Spire.Pdf4546         /// <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         }5657         /// <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         }6768         #endregion6970         #region iTextSharp.text.pdf7172         /// <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                 }9956c}100         }101102         /// <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         }123124         #endregion125126     }127 }

测试效果如下图所示:

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C# 合并和拆分PDF文件