【问题标题】:Decrypt PDF file on client side and view with pdf.js在客户端解密 PDF 文件并使用 pdf.js 查看
【发布时间】:2015-01-30 18:49:53
【问题描述】:

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

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

这是我想做的;

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

如何处理 pdf.js 以从 javascript 变量中获取内容,而不是 url 作为“http//yourdomain.com/first-test.pdf”或文件作为“first-test.pdf”?

欢迎任何答案,谢谢。

【问题讨论】:

    标签: encryption pdf.js cryptojs


    【解决方案1】:

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

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

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

    示例:Blob / 文件对象

    // 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>
    

    【讨论】:

    • @ScottChu 文本编码 API 将字符串转换为类型化数组,默认使用 utf-8 作为编码。但是,PDF 不是以 UTF-8 编码的,所以我更新了答案以删除 TextEncoder 的使用(现在转换是在每个字节上单独完成的)。
    猜你喜欢
    • 2011-05-27
    • 2019-11-06
    • 2019-08-09
    • 2014-11-07
    • 2020-01-14
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多