Cómo comparar dos archivos PDF en C#
La comparación programática de documentos PDF es esencial para el seguimiento de cambios, la validación de diferentes versiones y la automatización de flujos de trabajo de control de calidad. Tanto si necesita comparar dos archivos PDF para la gestión de documentos como encontrar diferencias en las revisiones de un contrato, IronPDF le ofrece una solución optimizada para comparar archivos PDF en C#.
Este tutorial muestra cómo comparar dos documentos PDF utilizando las capacidades de extracción de texto de IronPDF, desde comparaciones básicas hasta la creación de informes detallados de diferencias. Aprenderás técnicas prácticas con ejemplos de código que funcionan en Windows, Linux, macOS, Docker y plataformas en la nube.

Requisitos previos y configuración
Antes de empezar, asegúrese de tener instalado:
- Visual Studio 2019 o posterior
- .NET Framework 4.6.2+ o .NET Core 3.1+
- Conocimientos básicos de C#
Instalación del paquete IronPDF .NET
Instala IronPDF a través del Administrador de Paquetes NuGet en tu proyecto .NET:
Install-Package IronPdf
Install-Package IronPdf

O utilizando la CLI de .NET:
dotnet add package IronPdf
dotnet add package IronPdf
Añada la referencia de espacio de nombres necesaria a sus archivos:
using IronPdf;
using System;
using IronPdf;
using System;
Imports IronPdf
Imports System

Comparación básica de documentos PDF
Empecemos con un código de ejemplo para comparar archivos PDF extrayendo y comparando su contenido textual:
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;
}
}
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;
}
}
Imports System
Public Class BasicPdfComparer
Public Shared Function ComparePdfFiles(firstPdfPath As String, secondPdfPath As String) As Boolean
' Load two PDF documents
Dim pdf1 = PdfDocument.FromFile(firstPdfPath)
Dim pdf2 = PdfDocument.FromFile(secondPdfPath)
' Extract all text from both PDFs
Dim text1 As String = pdf1.ExtractAllText()
Dim text2 As String = pdf2.ExtractAllText()
' Compare the two documents
Dim areIdentical As Boolean = text1 = text2
' Find differences and calculate similarity
Dim similarity As Double = CalculateSimilarity(text1, text2)
Console.WriteLine($"Documents are {(If(areIdentical, "identical", "different"))}")
Console.WriteLine($"Similarity: {similarity:F2}%")
Return areIdentical
End Function
Private Shared Function CalculateSimilarity(text1 As String, text2 As String) As Double
If text1 = text2 Then Return 100.0
If String.IsNullOrEmpty(text1) OrElse String.IsNullOrEmpty(text2) Then Return 0.0
Dim matchingChars As Integer = 0
Dim minLength As Integer = Math.Min(text1.Length, text2.Length)
For i As Integer = 0 To minLength - 1
If text1(i) = text2(i) Then matchingChars += 1
Next
Return matchingChars / Math.Max(text1.Length, text2.Length) * 100
End Function
End Class
Este código carga dos archivos PDF utilizando el método PdfDocument.FromFile() de IronPDF, extrae todo el contenido de texto y realiza una comparación directa de cadenas. El método de comparación proporciona métricas para identificar el grado de coincidencia de los documentos.
Entrada


Resultado

Método de comparación página por página
Para un análisis más detallado, compare dos PDF página por página para identificar exactamente dónde se producen las diferencias:
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");
}
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");
}
Public Shared Sub ComparePageByPage(firstPdfPath As String, secondPdfPath As String)
' Load two files
Dim pdf1 = PdfDocument.FromFile(firstPdfPath)
Dim pdf2 = PdfDocument.FromFile(secondPdfPath)
Dim maxPages As Integer = Math.Max(pdf1.PageCount, pdf2.PageCount)
Dim differencesFound As Integer = 0
For i As Integer = 0 To maxPages - 1
' Process each page
Dim page1Text As String = If(i < pdf1.PageCount, pdf1.ExtractTextFromPage(i), "")
Dim page2Text As String = If(i < pdf2.PageCount, pdf2.ExtractTextFromPage(i), "")
If page1Text <> page2Text Then
differencesFound += 1
Console.WriteLine($"Page {i + 1}: Differences detected")
Else
Console.WriteLine($"Page {i + 1}: Identical")
End If
Next
Console.WriteLine(vbCrLf & $"Summary: {differencesFound} page(s) with changes")
End Sub
El método ExtractTextFromPage() permite la extracción específica de páginas. Este enfoque ayuda a los desarrolladores a identificar las discrepancias entre las distintas versiones de los documentos PDF.
Utilización del patrón de clase Comparer
Cree una clase de comparador dedicada para mejorar su funcionalidad de comparación:
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>();
}
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>();
}
Imports System
Imports System.Collections.Generic
Imports System.Net
Public Class PdfComparer
Implements IDisposable
Private pdf1 As PdfDocument
Private pdf2 As PdfDocument
Private disposed As Boolean
Public Sub New(file1Path As String, file2Path As String)
' Load the two PDFs
pdf1 = PdfDocument.FromFile(file1Path)
pdf2 = PdfDocument.FromFile(file2Path)
End Sub
Public Function Compare() As ComparisonResult
Dim result As New ComparisonResult()
' Compare PDF documents
Dim text1 As String = If(pdf1?.ExtractAllText(), String.Empty)
Dim text2 As String = If(pdf2?.ExtractAllText(), String.Empty)
result.AreIdentical = String.Equals(text1, text2, StringComparison.Ordinal)
result.SimilarityPercent = CalculateSimilarity(text1, text2)
result.Differences = FindDifferences(text1, text2)
Return result
End Function
Private Function FindDifferences(text1 As String, text2 As String) As List(Of String)
Dim differences As New List(Of String)()
' Normalize nulls
text1 = If(text1, String.Empty)
text2 = If(text2, String.Empty)
If String.Equals(text1, text2, StringComparison.Ordinal) Then
Return differences
End If
' Page-aware comparisons aren't possible here because we only have full-text;
' produce a concise, actionable difference entry:
Dim min As Integer = Math.Min(text1.Length, text2.Length)
Dim firstDiff As Integer = -1
For i As Integer = 0 To min - 1
If text1(i) <> text2(i) Then
firstDiff = i
Exit For
End If
Next
If firstDiff = -1 AndAlso text1.Length <> text2.Length Then
' No differing character in the overlap, but lengths differ
firstDiff = min
End If
' Create short excerpts around the first difference for context
Dim excerptLength As Integer = 200
Dim excerpt1 As String = String.Empty
Dim excerpt2 As String = String.Empty
If firstDiff >= 0 Then
Dim start1 As Integer = Math.Max(0, firstDiff)
Dim len1 As Integer = Math.Min(excerptLength, Math.Max(0, text1.Length - start1))
excerpt1 = If(start1 < text1.Length, text1.Substring(start1, len1), String.Empty)
Dim start2 As Integer = Math.Max(0, firstDiff)
Dim len2 As Integer = Math.Min(excerptLength, Math.Max(0, text2.Length - start2))
excerpt2 = If(start2 < text2.Length, text2.Substring(start2, len2), String.Empty)
End If
' HTML-encode excerpts if they will be embedded into HTML reports
Dim safeExcerpt1 As String = WebUtility.HtmlEncode(excerpt1)
Dim safeExcerpt2 As String = WebUtility.HtmlEncode(excerpt2)
Dim similarity As Double = CalculateSimilarity(text1, text2)
differences.Add($"Similarity: {similarity:F2}%. Lengths: [{text1.Length}, {text2.Length}]. First difference index: {firstDiff}. Excerpt1: ""{safeExcerpt1}"" Excerpt2: ""{safeExcerpt2}""")
Return differences
End Function
Public Sub Close()
Dispose()
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
If disposed Then Return
disposed = True
pdf1?.Dispose()
pdf2?.Dispose()
End Sub
End Class
Public Class ComparisonResult
' True when extracted text is exactly the same
Public Property AreIdentical As Boolean
' Similarity expressed as percent (0..100)
Public Property SimilarityPercent As Double
' Human readable difference entries
Public Property Differences As List(Of String) = New List(Of String)()
End Class
Esta estructura de clases proporciona una forma limpia de comparar documentos PDF, a la vez que gestiona adecuadamente los objetos y las referencias de los documentos.
Resultado

Creación de un informe de comparación visual
Genera un informe basado en HTML que resalte las diferencias entre dos documentos y guárdalo como archivo 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}");
}
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}");
}
Imports System
Public Shared Sub CreateComparisonReport(pdf1Path As String, pdf2Path As String, outputPath As String)
' Load PDFs for comparison
Dim pdf1 = PdfDocument.FromFile(pdf1Path)
Dim pdf2 = PdfDocument.FromFile(pdf2Path)
' Build HTML report with details
Dim htmlReport As String = "
<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 i As Integer = 0 To Math.Max(pdf1.PageCount, pdf2.PageCount) - 1
Dim page1 As String = If(i < pdf1.PageCount, pdf1.ExtractTextFromPage(i), "")
Dim page2 As String = If(i < pdf2.PageCount, pdf2.ExtractTextFromPage(i), "")
Dim identical As Boolean = page1 = page2
Dim status As String = If(identical, "Identical", "Different")
htmlReport &= $"<tr><td>Page {i + 1}</td><td class='{status.ToLower()}'>{status}</td></tr>"
Next
htmlReport &= "</table></body></html>"
' Create and save the report
Dim renderer = New ChromePdfRenderer()
Dim reportPdf = renderer.RenderHtmlAsPdf(htmlReport)
reportPdf.SaveAs(outputPath)
Console.WriteLine($"Report saved to: {outputPath}")
End Sub
Este código muestra cómo crear un documento PDF profesional con resultados de comparación. El informe se guarda en la ruta especificada.
Comparación de varios documentos PDF
Cuando necesite comparar varios documentos PDF simultáneamente, utilice este método:
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());
}
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());
}
Imports System
Imports System.Collections.Generic
Public Shared Sub CompareMultiplePdfs(ParamArray pdfPaths As String())
If pdfPaths.Length < 2 Then
Console.WriteLine("Need at least two files to compare")
Return
End If
' Load multiple PDF documents
Dim pdfs As New List(Of PdfDocument)()
For Each path As String In pdfPaths
pdfs.Add(PdfDocument.FromFile(path))
Next
' Compare all documents
For i As Integer = 0 To pdfs.Count - 2
For j As Integer = i + 1 To pdfs.Count - 1
Dim text1 As String = pdfs(i).ExtractAllText()
Dim text2 As String = pdfs(j).ExtractAllText()
Dim identical As Boolean = text1 = text2
Console.WriteLine($"File {i + 1} vs File {j + 1}: {(If(identical, "Identical", "Different"))}")
Next
Next
' Close all documents
pdfs.ForEach(Sub(pdf) pdf.Dispose())
End Sub
Este enfoque permite comparar varios documentos PDF en una sola ejecución, lo que resulta útil para los requisitos de procesamiento por lotes.
Resultado

Control de versiones de contratos en el mundo real
He aquí un ejemplo práctico de seguimiento de revisiones en documentos jurídicos:
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();
}
}
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();
}
}
Public Class ContractVersionControl
Public Shared Sub CompareContractVersions(originalPath As String, revisedPath As String)
' System for comparing contract versions
Console.WriteLine("Contract Version Comparison System")
Dim original = PdfDocument.FromFile(originalPath)
Dim revised = PdfDocument.FromFile(revisedPath)
' Extract contract contents
Dim originalText As String = original.ExtractAllText()
Dim revisedText As String = revised.ExtractAllText()
If originalText = revisedText Then
Console.WriteLine("No changes detected")
Else
Console.WriteLine("Changes detected in revised version")
' Create detailed report
Dim reportPath As String = $"contract_comparison_{DateTime.Now:yyyyMMdd}.pdf"
CreateComparisonReport(originalPath, revisedPath, reportPath)
Console.WriteLine($"Report created: {reportPath}")
End If
' Close documents
original.Dispose()
revised.Dispose()
End Sub
End Class
Esto demuestra cómo comparar dos versiones de contratos PDF y generar informes para su revisión. El sistema detecta automáticamente los cambios y crea la documentación.
Manejo de archivos PDF protegidos con contraseña
IronPDF gestiona sin problemas archivos PDF cifrados pasando la contraseña al llamar al método de carga:
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;
}
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;
}
Public Shared Function CompareProtectedPdfs(pdf1Path As String, pass1 As String, pdf2Path As String, pass2 As String) As Boolean
' Load password-protected two PDFs
Dim pdf1 = PdfDocument.FromFile(pdf1Path, pass1)
Dim pdf2 = PdfDocument.FromFile(pdf2Path, pass2)
' Extract and compare text
Dim text1 As String = pdf1.ExtractAllText()
Dim text2 As String = pdf2.ExtractAllText()
Dim result As Boolean = text1 = text2
' Close and dispose
pdf1.Dispose()
pdf2.Dispose()
Return result
End Function
Basta con pasar el parámetro de la contraseña al cargar PDF protegidos. IronPDF gestiona el descifrado automáticamente.
Entrada


Resultado

Instrucciones paso a paso
Siga estos pasos para implementar la comparación de PDF en su proyecto .NET:
- Instalación del paquete IronPDF for .NET a través de NuGet
- Añadir la referencia del espacio de nombres IronPDF
- Cree una instancia de
PdfDocumentpara cada archivo - Utilice métodos como
ExtractAllText()para obtener el contenido - Comparar el texto extraído o implementar una lógica personalizada
- Guardar los resultados o generar informes según sea necesario
- Cerrar documento objetos a recursos gratuitos

Configuración de la licencia
Para utilizar IronPDF sin marcas de agua, configure su clave de licencia:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Visite la página de licencias para obtener más información sobre las opciones disponibles. Descargue la prueba gratuita de IronPDF y configure archivos PDF usando capacidades de comparación de grado profesional.

Mejores prácticas
- Acepte todas las revisiones antes de la comparación si trabaja con cambios rastreados
- Desarrollar la gestión de errores para operaciones de archivo cruciales
- Mejorar el rendimiento mediante la creación de comparaciones específicas de páginas para documentos de gran tamaño
- Ejecutar comparaciones de forma asíncrona para varios documentos PDF
- Actualice su biblioteca con regularidad para obtener las últimas funciones y soporte

Conclusión
IronPDF simplifica el proceso de comparación de dos archivos PDF utilizando C# con su intuitiva API y sus potentes funciones de extracción. Desde la comparación básica hasta la creación de informes detallados, IronPDF proporciona todas las herramientas necesarias para flujos de trabajo sólidos de comparación de documentos.
La combinación de instalación sencilla, funcionalidad completa y compatibilidad multiplataforma convierte a IronPDF en la opción ideal para los desarrolladores que implementan la comparación de PDF en aplicaciones .NET. Tanto si está desarrollando sistemas de gestión de documentos como soluciones de control de versiones, el enfoque directo de IronPDF le permitirá ponerse en marcha rápidamente.
Comience hoy mismo su prueba gratuita de IronPDF e implemente funciones profesionales de comparación de PDF. Con un soporte técnico completo y una amplia documentación, dispondrá de una funcionalidad lista para producción en cuestión de horas. Consulte la documentación completa para obtener más información sobre las funciones avanzadas.
Preguntas Frecuentes
¿Qué es IronPDF y cómo ayuda en la comparación de archivos PDF?
IronPDF es una biblioteca .NET que proporciona herramientas para trabajar con archivos PDF, incluyendo funciones para comparar programáticamente dos documentos PDF en busca de diferencias en contenido o estructura.
¿Puede IronPDF resaltar las diferencias entre dos archivos PDF?
Sí, IronPDF puede resaltar las diferencias entre dos archivos PDF comparando su contenido y proporcionando un informe detallado de los cambios o discrepancias.
¿Necesito habilidades avanzadas en C# para comparar PDF con IronPDF?
No, no necesitas habilidades avanzadas en C#. IronPDF ofrece métodos simples e intuitivos para comparar archivos PDF, haciéndolo accesible para desarrolladores de diversos niveles de habilidad.
¿Es posible comparar archivos PDF cifrados usando IronPDF?
Sí, IronPDF admite la comparación de archivos PDF cifrados, siempre que se proporcione la contraseña correcta para acceder al contenido de los documentos.
¿Qué tipos de diferencias puede detectar IronPDF entre dos PDF?
IronPDF puede detectar una gama de diferencias, incluidos cambios de texto, modificaciones de imágenes y alteraciones estructurales como cambios en el diseño o formato.
¿Puede integrarse IronPDF en aplicaciones existentes de C#?
Sí, IronPDF puede integrarse fácilmente en aplicaciones existentes de C#, permitiendo a los desarrolladores agregar funcionalidad de comparación de PDF sin cambios significativos en su código.
¿Es compatible IronPDF con otras aplicaciones .NET?
IronPDF está diseñado para ser compatible con todas las aplicaciones .NET, proporcionando una experiencia fluida para los desarrolladores que trabajan dentro del marco .NET.
¿Admite IronPDF la comparación por lotes de múltiples archivos PDF?
Sí, IronPDF admite el procesamiento por lotes, permitiendo a los desarrolladores comparar múltiples archivos PDF en una sola operación, lo cual es útil para manejar grandes volúmenes de documentos.
¿Cómo asegura IronPDF la precisión de las comparaciones de PDF?
IronPDF utiliza algoritmos avanzados para asegurar comparaciones precisas y confiables, analizando tanto elementos textuales como visuales para identificar cualquier discrepancia.
¿Cuál es el primer paso para comenzar a usar IronPDF para comparación de PDF en C#?
El primer paso es instalar la biblioteca IronPDF a través del Administrador de paquetes NuGet en tu entorno de desarrollo de C#, que proporciona todas las herramientas necesarias para comenzar a comparar PDF.


