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

ITextSharp 5.5读取损坏PDF崩溃,4.6.1正常,求非降级解决方案

解决iTextSharp 5.5读取轻微损坏PDF的问题

针对你遇到的iTextSharp 5.5无法读取部分轻微损坏PDF(但4.6.1可正常读取)的问题,可通过调整阅读器的宽容参数和构造方式解决,无需降级版本。

关键修改点

  • 调整unethicalreading设置时机:必须在创建PdfReader实例前设置,否则初始化阶段的合规校验不会生效。
  • 启用部分读取模式:使用带partial参数的PdfReader构造函数,允许阅读器读取结构轻微损坏的PDF。
  • 启用错误恢复机制:通过SetErrorRecovery让阅读器尝试自动修复PDF中的语法错误。

修改后的代码

public static async Task<byte[]> FlatPdf(byte[] pdfFile)
{
    byte[] newBuffer = null;
    PdfReader reader = null;
    try
    {
        // 先设置非合规读取允许,必须在创建PdfReader前执行
        PdfReader.unethicalreading = true;
        // 启用错误恢复,让阅读器尝试修复轻微损坏
        PdfReader.SetErrorRecovery(true);
        
        using (var inputStream = new MemoryStream(pdfFile))
        {
            // 使用partial模式构造阅读器,允许读取部分损坏的PDF
            reader = new PdfReader(inputStream, true);
            
            using (var outStream = new MemoryStream())
            {
                using (var stamp = new PdfStamper(reader, outStream) { FormFlattening = true })
                {
                    // using块会自动处理资源释放,无需手动调用Close
                }
                newBuffer = outStream.ToArray();
            }
        }
    }
    catch (Exception ex)
    {
        LoggerEx.GetLogger().Error($"Error occurred while Flattening process,\n Exception: {ex}");
    }
    finally
    {
        // 确保阅读器被正确关闭
        reader?.Close();
    }
    return newBuffer;
}

说明

  • PdfReader.unethicalreading = true:关闭PDF的部分严格合规性校验,允许读取不符合规范的文件。
  • PdfReader.SetErrorRecovery(true):让阅读器在遇到语法错误时尝试自动恢复,而非直接抛出异常。
  • new PdfReader(inputStream, true):true参数开启部分读取模式,允许阅读器跳过损坏片段,尽可能读取可用内容。

原代码中手动调用stamp.Close()和reader.Close()属于冗余操作,using语句会自动释放资源,修改后已移除。

内容的提问来源于stack exchange,提问作者Gad Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:10:27