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

.Net C#中相同内容PDF文件对比返回false问题求助

解决Word另存PDF后的内容一致性对比问题

你遇到的问题本质是:Word多次导出同内容为PDF时,文件会包含不同的隐性元数据(比如创建时间、文档唯一ID、生成时间戳等),这些元数据属于PDF文件结构的一部分,但不影响实际显示内容,所以直接对比字节或哈希会返回false。

以下是几种可行的解决方案:

方案1:提取PDF文本内容对比

直接提取两个PDF中的纯文本内容进行对比,忽略所有元数据。可以用iTextSharp这类PDF处理库实现:

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;

public static bool ArePdfContentsEqual(string path1, string path2)
{
    string text1 = ExtractPlainTextFromPdf(path1);
    string text2 = ExtractPlainTextFromPdf(path2);
    return text1.Equals(text2, StringComparison.OrdinalIgnoreCase); // 按需忽略大小写
}

private static string ExtractPlainTextFromPdf(string pdfPath)
{
    var textBuilder = new StringBuilder();
    using (var pdfReader = new PdfReader(pdfPath))
    {
        for (int pageNum = 1; pageNum <= pdfReader.NumberOfPages; pageNum++)
        {
            textBuilder.Append(PdfTextExtractor.GetTextFromPage(pdfReader, pageNum));
        }
    }
    return textBuilder.ToString();
}

方案2:对比PDF视觉渲染结果

如果需要确保视觉上完全一致(比如包含图片或复杂排版),可以将PDF每页渲染为图片,再对比图片哈希:

using PdfiumViewer;
using System.Drawing;
using System.Drawing.Imaging;
using System.Security.Cryptography;

public static bool ArePdfVisuallyIdentical(string path1, string path2)
{
    using (var doc1 = PdfDocument.Load(path1))
    using (var doc2 = PdfDocument.Load(path2))
    {
        if (doc1.PageCount != doc2.PageCount)
            return false;

        for (int pageIndex = 0; pageIndex < doc1.PageCount; pageIndex++)
        {
            // 300DPI渲染,保证清晰度
            using (var pageImg1 = doc1.Render(pageIndex, 300, 300, true))
            using (var pageImg2 = doc2.Render(pageIndex, 300, 300, true))
            {
                if (!ComputeImageHash(pageImg1).Equals(ComputeImageHash(pageImg2)))
                    return false;
            }
        }
        return true;
    }
}

private static string ComputeImageHash(Image image)
{
    using (var ms = new MemoryStream())
    {
        image.Save(ms, ImageFormat.Png);
        using (var sha1 = SHA1.Create())
        {
            byte[] hashBytes = sha1.ComputeHash(ms);
            return Convert.ToBase64String(hashBytes);
        }
    }
}

方案3:清理PDF可变元数据后再对比

用Ghostscript等工具清理PDF中的可变元数据,生成标准化后的PDF,再用你原来的字节/哈希对比方法:

# 清理第一个PDF
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dPDFSETTINGS=/default -dPreserveAnnots=false -sOutputFile=cleaned_pdf1.pdf original_pdf1.pdf

# 清理第二个PDF
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dPDFSETTINGS=/default -dPreserveAnnots=false -sOutputFile=cleaned_pdf2.pdf original_pdf2.pdf

清理后再调用你原来的AreFileContentsEqual或AreFilesEqual方法对比即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:23:32