在我的应用程序中,用户可以上传其他用户以后可以查看的PDF。对于我的用户酶,我需要确保PDF不会锁定或加密,并且任何其他用户都可以查看。
为此,我要求用户上传解锁的PDF,并在我尝试上传到S3之前,想在PDF上锁定错误。
。我尚未就浏览器内的最佳方法达成共识?如果无法的话,我会尝试阅读缓冲区并丢失错误吗?或者是否有另一种绩效和有效的方法来检测?
您可以尝试使用以下解决方案:
const reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function () {
var files = new Blob([reader.result], {type: 'application/pdf'});
files.text().then(x=> {
console.log("isEncrypted", x.includes("Encrypt")) // true, if Encrypted
console.log("isEncrypted", x.substring(x.lastIndexOf("<<"), x.lastIndexOf(">>")).includes("/Encrypt"));
console.log(file.name);
});
更好的是用户体验,带宽和性能,可以检测客户端的状态。您可以在页面上有一个文件输入元素,然后捕获Onchange事件。
<input type="file" id="pdfFile" size="50" onChange='processFile' />
在Onchange处理功能的内部,您可以在文件字节上获取并加载到缓冲区中。有关代码和更多详细信息,请参阅各种浏览器中JavaScript中客户端的读取文件内容。
您需要进行一些PDF解析以学习锁定/加密状态,但我想有一些JS库可以做到这一点。即使您的PDF可以解析非常大,它总是比将PDF上传到服务器更快,因为上传时间将是文件大小的函数。
我可以看到上传文件而不是客户端解析的情况:
- 您是针对低端移动设备,并期望PDF为 100MB。
- 您将在具有JavaScript限制的浏览器上运行
- 您始终也想将文件上传到服务器,即使PDF受到保护,您已经确定了用户体验更好
您可以做的就是使用PDFJ打开PDF文件并尝试获取页数。当文件受到密码保护时,您将获得passwordException。
看这个小提琴:https://jsfiddle.net/fe6jlgr5/15/
document.getElementById("pdfFile").addEventListener("change",
function(event) {
let file = event.target.files[0];
let reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function(e) {
var docInitParams = {
data: e.target.result,
password: ''
};
pdfjsLib.getDocument(docInitParams).promise.then((pdfDocument) =>
{
// get all the pages from pdf, works if not password protected.
const numPages = pdfDocument.numPages;
console.log('Doc not password protected');
}).catch(err => console.log(err))
}
},false);