.NET8实现PDF合并的示例代码

 更新时间:2023年12月27日 15:00:26   作者:青春似雨后霓虹  
这篇文章主要为大家详细介绍了如何使用.NET8实现PDF合并的效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

前言

在.NET 8中使用itext7需安装 itext7 和 itext7.bouncy-castle-fips-adapter 两个Nuget包,或者使用Aspose.PDF、PdfSharpCore、Spire.PDF任意一个第三方包就行

对比:

第三方包是否开源是否收费
itext7不收费,免费使用没有水印
PdfSharpCore不收费,免费使用没有水印
Spire.PDF是,可以免费使用但有水印
Aspose.PDF是,可以免费使用但有水印

安装如下Nuget的包

<ItemGroup>
    <PackageReference Include="Aspose.PDF" Version="23.11.1" />
    <PackageReference Include="itext7" Version="8.0.2" />
    <PackageReference Include="itext7.bouncy-castle-fips-adapter" Version="8.0.2" />
    <PackageReference Include="PdfSharpCore" Version="1.3.62" />
    <PackageReference Include="Spire.PDF" Version="9.12.0" />
  </ItemGroup>

项目结构示意图

一、itext7

using iText.Kernel.Pdf;
using iText.Kernel.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfTest.PdfHelpers
{
    public class iText7Helper
    {
        // https://blog.csdn.net/m0_47619208/article/details/130725907
        /// <summary>
        /// 合并多个PDF文档
        /// 添加NuGet包引用:添加itext7和itext7.bouncy-castle-adapter,后者必须进行添加,否则会在运行报错。
        /// NuGet包为iText7,该库满足跨平台需求
        /// https://itextpdf.com/
        /// https://itextpdf.com/itext-suite-net-c
        /// </summary>
        /// <param name="fileList"></param>
        /// <param name="outFile"></param>
        /// <returns></returns>
        public static Task MergePdf(string[] fileList, string outFile)
        {
            using PdfWriter writer = new(outFile);
            using PdfDocument pdf = new(writer);
            PdfMerger merger = new(pdf);
            for (int i = 0; i < fileList.Length; i++)
            {
                PdfReader reader = new(fileList[i]);
                using PdfDocument pdfDocument = new(reader);
                merger.Merge(pdfDocument, 1, pdfDocument.GetNumberOfPages());
            }
            merger.Close();
            return Task.CompletedTask;
        }
    }
}

二、PdfSharpCore

using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfTest.PdfHelpers
{
    public class PdfSharpTool
    {
        // https://github.com/ststeiger/PdfSharpCore
        

        public static void PdfSharpCoreMerge(string[] files, string outFile)
        {
            using PdfDocument outPdfFile = new PdfDocument();
            foreach (var file in files)
            {
                using PdfDocument pdfFile = PdfReader.Open(file, PdfDocumentOpenMode.Import);

                foreach (var pdfPage in pdfFile.Pages)
                {
                    outPdfFile.AddPage(pdfPage);
                }
            }
            outPdfFile.Save(outFile);
        }

    }
}

三、Aspose.PDF

using Aspose.Pdf.Facades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfTest.PdfHelpers
{
    internal class AsposePdfHelper
    {
        //https://blog.aspose.com/zh/pdf/merge-multiple-pdf-files-in-csharp-net/
        //收费
        public static void Merge(string[] filesArray, string outFile)
        {
            // 创建 PdfFileEditor 对象
            PdfFileEditor pdfEditor = new PdfFileEditor();
            // 合并文件
            //pdfEditor.Concatenate("file1.pdf", "file2.pdf", "merged.pdf");
            // 合并文件
            pdfEditor.Concatenate(filesArray, outFile);

        }

        public static void MergeStream(FileStream[] streamArray, string outFile)
        {
            // 创建 PdfFileEditor 对象
            PdfFileEditor pdfEditor = new PdfFileEditor();
            // 输出流
            //FileStream outputStream = new FileStream("Merged.pdf", FileMode.Create);
            FileStream outputStream = new FileStream(outFile, FileMode.Create);
            //// 输入流
            //FileStream inputStream1 = new FileStream("file1.pdf", FileMode.Open);
            //FileStream inputStream2 = new FileStream("file2.pdf", FileMode.Open);
            //// 合并文件
            //pdfEditor.Concatenate(inputStream1, inputStream2, outputStream);


            // 创建流数组 
            //FileStream[] streamArray = new FileStream[3];
            //streamArray[0] = new FileStream("file1.pdf", FileMode.Open);
            //streamArray[1] = new FileStream("file2.pdf", FileMode.Open);
            //streamArray[2] = new FileStream("file3.pdf", FileMode.Open);
            // 合并文件
            pdfEditor.Concatenate(streamArray, outputStream);

        }

    }
}

四、Spire.PDF

using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PdfTest.PdfHelpers
{
    public class SpirePdfHelper
    {
        //https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html
        //https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Convert-HTML-to-PDF-Customize-HTML-to-PDF-Conversion-by-Yourself.html
        //https://www.cnblogs.com/dongweian/p/14305928.html
        //有水印

        /// <summary>
        /// 合并PDF文件
        /// </summary>
        /// <param name="files">待合并文件列表</param>
        /// <param name="outFile">合并生成的文件名称</param>
        public static void SpirePdfMerge(string[] files, string outFile)
        {
            var doc = PdfDocument.MergeFiles(files);
            doc.Save(outFile, FileFormat.PDF);
        }

        /// <summary>
        /// 按每页拆分PDF文件
        /// </summary>
        /// <param name="inFile">待拆分PDF文件名称</param>
        public static void SpirePdfSplit(string inFile)
        {
            var doc = new PdfDocument(inFile);
            doc.Split("SpirePdf_拆分-{0}.pdf");
            doc.Close();
        }

    }
}

在控制台上调用

using PdfTest.PdfHelpers;

namespace PdfTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
        // 文件数组索引在前面的后,合并后的PDF,页面也在前面
            string [] files = Directory.GetFiles("Merge");
            #region Spire.Pdf
            //SpirePdfHelper.SpirePdfMerge(files, "SpirePdfMerge.pdf");
            //Console.WriteLine("使用 Spire.Pdf 合并文件完成...");
            #endregion

            #region PdfSharpCore
            //PdfSharpTool.PdfSharpCoreMerge(files, "PdfSharpCoreMerge.pdf");
            //Console.WriteLine("使用 PdfSharpCore 合并文件完成...");
            #endregion

            #region iText7
            //iText7Helper.MergePdf(files, "iText7PdfMerge.pdf");
            //Console.WriteLine("使用 iText7 合并文件完成...");
            #endregion

            #region AsposePdf
            AsposePdfHelper.Merge(files, "AsposePdfMerge.pdf");
            Console.WriteLine("使用 AsposePdf 合并文件完成...");
            #endregion

            Console.ReadKey();
        }
    }
}

以上就是.NET8实现PDF合并的示例代码的详细内容,更多关于.NET合并PDF的资料请关注脚本之家其它相关文章!

相关文章

  • asp.net 不用组件的URL重写(适用于较大型项目)

    asp.net 不用组件的URL重写(适用于较大型项目)

    网上很多关于url重写的教程都推荐下载某某某组件, 我个人不喜欢这样,即使是M$的组件也一样,因为我们干程序员的,越贴近真相越好。那么我也写一个关于url重写的文章,希望对和我一样有个性的coder们有点帮助。
    2009-04-04
  • Jexus部署.Net Core项目

    Jexus部署.Net Core项目

    这篇文章主要为大家详细介绍了Jexus部署.Net Core项目的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • CheckBox控件默认选中,提交时永远获得选中状态的实现代码

    CheckBox控件默认选中,提交时永远获得选中状态的实现代码

    下面小编就为大家带来一篇CheckBox控件默认选中,提交时永远获得选中状态的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现

    Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现

    这篇文章主要介绍了Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • asp.net使用ashx生成图形验证码的方法示例

    asp.net使用ashx生成图形验证码的方法示例

    这篇文章主要介绍了asp.net使用ashx生成图形验证码的方法,结合实例形式分析了asp.net生成图形验证码的步骤、实现方法与相关注意事项,需要的朋友可以参考下
    2017-07-07
  • .NET Core单文件发布静态编译AOT CoreRT的方法详解

    .NET Core单文件发布静态编译AOT CoreRT的方法详解

    这篇文章主要给大家介绍了关于.NET Core单文件发布静态编译AOT CoreRT的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • c#.net中const和readonly的区别

    c#.net中const和readonly的区别

    readonly修饰符用来表示只读,const用来表示不变常量。顾名思义,只读表示不能进行写操作;不变常量不能被修改。这两者到底有什么区别呢
    2013-09-09
  • 浅析.Net Core中Json配置的自动更新

    浅析.Net Core中Json配置的自动更新

    这篇文章主要介绍了浅析.Net Core中Json配置的自动更新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • ASP.NET MVC分页的实现方法

    ASP.NET MVC分页的实现方法

    这篇文章主要为大家详细介绍了ASP.NET MVC分页的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • .Net中实现无限分类的2个例子

    .Net中实现无限分类的2个例子

    这篇文章主要介绍了.Net中实现无限分类的2个例子,本文直接给出实现代码,需要的朋友可以参考下
    2015-02-02

最新评论