当前位置 博文首页 > Dwaynerbing:C# 合并和拆分PDF文件

    Dwaynerbing:C# 合并和拆分PDF文件

    作者:Dwaynerbing 时间:2021-02-04 16:04

    一、合并和拆分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         }
    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文件带有水印,即使使用破解版在第一页还是有水印,我们可以使用  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