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
相关产品推荐
相关产品推荐

