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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:34:51