在客户端解密PDF文件并使用pdf.js查看

时间:2015-01-30 18:49:53

标签: encryption pdf.js cryptojs

我正在开发一个项目,所有pdf文件都在Web服务器上加密。

使用XMLHttpRequest,我获得加密的pdf文件的内容。然后使用JavaScript工具解密文件。毕竟将文件内容作为decrypted_file分配给javascript变量。所有这些都是在客户端完成的。

这是我想做的事情;

pdf.js呈现和查看位于Web服务器或同一目录库中的pdf文件。

我如何处理pdf.js以获取来自javascript变量而非url的内容为“http // yourdomain.com / first-test.pdf或文件为”first-test.pdf“?

欢迎任何答案,谢谢。

1 个答案:

答案 0 :(得分:6)

假设您使用的是PDF.js的viewer.html,从数据中打开PDF文件就像使用正确的参数调用PDFViewerApplication.open一样简单。

示例:类型化数组(Uint8Array / ArrayBuffer / ..)

// in viewer.html
var data = new Uint8Array( /* ... data ... */ );
PDFViewerApplication.open(data);

示例:Blob / File对象

// in viewer.html
var data = new Blob([ '%PDF....'] , {type: 'application/pdf'});
var url = URL.createObjectURL(data);
PDFViewerApplication.open(url);

示例:数据URL(如果浏览器支持)

var url = 'data:application/pdf;base64,....';
PDFViewerApplication.open(url);

示例:数据URL(任何浏览器)

这包括两个步骤:解码base64数据URL,然后将二进制字符串转换为Uint8Array

var url = 'data:application/pdf;base64,....';
var data = url.split(';base64,')[1];
// Decode base64
var binaryString = atob(data);
// Convert binary string to Uint8Array
data = new Uint8Array(binaryString.length);
for (var i = 0, ii = binaryString.length; i < ii; ++i) {
    data[i] = binaryString.charCodeAt(i);
}
PDFViewerApplication.open(data);

示例:在框架中使用PDF.js

<iframe src="viewer.html" id="pdfjsframe"></iframe>
<script>
var pdfjsframe = document.getElementById('pdfjsframe');
// At the very least, wait until the frame is ready, e.g via onload.
pdfjsframe.onload = function() {
    var data = ... data here or elsewhere ... ;
    pdfjsframe.contentWindow.PDFViewerApplication.open(data);
};
</script>
相关问题