前言:在.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();
}
}
}

.NET 8上进行PDF合并的更多相关文章

  1. SNF开发平台WinForm之十三-单独从服务器上获取PDF文件进行显示-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: 如果需要单独显示PDF文件时用下面代码去实现,指定url地址. 地址: . 获取附件管理的实体对象: List<KeyValuePair<string, obj ...

  2. myeclipse上SVN代码合并详细步骤图解

    1.  在装有svn插件的myeclipse中,在主干上选择需要合并的文件或文件夹 右击 -> 合并(merge) 2. 选择合并类型--合并两个不同的树 Merge -> Next 3. ...

  3. PDF合并

    要求:将多个table导出到一个PDF里,然后打印. 问题分析:要求将四个table放一个PDF打印,四个table的列各不相同,第一个是表头,其他三个是列表,列比表头多很多,如果直接生成一个exce ...

  4. mvc在页面上显示PDF

    今天看到需求要在页面上显示pdf,自己整了半天,啥效果都没有,偶尔有效果还各种不兼容,很无语的说.捣鼓了半天,没办法了,去谷歌了下,介绍了各种插件,各种方法,但是都挺繁琐的,本人不是一个很喜欢使用插件 ...

  5. 【O】VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空

    问题: VSS 2005上传PDF文件之后,打开提示文件损坏或者内容为空: 解决方式: 在vss的客户端的tools-option中,file type选项卡里,在binary file文本框中,加入 ...

  6. C#实现多个PDF合并及去除文字水印功能

    实现pdf合并就是使用Spire.Pdf.dll类库的方法,但是注意需要同时引用Spire.Pdf.dll和Spire.License.dll两个类库,且两个类库的版本要一致 String[] fil ...

  7. git----------如何创建develop分支和工作流,以及如何将develop上的代码合并到master分支上

    1.点击sourceTree 右上角的git工作流,或弹出一个弹出框,无需修改任何东西直接点击确认就可以创建develop. . 2.这里有两个分支了,当前高亮的就是你当前处在的分支.此时develo ...

  8. 在 chrome 上导出 pdf

    用html+css写出网页,然后在chrome上导出pdf 1. command + p:快捷呼出打印: 2. “目标打印机”:选择“更改”,之后选择“另存为PDF”: 3. 点“更多设置”,可以勾选 ...

  9. PHP使用FPDF pdf添加水印中文乱码问题 pdf合并版本问题

    ---恢复内容开始--- require_once('../fpdf/fpdf.php');require_once('../fpdi/fpdi.php'); 使用此插件 pdf 合并 并添加水印 期 ...

  10. pdftk - handy tool for manipulating PDF 免费的pdf合并工具

    Linux pdf合并的工具 安装工具 $ sudo apt-get install pdftk 使用 $ pdftk *.pdf cat output all-in-one.pdf &&am ...

随机推荐

  1. LeetCode279:完全平方数,动态规划解法超过46%,作弊解法却超过97%

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇概览 这是道高频面试题,值得一看 首先, ...

  2. 使用shuffle sharding增加容错性

    使用shuffle sharding增加容错性 最近在看kubernetes的API Priority and Fairness,它使用shuffle sharding来为请求选择处理队列,以此防止高 ...

  3. mpi转以太网连接200PLC转以太网modbusTCP服务器通信配置方法

    兴达易控200PLC转以太网modbusTCP服务器通信配置方法 产品简介 兴达易控PPI-ETH-XD1.0用于西门子S7-200/SMART S7-200PLC的以太网数据采集,非常方便构建生产管 ...

  4. RabbitMQ保姆级教程最佳实践

    一.消息队列介绍 1.消息队列概念 1.MQ全称为Message Queue,消息队列(MQ)是⼀种应⽤程序对应⽤程序的通信⽅法. 应⽤程序通过读写出⼊队列的消息(针对应⽤程序的数据)来通信,⽽⽆需专 ...

  5. pandas(进阶操作)-- 处理非数值型数据 -- 数据分析三剑客(核心)

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...

  6. 其它——MyCat实现分库分表

    文章目录 MyCat实现分库分表 一 开源数据库中间件-MyCat 二 MyCat简介 三 MyCat下载及安装 3.1 MySQL安装与启动 3.2使用docker启动多个数据库 3.3 MyCat ...

  7. 2006年piner的面试题

    数据库切换日志的时候,为什么一定要发生检查点?这个检查点有什么意义?表空间管理方式有哪几种,各有什么优劣.本地索引与全局索引的差别与适用情况.一个表a varchar2(1),b number(1), ...

  8. 使用 Helm 管理应用的一些 Tips

    背景 Helm 是一个 Kubernetes 的包管理工具,有点类似于 Mac 上的 brew,Python 中的 PIP:可以很方便的帮我们直接在 kubernetes 中安装某个应用. 比如我们可 ...

  9. 【Unity3D】水面特效

    1 前言 ​ 水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节.Shader Graph 基础知识详见→Shader Graph简 ...

  10. 【Unity3D】UI Toolkit容器

    1 前言 ​ UI Toolkit简介 中介绍了 UI Builder.样式属性.UQuery.Debugger,UI Toolkit元素 中介绍了 Label.Button.TextField.To ...