1. 程式人生 > 程式設計 >C# 如何合併和拆分PDF檔案

C# 如何合併和拆分PDF檔案

一、合併和拆分PDF檔案的方式

PDF檔案使用了工業標準的壓縮演算法,易於傳輸與儲存。它還是頁獨立的,一個PDF檔案包含一個或多個“頁“,可以單獨處理各頁,特別適合多處理器系統的工作。PDF檔案結構主要可以分為四個部分:首部、檔案體、交叉引用表、尾部。PDF操作類庫非常多,如下圖所示,常用的類庫有:Spire.Pdf、iTextSharp。

C# 如何合併和拆分PDF檔案

二、使用 Spire.Pdf 合併和拆分PDF檔案

使用 Nuget 新增Spire.Pdf 類庫,然後新增如下程式碼:

/// <summary>
    /// 合併PDF檔案
    /// </summary>
    /// <param name="files">待合併檔案列表</param>
    /// <param name="outFile">合併生成的檔名稱</param>
    static void SpirePdfMerge(string[] files,string outFile)
    {
      var doc = Spire.Pdf.PdfDocument.MergeFiles(files);
      doc.Save(outFile,FileFormat.PDF);
    }

    /// <summary>
    /// 按每頁拆分PDF檔案
    /// </summary>
    /// <param name="inFile">待拆分PDF檔名稱</param>
    static void SpirePdfSplit(string inFile)
    {
      var doc = new Spire.Pdf.PdfDocument(inFile);
      doc.Split("SpirePdf_拆分-{0}.pdf");
      doc.Close();
    }

三、使用iTextSharp 合併和拆分PDF檔案

使用Spire.Pdf 操作PDF檔案,簡單高效,但生成的PDF檔案帶有水印,即使使用破解版在第一頁還是有水印,我們可以使用 iTextSharp 類庫,該類庫生成的PDF無水印,具體使用如下:

/// <summary>
    /// 合併PDF檔案
    /// </summary>
    /// <param name="inFiles">待合併檔案列表</param>
    /// <param name="outFile">合併生成的檔名稱</param>
    static void iTextSharpPdfMerge(List<String> inFiles,String outFile)
    {
      using (var stream = new FileStream(outFile,FileMode.Create))
      {
        using (var doc = new Document())
        {
          using (var pdf = new PdfCopy(doc,stream))
          {
            doc.Open();
            inFiles.ForEach(file =>
            {
              var reader = new PdfReader(file);
              for (int i = 0; i < reader.NumberOfPages; i++)
              {
                var page = pdf.GetImportedPage(reader,i + 1);
                pdf.AddPage(page);
              }
              pdf.FreeReader(reader);
              reader.Close();
            });
          }
        }
      }
    }

    /// <summary>
    /// 按每頁拆分PDF檔案
    /// </summary>
    /// <param name="inFile">待拆分PDF檔名稱</param>
    static void iTextSharpPdfSplit(string inFile)
    {
      using (var reader = new PdfReader(inFile))
      {
        // 注意起始頁是從1開始的
        for (int i = 1; i <= new PdfReader(inFile).NumberOfPages; i++)
        {
          using (var sourceDocument = new Document(reader.GetPageSizeWithRotation(i)))
          {
            var pdfCopyProvider = new PdfCopy(sourceDocument,new System.IO.FileStream($"iTextSharp_拆分_{i}.pdf",System.IO.FileMode.Create));
            sourceDocument.Open();
            var importedPage = pdfCopyProvider.GetImportedPage(reader,i);
            pdfCopyProvider.AddPage(importedPage);
          }
        }
      }
    }

四、測試結果

完整程式碼如下:

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using PdfDocument = iTextSharp.text.pdf.PdfDocument;

namespace Pdf
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        SpirePdfMerge(Directory.GetFiles("Merge"),"SpirePdfMerge.pdf");
        Console.WriteLine("使用 Spire.Pdf 合併檔案完成...");

        SpirePdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\1.pdf");
        Console.WriteLine("使用 Spire.Pdf 拆分檔案完成...");

        iTextSharpPdfMerge(Directory.GetFiles("Merge").ToList(),"iTextSharpPdfMerge.pdf");
        Console.WriteLine("使用 iTextSharp 合併檔案完成...");

        iTextSharpPdfSplit($"{AppDomain.CurrentDomain.BaseDirectory}Split\\2.pdf");
        Console.WriteLine("使用 iTextSharp 拆分檔案完成...");

      }
      catch (Exception e)
      {
        Console.WriteLine(e);
      }
      finally
      {
        Console.ReadKey();
      }
    }

    #region Spire.Pdf

    /// <summary>
    /// 合併PDF檔案
    /// </summary>
    /// <param name="files">待合併檔案列表</param>
    /// <param name="outFile">合併生成的檔名稱</param>
    static void SpirePdfMerge(string[] files,FileFormat.PDF);
    }

    /// <summary>
    /// 按每頁拆分PDF檔案
    /// </summary>
    /// <param name="inFile">待拆分PDF檔名稱</param>
    static void SpirePdfSplit(string inFile)
    {
      var doc = new Spire.Pdf.PdfDocument(inFile);
      doc.Split("SpirePdf_拆分-{0}.pdf");
      doc.Close();
    }

    #endregion

    #region iTextSharp.text.pdf

    /// <summary>
    /// 合併PDF檔案
    /// </summary>
    /// <param name="inFiles">待合併檔案列表</param>
    /// <param name="outFile">合併生成的檔名稱</param>
    static void iTextSharpPdfMerge(List<String> inFiles,i);
            pdfCopyProvider.AddPage(importedPage);
          }
        }
      }
    }

    #endregion

  }
}

測試效果如下圖所示:

C# 如何合併和拆分PDF檔案

以上就是C# 如何合併和拆分PDF檔案的詳細內容,更多關於C# 合併和拆分PDF檔案的資料請關注我們其它相關文章!