我正在使用iTextSharp从PDF文件中读取文本。但是,有时我无法提取文本,因为PDF文件只包含图像。我每天都下载相同的PDF文件,我想看看PDF是否被修改过。如果无法获得文本和修改日期,MD5校验和是判断文件是否已更改的最可靠方法吗?
如果是的话,一些代码示例将受到赞赏,因为我在密码学方面没有太多经验。
我正在使用iTextSharp从PDF文件中读取文本。但是,有时我无法提取文本,因为PDF文件只包含图像。我每天都下载相同的PDF文件,我想看看PDF是否被修改过。如果无法获得文本和修改日期,MD5校验和是判断文件是否已更改的最可靠方法吗?
如果是的话,一些代码示例将受到赞赏,因为我在密码学方面没有太多经验。
当前回答
用于动态生成的pdf。 创建日期和修改日期总是不同的。
你必须删除它们或将它们设置为一个常数值。
然后生成md5哈希来比较哈希。
您可以使用PDFStamper删除或更新日期。
其他回答
使用System.Security.Cryptography.MD5非常简单:
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
(我相信实际上所使用的MD5实现不需要被丢弃,但我可能仍然会这样做。)
之后如何比较结果取决于你自己;例如,您可以将字节数组转换为base64,或者直接比较字节。(请注意,数组不会重写等号。使用base64更简单,但如果你真的只对比较哈希感兴趣,那么效率会稍微低一些。)
如果你需要将散列表示为字符串,你可以使用BitConverter将其转换为十六进制:
static string CalculateMD5(string filename)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
我知道这个问题已经有答案了,但我用的是:
using (FileStream fStream = File.OpenRead(filename)) {
return GetHash<MD5>(fStream)
}
GetHash:
public static String GetHash<T>(Stream stream) where T : HashAlgorithm {
StringBuilder sb = new StringBuilder();
MethodInfo create = typeof(T).GetMethod("Create", new Type[] {});
using (T crypt = (T) create.Invoke(null, null)) {
byte[] hashBytes = crypt.ComputeHash(stream);
foreach (byte bt in hashBytes) {
sb.Append(bt.ToString("x2"));
}
}
return sb.ToString();
}
可能不是最好的方法,但可以很方便。
用于动态生成的pdf。 创建日期和修改日期总是不同的。
你必须删除它们或将它们设置为一个常数值。
然后生成md5哈希来比较哈希。
您可以使用PDFStamper删除或更新日期。
这是我找到的一个稍微简单的版本。它一次读取整个文件,只需要一个using指令。
byte[] ComputeHash(string filePath)
{
using (var md5 = MD5.Create())
{
return md5.ComputeHash(File.ReadAllBytes(filePath));
}
}
除了上面回答的方法,如果你比较pdf,你需要修改创建日期和修改日期,否则哈希将不匹配。
对于用QuestPdf生成的pdf,你需要覆盖文档元数据中的CreationDate和ModifiedDate。
public class PdfDocument : IDocument
{
...
DocumentMetadata GetMetadata()
{
return new()
{
CreationDate = DateTime.MinValue,
ModifiedDate = DateTime.MinValue,
};
}
...
}
https://www.questpdf.com/concepts/document-metadata.html