C# 如何合并和拆分PDF文件

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

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

二、使用 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, 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();
    }

    #endregion

    #region iTextSharp.text.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);
          }
        }
      }
    }

    #endregion

  }
}

测试效果如下图所示:

以上就是C# 如何合并和拆分PDF文件的详细内容,更多关于C# 合并和拆分PDF文件的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#/VB.NET 在PDF中添加文件包(Portfolio)的方法

    PDF文件包(Portfolio)允许用户将多种不同类型的文件如Word.Excel.PDF.PowerPoint和图片等集合到一个PDF文件中,用户可以打开.更改PDF文件包中的单个文件.添加文件包时,可支持创建文件包时并直接将文件添加到文件包:或者创建文件包的同时创建文件夹,并将文件添加到文件夹. 环境准备:程序中需要使用到PDF类库工具(Spire.PDF for .NET hotfix 6.5.15及以上版本)下载后,解压,将Bin文件夹下的dll文件添加引用到VS程序.如下效果: 1.

  • C#打印PDF文档的10种方法(小结)

    操作PDF文档时,打印是常见的需求之一.针对不同的打印需求,可分多种情况来进行,如设置静默打印.指定打印页码范围和打印纸张大小.双面打印.黑白打印等等.经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这里归纳了10种打印需求及方法.如下: 使用默认打印机打印PDF文档 使用虚拟打印机(Microsoft XPS Document Writer)打印PDF文档 指定打印机及PDF文档打印页码范围 静默打印PDF文档 双面打印PDF文档 黑白打印PDF文档 打印PDF文档时选择不同的出纸盒

  • C#利用iTextSharp组件给PDF文档添加图片/文字水印

    最近在做关于PDF文档添加水印的功能,折腾了好久,终于好了.以下做个记录: 首先会用到iTextSharp组件,大家可以去官网下载,同时我也会在本文中附加进来. 代码中添加引用为: using System; using System.Collections.Generic; using System.Linq; using System.Text; using iTextSharp.text.pdf; using System.IO; using iTextSharp.text; 创建一个显示

  • C#生成PDF的方法

    之前项目中是通过wkhtmltopdf渲染web页面生成的pdf文件,这个方案一直不是很稳定,并且在不同的场景样式也常不一样,老需要调整. 今天研究了一下C#直接生成PDF的方案,还是比较简单的,整体方案如下: 通过WPF库生成XPS文件 通过PdfSharp将XPS文件转成PDF文件 首先看一下生成xps文件的代码.,代码如下: var fixedDoc = new FixedDocument(); var pageContent = new PageContent(); var fixedP

  • c# 给pdf添加数字签名的步骤

    数字签名广泛用于保护PDF文档,可见数字签名在日常生活中是相当重要的.在这篇文章中我将与大家分享如何给PDF文件添加可见的数字签名. 首先我下载了一个由E-iceblue公司开发的免费版的PDF组件-Free Spire.PDF,控件安装好后,再通过下面所提及的路径把Bin文件夹里的Spire.PDF.dll添加为引用. 路径:"...\Spire.pdf-fe\Bin\NET4.0\ Spire.PDF.dll" 接下来我将提供一些代码片段来向大家展示如何添加可见的数字签名: 步骤1

  • C# 对PDF文档加密、解密(基于Spire.Cloud.SDK for .NET)

    Spire.Cloud.SDK for .NET提供了接口PdfSecurityApi可用于加密.解密PDF文档.本文将通过C#代码演示具体加密及解密方法. 使用工具: Spire.Cloud.SDK for .NET Visual Studio 必要步骤: 步骤一: dll文件获取及导入.在程序中通过Nuget搜索下载,直接导入所有dll. 导入效果如下如所示: 步骤二: App ID及Key获取.在"我的应用"板块中创建应用以获得App ID及App Key. 步骤三: 源文档上传

  • C#实现Word转为PDF的方法

    这里主要提供一种将word文档转成PDF文档的实现: 具体实现看c#代码:要引入Microsoft.Office.Interop.Word;版本12.0.0.0 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Runtime.InteropServices; using Microsoft.Office.Inter

  • C#实现合并及拆分PDF文件的方法

    有时我们可能会遇到下图这样一种情况 - 我们需要的资料或教程被分成了几部分存放在多个PDF文件中,不管是阅读还是保存都不是很方便,这时我们肯定想要把这些PDF文件合并为一个PDF文件.相对应的,有时候我们也需要拆分一个大的PDF文件,来从中获取我们需要的那一部分资料.这篇文章主要分享如何使用C#来将多个PDF文件合并为一个PDF文件以及将一个PDF文件拆分为多个PDF文件. 合并PDF文件 合并PDF文件的代码很简单,主要分为三步,首先获取需要合并的PDF文件,然后调用public static

  • C#合并多种格式文件为PDF的方法

    文档合并是一种高效文档处理方式.如果能够有一个方法能将多种不同类型的文档合并成一种文档格式,那么在文档存储管理上将为我们提供极大的便利.因此,本篇文章介绍了一种如何使用免费组件Free Spire.Office for .NET来实现将多种各式的文档合并为PDF的方法.本方法中可合并的文档格式可以是doc.docx.xls.xlsx.pdf等.下面将进行详细阐述. 使用方法:安装Free Spire.Office for .NET后,添加引用spire.doc.dll, spire.xls.dl

  • C#将Excel转成PDF的方法

    PS:公司的业务中有个超级大的作业就是把OFFICE文档转成PDF,我猜之前没程序猿们,公司那些人应该是一个个手动转.强烈为猿们感叹,帮你们做了这么多事,还在那抱怨....无法满足你们的需求啊: 微软net平台提供了对Office文档非常好的支持:其中有com组件直接集成到了VS中.利用这些API可以快速的免去N多繁琐的工作: 以下代码是翻阅了公司的代码,一个个敲出来的:奉上代码: using System; using System.Collections.Generic; using Sys

随机推荐