使用C#在.NET 7中提取PDF图像:类库兼容性问题咨询
可行的PDF图像提取方案(.NET 7及更早版本兼容)
方案1:使用iTextSharp(稳定兼容)
iTextSharp的5.x版本(如5.5.13.3)对.NET 7及更早版本(包括.NET Core 3.x、.NET Framework)兼容性良好,文档相对完善,能处理大多数PDF图像提取场景。
实现步骤:
- 通过NuGet安装
iTextSharp(选择5.x版本,避开API变动较大的7.x系列) - 遍历PDF每一页,提取页内图像资源并保存为本地文件
代码示例:
using iTextSharp.text.pdf; using System.IO; public void ExtractImagesFromPdf(string pdfPath, string outputDir) { Directory.CreateDirectory(outputDir); using (var reader = new PdfReader(pdfPath)) { for (int pageNum = 1; pageNum <= reader.NumberOfPages; pageNum++) { var pageDict = reader.GetPageN(pageNum); var resourcesDict = pageDict.GetAsDict(PdfName.RESOURCES); var xObjectDict = resourcesDict?.GetAsDict(PdfName.XOBJECT); if (xObjectDict == null) continue; foreach (var key in xObjectDict.Keys) { var obj = xObjectDict.GetAsIndirectObject(key); var dict = PdfReader.GetPdfObject(obj) as PdfDictionary; if (dict == null || !PdfName.IMAGE.Equals(dict.GetAsName(PdfName.SUBTYPE))) continue; var stream = dict.GetAsStream(PdfName.CONTENTS); var bytes = PdfReader.GetStreamBytes(stream); var fileExt = GetImageExtension(dict.GetAsName(PdfName.FILTER)); var outputPath = Path.Combine(outputDir, $"Page_{pageNum}_Image_{key}_{Guid.NewGuid()}.{fileExt}"); File.WriteAllBytes(outputPath, bytes); } } } } private string GetImageExtension(PdfName filter) { return filter switch { PdfName.DCTDECODE => "jpg", PdfName.JPXDECODE => "jp2", PdfName.FLATEDECODE => "png", PdfName.LZWDECODE => "tiff", _ => "bin" }; }
方案2:使用PdfiumViewer(基于原生Pdfium,兼容性强)
PdfiumViewer封装了Google的Pdfium库,对.NET 7及更早版本支持良好,能处理复杂PDF的图像提取,包括矢量转位图的场景。
实现步骤:
- 通过NuGet安装
PdfiumViewer(选择适配.NET 7的版本,如2.12.0) - 加载PDF文档,逐页提取原生图像资源或渲染页面获取图像
代码示例(提取原生图像):
using PdfiumViewer; using System.IO; public void ExtractImagesWithPdfium(string pdfPath, string outputDir) { Directory.CreateDirectory(outputDir); using (var document = PdfDocument.Load(pdfPath)) { int imageIndex = 0; foreach (var page in document.Pages) { foreach (var image in page.Images) { using (var stream = new MemoryStream()) { image.Save(stream, image.RawFormat); var ext = image.RawFormat.ToString().ToLower().Replace("image/", ""); var outputPath = Path.Combine(outputDir, $"Page_{page.Index + 1}_Image_{imageIndex++}.{ext}"); File.WriteAllBytes(outputPath, stream.ToArray()); } } } } }
方案3:使用PdfSharp(轻量型,适合简单场景)
PdfSharp的1.50.5147版本对.NET 7兼容,API简单,适合提取基础PDF图像,无需复杂依赖。
代码示例:
using PdfSharp.Pdf; using PdfSharp.Pdf.Content; using PdfSharp.Pdf.Content.Objects; using System.IO; public void ExtractImagesWithPdfSharp(string pdfPath, string outputDir) { Directory.CreateDirectory(outputDir); var document = PdfReader.Open(pdfPath, PdfDocumentOpenMode.Import); int imageCount = 0; foreach (var page in document.Pages) { var content = ContentReader.ReadContent(page); TraverseContent(content, page, outputDir, ref imageCount); } } private void TraverseContent(CObject content, PdfPage page, string outputDir, ref int imageCount) { if (content is CObjectArray array) { foreach (var item in array) TraverseContent(item, page, outputDir, ref imageCount); return; } if (content is CInlineImage inlineImage) { var bytes = inlineImage.Image.Value; var outputPath = Path.Combine(outputDir, $"Image_{imageCount++}.png"); File.WriteAllBytes(outputPath, bytes); return; } if (content is CExternalImage externalImage) { var image = page.Resources.Images[externalImage.Name]; var bytes = image.Value; var outputPath = Path.Combine(outputDir, $"Image_{imageCount++}.png"); File.WriteAllBytes(outputPath, bytes); } }
注意事项:
- 遇到加密PDF时,需先调用对应库的解密API(如iTextSharp的
reader.UnlockWithPassword) - 部分PDF的图像可能经过特殊压缩或编码,需根据实际情况调整图像格式判断逻辑
- 测试时优先用常见PDF格式验证,再覆盖复杂场景(如含矢量图、嵌入字体的PDF)
内容的提问来源于stack exchange,提问作者Ibrahim Ahmad
相关产品推荐
相关产品推荐

