使用iText7 8.0.4与C# .NET 8合并PDF时遇未知PdfException
解决iText7 8.0.4合并PDF时的Unknown PdfException问题
可能的原因与解决方案
1. 调整PDF合并的初始化逻辑
你的代码直接用第一个PDF的PdfReader和目标文件的PdfWriter初始化PdfDocument,这种方式可能引发文件访问冲突或PDF结构处理异常。正确的做法是创建一个全新的目标PDF文档,再将两个源PDF合并进去:
using iText.Kernel.Pdf; using iText.Kernel.Utils; string path = @"C:\Temp\Test\"; string file1 = $@"{path}The order in which the DB engine executes the query.pdf"; string file2 = $@"{path}sql-for-data-analysis-cheat-sheet-letter.pdf"; string mergeFile = $@"{path}mergeFile.pdf"; try { // 创建空的目标PDF文档 using (PdfDocument targetDoc = new PdfDocument(new PdfWriter(mergeFile))) { PdfMerger merger = new PdfMerger(targetDoc); // 合并第一个PDF using (PdfDocument sourceDoc1 = new PdfDocument(new PdfReader(file1))) { merger.Merge(sourceDoc1, 1, sourceDoc1.GetNumberOfPages()); } // 合并第二个PDF using (PdfDocument sourceDoc2 = new PdfDocument(new PdfReader(file2))) { merger.Merge(sourceDoc2, 1, sourceDoc2.GetNumberOfPages()); } } } catch (IOException ioEx) { LogError($"IO error occurred: {ioEx.Message}", ioEx.ToString()); } catch (UnauthorizedAccessException uaEx) { LogError($"Access error occurred: {uaEx.Message}", uaEx.ToString()); } catch (iText.Kernel.PdfException pdfEx) { // 捕获iText专属异常,获取更详细信息 LogError($"PDF processing error occurred: {pdfEx.Message}", pdfEx.ToString()); } catch (Exception ex) { LogError($"An unexpected error occurred: {ex.Message}", ex.ToString()); } static void LogError(string message, string details = "") { Console.WriteLine(message); if (!string.IsNullOrEmpty(details)) { Console.WriteLine(details); } Console.ReadLine(); }
2. 捕获并查看详细的异常信息
原代码只捕获通用Exception且仅输出Message,无法获取PdfException的具体细节(比如内部异常、堆栈跟踪)。修改代码专门捕获iText.Kernel.PdfException,并输出完整的异常信息,这能帮你定位具体问题(比如PDF加密、结构损坏、PDF/A兼容性问题等)。
3. 处理特殊PDF文件场景
如果你的PDF存在加密、数字签名或轻微结构损坏,iText的校验比neevia更严格,可以尝试以下调整:
- 若PDF有加密且你有权限,添加
ReaderProperties允许读取:PdfReader reader = new PdfReader(filePath, new ReaderProperties().SetPassword(Encoding.UTF8.GetBytes("your-password"))); - 若PDF存在轻微结构问题,允许读取非标准PDF:
PdfReader reader = new PdfReader(filePath, new ReaderProperties().SetUnethicalReading(true)); - 若涉及PDF/A兼容性问题,关闭兼容性校验:
PdfWriter writer = new PdfWriter(mergeFile, new WriterProperties().SetIgnorePdfACompatibilityErrors(true));
内容的提问来源于stack exchange,提问作者user3537446
相关产品推荐
相关产品推荐

