.NET8實(shí)現(xiàn)PDF合并的示例代碼
前言
在.NET 8中使用itext7需安裝 itext7 和 itext7.bouncy-castle-fips-adapter 兩個(gè)Nuget包,或者使用Aspose.PDF、PdfSharpCore、Spire.PDF任意一個(gè)第三方包就行
對(duì)比:
| 第三方包 | 是否開(kāi)源 | 是否收費(fèi) |
| itext7 | 是 | 不收費(fèi),免費(fèi)使用沒(méi)有水印 |
| PdfSharpCore | 是 | 不收費(fèi),免費(fèi)使用沒(méi)有水印 |
| Spire.PDF | 否 | 是,可以免費(fèi)使用但有水印 |
| Aspose.PDF | 否 | 是,可以免費(fèi)使用但有水印 |
安裝如下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>項(xiàng)目結(jié)構(gòu)示意圖

一、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>
/// 合并多個(gè)PDF文檔
/// 添加NuGet包引用:添加itext7和itext7.bouncy-castle-adapter,后者必須進(jìn)行添加,否則會(huì)在運(yùn)行報(bào)錯(cuò)。
/// NuGet包為iText7,該庫(kù)滿足跨平臺(tái)需求
/// 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/
//收費(fèi)
public static void Merge(string[] filesArray, string outFile)
{
// 創(chuàng)建 PdfFileEditor 對(duì)象
PdfFileEditor pdfEditor = new PdfFileEditor();
// 合并文件
//pdfEditor.Concatenate("file1.pdf", "file2.pdf", "merged.pdf");
// 合并文件
pdfEditor.Concatenate(filesArray, outFile);
}
public static void MergeStream(FileStream[] streamArray, string outFile)
{
// 創(chuàng)建 PdfFileEditor 對(duì)象
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);
// 創(chuàng)建流數(shù)組
//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>
/// 按每頁(yè)拆分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();
}
}
}在控制臺(tái)上調(diào)用
using PdfTest.PdfHelpers;
namespace PdfTest
{
internal class Program
{
static void Main(string[] args)
{
// 文件數(shù)組索引在前面的后,合并后的PDF,頁(yè)面也在前面
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實(shí)現(xiàn)PDF合并的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于.NET合并PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#圖片截取壓縮(百分比壓縮/大小壓縮)實(shí)現(xiàn)代碼
為了娛樂(lè)寫了個(gè)截取圖片和壓縮圖片你的小工具:按照百分比壓縮/制定大小壓縮等等,感興趣的朋友可以了解下啊,希望本文對(duì)你學(xué)些c#圖片知識(shí)有所幫助2013-01-01
asp.net 動(dòng)態(tài)生成控件并獲取其值
代碼比較簡(jiǎn)單,所以不多做解釋了:2009-02-02
淺談ASP.NET MVC 防止跨站請(qǐng)求偽造(CSRF)攻擊的實(shí)現(xiàn)方法
下面小編就為大家分享一篇淺談ASP.NET MVC 防止跨站請(qǐng)求偽造(CSRF)攻擊的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
.net任務(wù)調(diào)度框架FluentScheduler簡(jiǎn)介
這篇文章介紹了.net任務(wù)調(diào)度框架FluentScheduler,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
ASP.NET Core DI手動(dòng)獲取注入對(duì)象的方法
這篇文章主要給大家介紹了關(guān)于ASP.NET Core DI手動(dòng)獲取注入對(duì)象的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11

