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

如何在不使用PDF库的情况下用C#判断两个PDF内容是否一致

PDF内容一致性比较的.NET Core实现方案

问题背景

需要编写C#方法比较两个PDF的内容一致性,忽略元数据(如GUID、修改日期)差异。尝试过二进制对比和文本读取对比均无效,希望在.NET Core环境下实现。

尝试的二进制对比代码:

public static bool PdfFilesHaveTheSameContent(string filePathOne, string filePathTwo)
{
    var file1 = File.ReadAllBytes(filePathOne);
    var file2 = File.ReadAllBytes(filePathTwo);

    if (file1.Length != file2.Length)
        return false;

    for (var i = 0; i < file1.Length; i++)
    {
        if (file1[i] != file2[i])
        {
            return false;
        }
    }

    return true;
}

可行实现方案

完全可以在.NET Core中实现,核心是跳过PDF元数据,只提取并对比实际内容。推荐使用.NET Core兼容的开源PDF库,避免手动解析PDF的复杂逻辑。

方案一:使用PdfSharpCore(支持内容流对比)

  1. 安装NuGet包:Install-Package PdfSharpCore
  2. 实现代码:
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.Content;
using System.Linq;

public static bool ComparePdfContent(string path1, string path2)
{
    using (var doc1 = PdfReader.Open(path1, PdfDocumentOpenMode.ReadOnly))
    using (var doc2 = PdfReader.Open(path2, PdfDocumentOpenMode.ReadOnly))
    {
        // 先对比页数
        if (doc1.PageCount != doc2.PageCount)
            return false;

        // 逐页提取内容并清理元数据后对比
        for (int i = 0; i < doc1.PageCount; i++)
        {
            var content1 = ContentReader.ReadContent(doc1.Pages[i]).ToString();
            var content2 = ContentReader.ReadContent(doc2.Pages[i]).ToString();

            var cleanedContent1 = CleanPdfMetadata(content1);
            var cleanedContent2 = CleanPdfMetadata(content2);

            if (cleanedContent1 != cleanedContent2)
                return false;
        }

        return true;
    }
}

private static string CleanPdfMetadata(string content)
{
    // 过滤掉PDF元数据相关字段,可根据实际情况调整规则
    return string.Join("\n", content.Split('\n')
        .Where(line => !line.Contains("/ID") 
            && !line.Contains("/CreationDate") 
            && !line.Contains("/ModDate")));
}

方案二:使用iTextSharp.LGPLv2.Core(仅对比文本内容)

如果只需要对比可见文本,可使用此方案:

  1. 安装NuGet包:Install-Package iTextSharp.LGPLv2.Core
  2. 实现代码:
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Listener;

public static bool ComparePdfText(string path1, string path2)
{
    using (var reader1 = new PdfReader(path1))
    using (var reader2 = new PdfReader(path2))
    {
        var doc1 = new PdfDocument(reader1);
        var doc2 = new PdfDocument(reader2);

        if (doc1.GetNumberOfPages() != doc2.GetNumberOfPages())
            return false;

        // 逐页提取文本并对比
        for (int i = 1; i <= doc1.GetNumberOfPages(); i++)
        {
            var text1 = PdfTextExtractor.GetTextFromPage(doc1.GetPage(i), new SimpleTextExtractionStrategy());
            var text2 = PdfTextExtractor.GetTextFromPage(doc2.GetPage(i), new SimpleTextExtractionStrategy());

            if (text1 != text2)
                return false;
        }

        return true;
    }
}

说明

  • 手动解析PDF结构难度极大,不推荐尝试,开源库已处理PDF的复杂格式和元数据差异。
  • 若需要对比图像等非文本内容,可扩展方案一,提取图像的哈希值进行对比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:27:27