You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:00:33