如何在不使用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(支持内容流对比)
- 安装NuGet包:
Install-Package PdfSharpCore - 实现代码:
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(仅对比文本内容)
如果只需要对比可见文本,可使用此方案:
- 安装NuGet包:
Install-Package iTextSharp.LGPLv2.Core - 实现代码:
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
相关产品推荐
相关产品推荐

