IRONSOFTWAREHOME
使用IRONPDF

如何使用IronPDF创建.NET PDF API

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

以编程方式比较 PDF 文档对于跟踪更改、验证不同版本以及自动化质量保证工作流程至关重要。 无论您是需要比较两个 PDF 文件以进行文档管理,还是需要查找合同修订中的差异, IronPDF都提供了一个简化的解决方案,用于在 C# 中比较 PDF 文件。

本教程演示如何使用 IronPDF 的文本提取功能比较两个 PDF 文档,从基本比较到创建详细的差异报告。 您将学习实用的技术,并了解可在 Windows、Linux、macOS、Docker 和云平台上运行的代码示例。

如何使用C#与IronPDF比较两个PDF文件:图像 1 - IronPDF

先决条件和设置

开始之前,请确保已安装:

  • Visual Studio 2019 或更高版本
  • .NET Framework 4.6.2+ 或 .NET Core 3.1+
  • 具备基本的 C# 知识

安装IronPDF .NET包

在您的.NET项目中通过NuGet包管理器安装IronPDF:

PM > Install-Package IronPdf

如何使用C#与IronPDF比较两个PDF文件:图像 2 - 安装

或使用.NET CLI:

dotnet add package IronPdf

将必要的命名空间引用添加到您的文件中:

using IronPdf;
using System;

如何使用C#与IronPDF比较两个PDF文件:图像 3 - 功能

基本 PDF 文档比较

让我们从示例代码开始,通过提取和比较文本内容来比较 PDF 文件:

public class BasicPdfComparer
{
    public static bool ComparePdfFiles(string firstPdfPath, string secondPdfPath)
    {
        // Load two PDF documents
        var pdf1 = PdfDocument.FromFile(firstPdfPath);
        var pdf2 = PdfDocument.FromFile(secondPdfPath);
        // Extract all text from both PDFs
        string text1 = pdf1.ExtractAllText();
        string text2 = pdf2.ExtractAllText();
        // Compare the two documents
        bool areIdentical = text1 == text2;
        // Find differences and calculate similarity
        double similarity = CalculateSimilarity(text1, text2);
        Console.WriteLine($"Documents are {(areIdentical ? "identical" : "different")}");
        Console.WriteLine($"Similarity: {similarity:F2}%");
        return areIdentical;
    }
    private static double CalculateSimilarity(string text1, string text2)
    {
        if (text1 == text2) return 100.0;
        if (string.IsNullOrEmpty(text1) || string.IsNullOrEmpty(text2)) return 0.0;
        int matchingChars = 0;
        int minLength = Math.Min(text1.Length, text2.Length);
        for (int i = 0; i < minLength; i++)
        {
            if (text1[i] == text2[i]) matchingChars++;
        }
        return (double)matchingChars / Math.Max(text1.Length, text2.Length) * 100;
    }
}

此代码使用IronPDF的PdfDocument.FromFile()方法加载两个PDF文件,提取所有文本内容,并执行直接的字符串比较。 比较方法为您提供指标,以确定文档匹配的程度。

输入

如何使用C#与IronPDF比较两个PDF文件:图像 4 - 示例PDF输入1

如何使用C#与IronPDF比较两个PDF文件:图像 5 - 示例PDF输入2

输出

如何使用C#与IronPDF比较两个PDF文件:图像 6 - 控制台输出

逐页比较方法

如需更详细的分析,请逐页比较两个 PDF 以准确识别差异出现的位置:

public static void ComparePageByPage(string firstPdfPath, string secondPdfPath)
{
    // Load two files
    var pdf1 = PdfDocument.FromFile(firstPdfPath);
    var pdf2 = PdfDocument.FromFile(secondPdfPath);
    int maxPages = Math.Max(pdf1.PageCount, pdf2.PageCount);
    int differencesFound = 0;
    for (int i = 0; i < maxPages; i++)
    {
        // Process each page
        string page1Text = i < pdf1.PageCount ? pdf1.ExtractTextFromPage(i) : "";
        string page2Text = i < pdf2.PageCount ? pdf2.ExtractTextFromPage(i) : "";
        if (page1Text != page2Text)
        {
            differencesFound++;
            Console.WriteLine($"Page {i + 1}: Differences detected");
        }
        else
        {
            Console.WriteLine($"Page {i + 1}: Identical");
        }
    }
    Console.WriteLine($"\nSummary: {differencesFound} page(s) with changes");
}

ExtractTextFromPage()方法允许从特定页面进行定向提取。 这种方法帮助开发者找出不同版本 PDF 文档之间的差异。

使用 Comparer 类模式

创建专用的比较器类以增强您的比较功能:

public class PdfComparer
{
    private PdfDocument pdf1;
    private PdfDocument pdf2;
    private bool disposed;
    public PdfComparer(string file1Path, string file2Path)
    {
        // Load the two PDFs
        pdf1 = PdfDocument.FromFile(file1Path);
        pdf2 = PdfDocument.FromFile(file2Path);
    }
    public ComparisonResult Compare()
    {
        var result = new ComparisonResult();
        // Compare PDF documents
        string text1 = pdf1?.ExtractAllText() ?? string.Empty;
        string text2 = pdf2?.ExtractAllText() ?? string.Empty;
        result.AreIdentical = string.Equals(text1, text2, StringComparison.Ordinal);
        result.SimilarityPercent = CalculateSimilarity(text1, text2);
        result.Differences = FindDifferences(text1, text2);
        return result;
    }
    private List<string> FindDifferences(string text1, string text2)
    {
        var differences = new List<string>();
        // Normalize nulls
        text1 ??= string.Empty;
        text2 ??= string.Empty;
        if (string.Equals(text1, text2, StringComparison.Ordinal))
            return differences;
        // Page-aware comparisons aren't possible here because we only have full-text;
        // produce a concise, actionable difference entry:
        int min = Math.Min(text1.Length, text2.Length);
        int firstDiff = -1;
        for (int i = 0; i < min; i++)
        {
            if (text1[i] != text2[i])
            {
                firstDiff = i;
                break;
            }
        }
        if (firstDiff == -1 && text1.Length != text2.Length)
        {
            // No differing character in the overlap, but lengths differ
            firstDiff = min;
        }
        // Create short excerpts around the first difference for context
        int excerptLength = 200;
        string excerpt1 = string.Empty;
        string excerpt2 = string.Empty;
        if (firstDiff >= 0)
        {
            int start1 = Math.Max(0, firstDiff);
            int len1 = Math.Min(excerptLength, Math.Max(0, text1.Length - start1));
            excerpt1 = start1 < text1.Length ? text1.Substring(start1, len1) : string.Empty;
            int start2 = Math.Max(0, firstDiff);
            int len2 = Math.Min(excerptLength, Math.Max(0, text2.Length - start2));
            excerpt2 = start2 < text2.Length ? text2.Substring(start2, len2) : string.Empty;
        }
        // HTML-encode excerpts if they will be embedded into HTML reports
        string safeExcerpt1 = System.Net.WebUtility.HtmlEncode(excerpt1);
        string safeExcerpt2 = System.Net.WebUtility.HtmlEncode(excerpt2);
        double similarity = CalculateSimilarity(text1, text2);
        differences.Add($"Similarity: {similarity:F2}%. Lengths: [{text1.Length}, {text2.Length}]. First difference index: {firstDiff}. Excerpt1: \"{safeExcerpt1}\" Excerpt2: \"{safeExcerpt2}\"");
        return differences;
    }
    public void Close()
    {
        Dispose();
    }
    public void Dispose()
    {
        if (disposed) return;
        disposed = true;
        pdf1?.Dispose();
        pdf2?.Dispose();
    }
}
public class ComparisonResult
{
    // True when extracted text is exactly the same
    public bool AreIdentical { get; set; }
    // Similarity expressed as percent (0..100)
    public double SimilarityPercent { get; set; }
    // Human readable difference entries
    public List<string> Differences { get; set; } = new List<string>();
}

此类结构提供了一种清晰的方式来比较 PDF 文档,同时正确管理文档对象和引用。

输出

如何使用C#与IronPDF比较两个PDF文件:图像 7 - 比较器类模式输出

创建视觉比较报告

生成一个基于 HTML 的报告,突出显示两个文档之间的差异并将其保存为 PDF 文件:

public static void CreateComparisonReport(string pdf1Path, string pdf2Path, string outputPath)
{
    // Load PDFs for comparison
    var pdf1 = PdfDocument.FromFile(pdf1Path);
    var pdf2 = PdfDocument.FromFile(pdf2Path);
    // Build HTML report with details
    string htmlReport = @"
        <html>
        <head>
            <style>
                body { font-family: Arial, sans-serif; margin: 20px; }
                .identical { color: green; }
                .different { color: red; }
                table { width: 100%; border-collapse: collapse; }
                th, td { border: 1px solid #ddd; padding: 8px; }
            </style>
        </head>
        <body>
            <h1>PDF Comparison Report</h1>
            <table>
                <tr><th>Page</th><th>Status</th></tr>";
    // Process each page
    for (int i = 0; i < Math.Max(pdf1.PageCount, pdf2.PageCount); i++)
    {
        string page1 = i < pdf1.PageCount ? pdf1.ExtractTextFromPage(i) : "";
        string page2 = i < pdf2.PageCount ? pdf2.ExtractTextFromPage(i) : "";
        bool identical = page1 == page2;
        string status = identical ? "Identical" : "Different";
        htmlReport += $"<tr><td>Page {i + 1}</td><td class='{status.ToLower()}'>{status}</td></tr>";
    }
    htmlReport += "</table></body></html>";
    // Create and save the report
    var renderer = new ChromePdfRenderer();
    var reportPdf = renderer.RenderHtmlAsPdf(htmlReport);
    reportPdf.SaveAs(outputPath);
    Console.WriteLine($"Report saved to: {outputPath}");
}

此代码演示了如何创建一个包含比较结果的专业 PDF 文档。 报告保存到指定路径。

比较多个 PDF 文档

当您需要同时比较多个 PDF 文档时,使用此方法:

public static void CompareMultiplePdfs(params string[] pdfPaths)
{
    if (pdfPaths.Length < 2)
    {
        Console.WriteLine("Need at least two files to compare");
        return;
    }
    // Load multiple PDF documents
    var pdfs = new List<PdfDocument>();
    foreach (var path in pdfPaths)
    {
        pdfs.Add(PdfDocument.FromFile(path));
    }
    // Compare all documents
    for (int i = 0; i < pdfs.Count - 1; i++)
    {
        for (int j = i + 1; j < pdfs.Count; j++)
        {
            string text1 = pdfs[i].ExtractAllText();
            string text2 = pdfs[j].ExtractAllText();
            bool identical = text1 == text2;
            Console.WriteLine($"File {i+1} vs File {j+1}: {(identical ? "Identical" : "Different")}");
        }
    }
    // Close all documents
    pdfs.ForEach(pdf => pdf.Dispose());
}

这种方法允许在单次运行中比较多个 PDF 文档,适用于批量处理要求。

输出

如何使用C#与IronPDF比较两个PDF文件:图像 8 - 多PDF输出

现实世界合同版本控制

这是一个用于跟踪法律文件修订的实用示例:

public class ContractVersionControl
{
    public static void CompareContractVersions(string originalPath, string revisedPath)
    {
        // System for comparing contract versions
        Console.WriteLine("Contract Version Comparison System");
        var original = PdfDocument.FromFile(originalPath);
        var revised = PdfDocument.FromFile(revisedPath);
        // Extract contract contents
        string originalText = original.ExtractAllText();
        string revisedText = revised.ExtractAllText();
        if (originalText == revisedText)
        {
            Console.WriteLine("No changes detected");
        }
        else
        {
            Console.WriteLine("Changes detected in revised version");
            // Create detailed report
            string reportPath = $"contract_comparison_{DateTime.Now:yyyyMMdd}.pdf";
            CreateComparisonReport(originalPath, revisedPath, reportPath);
            Console.WriteLine($"Report created: {reportPath}");
        }
        // Close documents
        original.Dispose();
        revised.Dispose();
    }
}

这演示了如何比较两个 PDF 合同版本并生成审核报告。 系统会自动检测更改并创建文档。

处理受密码保护的 PDFs

IronPDF 无缝处理加密 PDF 文件,通过在调用加载方法时传递密码:

public static bool CompareProtectedPdfs(string pdf1Path, string pass1,
                                        string pdf2Path, string pass2)
{
    // Load password-protected two PDFs
    var pdf1 = PdfDocument.FromFile(pdf1Path, pass1);
    var pdf2 = PdfDocument.FromFile(pdf2Path, pass2);
    // Extract and compare text
    string text1 = pdf1.ExtractAllText();
    string text2 = pdf2.ExtractAllText();
    bool result = text1 == text2;
    // Close and dispose
    pdf1.Dispose();
    pdf2.Dispose();
    return result;
}

在加载受保护的 PDF 时,只需传递密码参数。 IronPDF 自动处理解密。

输入

如何使用C#与IronPDF比较两个PDF文件:图像 9 - 受保护的PDF 1

如何使用C#与IronPDF比较两个PDF文件:图像 10 - 受保护的PDF 2

输出

逐步说明

遵循以下步骤在您的 .NET 项目中实现 PDF 比较:

  1. 通过 NuGet 安装 IronPDF for .NET 包
  2. 添加 IronPDF 命名空间引用
  3. 为每个文件创建一个PdfDocument的实例
  4. 使用类似ExtractAllText()的方法获取内容
  5. 对比提取的文本或实现自定义逻辑
  6. 根据需要保存结果或生成报告
  7. 关闭文档对象以释放资源

如何使用C#与IronPDF比较两个PDF文件:图像 12 - 跨平台兼容性

设置您的许可证

若要使用无水印的 IronPDF,请设置您的许可证密钥:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

请访问许可页面了解可用选项的详细信息。 下载 IronPDF 的免费试用版,并使用专业级的比较功能设置 PDF 文件。

最佳实践

  1. 如果使用跟踪更改功能,请在进行比较之前接受所有修改。
  2. 为关键文件操作开发错误处理机制
  3. 通过为大型文档创建页面特定的比较来提高性能
  4. 对多个 PDF 文档异步运行比较
  5. 定期更新您的库以获取最新功能和支持

如何使用C#与IronPDF比较两个PDF文件:图像 14 - 使用C#比较两个PDF文件 - IronPDF

结论

IronPDF 简化了使用 C# 比较两个 PDF 文件的过程,其直观的 API 和强大的提取功能。 从基本比较到创建详细报告,IronPDF 提供了强大的文档比较工作流所需的所有工具。

易于安装、功能全面、跨平台支持的结合,使 IronPDF 成为开发人员在 .NET 应用程序中实现 PDF 比较的理想选择。 无论您是在开发文档管理系统还是版本控制解决方案,IronPDF 的简单方法都能让您快速上手。

立即开始 IronPDF 的免费试用,体验专业的 PDF 对比功能。 有了全面的技术支持和广泛的文档,您将在数小时内获得生产就绪的功能。 请参阅完整文档以了解更多高级功能。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户