You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#从PDF提取二维码图片:iTextSharp版本适配代码报错求助

解决iTextSharp版本兼容问题并提取PDF中的二维码图片

Hey there, let's fix this issue and get those QR codes extracted properly!

问题根源:版本差异导致的API变更

你遇到的参数不匹配错误,确实是iTextSharp版本兼容问题导致的。在较新的iTextSharp 5.x版本中,ImageRenderInfo.CreateForXObject方法的参数签名已经更新:旧版本接受Matrix作为第一个参数,但新版本要求传入GraphicsState对象,这就是代码报错的直接原因。

更关键的是:手动创建ImageRenderInfo其实是没必要的——iTextSharp提供了更规范的内容解析方式,能自动帮你处理这些对象,避免版本适配问题。

完整解决方案:提取PDF中的二维码

下面是适配iTextSharp 5.5.x稳定版(推荐用5.5.13.3,这是iTextSharp最后一批官方维护版本)的代码,同时集成了二维码检测逻辑,精准提取你需要的二维码图片:

步骤1:安装依赖包

先通过NuGet安装两个必要的包:

  • iTextSharp(版本选5.5.13.3)
  • ZXing.Net(用于检测二维码)

步骤2:完整代码实现

using System;
using System.IO;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
using ZXing;
using ZXing.QrCode;

public class PdfQrCodeExtractor : IRenderListener
{
    private readonly string _saveFolder;

    // 构造函数:传入二维码保存路径
    public PdfQrCodeExtractor(string saveFolder)
    {
        _saveFolder = saveFolder;
        // 确保保存目录存在
        Directory.CreateDirectory(saveFolder);
    }

    // 以下三个方法是IRenderListener接口的必填空实现
    public void BeginTextBlock() { }
    public void EndTextBlock() { }
    public void RenderText(TextRenderInfo renderInfo) { }

    // 核心:处理PDF中的图片
    public void RenderImage(ImageRenderInfo renderInfo)
    {
        try
        {
            // 获取PDF中的图片对象
            PdfImageObject imgObj = renderInfo.GetImage();
            if (imgObj == null) return;

            // 将图片转为字节数组
            byte[] imgBytes = imgObj.GetImageAsBytes();
            if (imgBytes.Length == 0) return;

            // 检测当前图片是否为二维码
            var qrReader = new BarcodeReader
            {
                Options = new QrCodeEncodingOptions
                {
                    TryHarder = true, // 尝试更复杂的识别逻辑
                    PossibleFormats = new[] { BarcodeFormat.QR_CODE }
                }
            };
            var qrResult = qrReader.Decode(imgBytes);

            // 如果是二维码,保存到指定目录
            if (qrResult != null)
            {
                string savePath = Path.Combine(_saveFolder, $"QRCode_{Guid.NewGuid()}.png");
                using (var fs = new FileStream(savePath, FileMode.Create))
                {
                    fs.Write(imgBytes, 0, imgBytes.Length);
                }
                Console.WriteLine($"成功提取二维码:{savePath}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"处理图片时出错:{ex.Message}");
        }
    }

    // 对外暴露的提取入口方法
    public static void ExtractQrCodes(string pdfFilePath, string saveFolder)
    {
        using (var pdfReader = new PdfReader(pdfFilePath))
        {
            var contentParser = new PdfReaderContentParser(pdfReader);
            var extractor = new PdfQrCodeExtractor(saveFolder);

            // 遍历PDF所有页面
            for (int pageNum = 1; pageNum <= pdfReader.NumberOfPages; pageNum++)
            {
                contentParser.ProcessContent(pageNum, extractor);
            }
        }
    }
}

// 使用示例
// PdfQrCodeExtractor.ExtractQrCodes(@"D:\test.pdf", @"D:\ExtractedQRCodes");

关键说明

  1. 避免手动创建ImageRenderInfo:通过实现IRenderListener接口,iTextSharp会自动在解析PDF内容时调用RenderImage方法,并传入正确的ImageRenderInfo对象,完全避开版本参数适配问题。
  2. 精准筛选二维码:借助ZXing.Net库,我们可以直接检测图片是否为二维码,只保存需要的图片,避免提取大量无关图片。
  3. 版本兼容性:如果你的项目是.NET Framework,iTextSharp 5.5.13.3是稳定选择;如果是.NET Core/.NET 5+,建议改用iText7(API完全不同,但支持跨平台)。

内容的提问来源于stack exchange,提问作者Maryam Aldossary

火山引擎 最新活动