如何读取电子邮件中的多个PDF附件并合并保存为单个PDF文件
实现邮件PDF附件合并的方案
MimePart属于MIME解析组件(通常为MimeKit)的内置对象,仅负责邮件附件的结构解析与内容解码,本身不提供PDF文件合并能力,你需要结合第三方PDF处理库完成该需求,具体实现如下:
实现步骤
- 第一步:筛选所有邮件附件中格式为PDF的MimePart对象
- 第二步:将选中的PDF附件解码为内存流(无需落盘生成临时文件,减少IO开销)
- 第三步:通过PDF处理库按指定顺序合并多个PDF流
- 第四步:将合并完成的PDF文件写入到目标存储路径
代码示例
首先安装对应的NuGet包,以常用的跨平台PDF处理库PdfSharp为例,.NET Framework环境安装PdfSharp,.NET Core/.NET 6+环境安装PdfSharp.Core。
using MimeKit; using PdfSharp.Pdf; using PdfSharp.Pdf.IO; using System.IO; // 替换为你获取到的邮件对象 MimeMessage mailMessage = /* 你的MimeMessage邮件实例 */; string outputPdfPath = @"C:\目标路径\合并后的文件.pdf"; // 1. 筛选所有PDF格式的附件 var pdfAttachments = mailMessage.Attachments .OfType<MimePart>() .Where(part => part.ContentType.MediaType.Equals("application", StringComparison.OrdinalIgnoreCase) && part.ContentType.MediaSubtype.Equals("pdf", StringComparison.OrdinalIgnoreCase)) .ToList(); if (pdfAttachments.Any()) { // 2. 初始化合并用的PDF文档对象 using (var mergedPdf = new PdfDocument()) { foreach (var pdfPart in pdfAttachments) { // 3. 将PDF附件解码到内存流 using (var ms = new MemoryStream()) { pdfPart.ContentObject.DecodeTo(ms); ms.Position = 0; // 4. 读取当前PDF流的所有页面,导入到合并文档 using (var sourcePdf = PdfReader.Open(ms, PdfDocumentOpenMode.Import)) { for (int i = 0; i < sourcePdf.PageCount; i++) { mergedPdf.AddPage(sourcePdf.Pages[i]); } } } } // 5. 保存合并后的PDF文件 mergedPdf.Save(outputPdfPath); } }
注意事项
- 如果PDF附件带有密码加密,你需要在读取PDF流时补充密码校验逻辑,不同PDF处理库的密码传参方式略有差异
- 如果你不需要保留原始单个PDF附件,无需将单个附件写入本地磁盘,直接用内存流处理即可降低性能开销
- 也可以选择其他PDF处理库实现合并逻辑,比如iText7、QuestPDF等,核心逻辑都是先解码附件、再合并PDF内容,仅API调用方式有区别
内容的提问来源于stack exchange,提问作者vaibhav shah
相关产品推荐
相关产品推荐

