我正在尝试计算我用pdfmake(在客户端(生成的pdf文件的校验和。我使用的代码是。。
/// docDefinition.......
const pdfDocGenerator = pdfMake.createPdf(docDefinition);
pdfDocGenerator.getBlob((blob) => {
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function () {
var file_result = this.result;
var file_wordArr = CryptoJS.lib.WordArray.create(file_result);
var sha256_hash = CryptoJS.SHA256(file_wordArr);
var Hash = sha256_hash.toString(); //output result
};
});
但当我下载pdf并在其他一些网站上查看我的sha256时,它永远不会匹配。每次我生成pdf时,散列都会发生变化,尽管pdf的文档定义是相同的。我尝试了getBuffer
函数,结果是一样的。
我的解决方案快用完了。谢谢你的帮助。
每次生成pdf时,哈希都会发生变化,即使pdf的文档定义是相同的。
pdf生成器通常会将元数据(如创建时间或上次操作时间oc定义相等,但生成的pdf通常略有不同,从而产生不同的哈希值。
因此,你所观察到的实际上是意料之中的、正常的。
所以,我想我已经找到了一些东西,这要归功于mkl答案。诀窍是几乎同时生成哈希并提示下载文件。
但首先,如果您使用的是pdfMake,则需要从_proto.download函数中获取blob。
_proto.download = function download(filename) {
var _this2 = this;
if (filename === void 0) {
filename = 'file.pdf';
}
return new Promise(function (resolve, reject) {
_this2.getBlob().then(function (blob) {
Object(FileSaver_min["saveAs"])(blob, filename);
resolve();
}, function (result) {
reject(result);
});
});
}
我做了一个修改版本来获得斑点。
_proto.downloadModified= function download(filename) {
var _this2 = this;
if (filename === void 0) {
filename = 'file.pdf';
}
return new Promise(function (resolve, reject) {
_this2.getBlob().then(function (blob) {
resolve(blob);
}, function (result) {
reject(result);
});
});
}
然后我设置了name
和lastModifiedDate
。
blob.lastModifiedDate = new Date();
blob.name = "contrat-cession-da"
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
reader.onload = function () {
var file_result = this.result; // this == reader, get the loaded file "result"
var file_wordArr = CryptoJS.lib.WordArray.create(file_result); //convert blob to WordArray , see https://code.google.com/p/crypto-js/issues/detail?id=67
var sha256_hash = CryptoJS.SHA256(file_wordArr); //calculate SHA1 hash
var Hash = sha256_hash.toString(); //output result
saveAs(blob);
现在,您可以生成blob的哈希(在使用cryptojs将其读取为Array之后(,并使用saveAs提示下载,它将为您提供相同的哈希。