2017-04-23 48 views
0

我使用PDF.js库到我的网站中显示PDF文件(使用pdf_viewer.js显示屏幕上的文件),但我显示PDF文件是机密我需要能够在网站中显示它们,但是阻止未经授权的公众人员只需键入URL并在浏览器中看到它们即可查看相同的文件。pdf.js和受保护的文件,否则不可见的

我尝试添加在我的htaccess文件中的所有行拒绝,但courfse那也显示了文档挡住了观众,因此这似乎是一个不走。很显然,任何人都可以简单地看着检查员,看到正在被阅读器阅读的pdf文件,所以看起来直接的URL在任何方面都不会安全。

我读过关于能够读取二进制数据的PDF.js,但我不知道如何在自己的文件系统中读取PDF并将其准备好供库使用,如果这意味着它在加载文件内容并在飞行中进行准备时都会稍微慢一点。

任何人都有一个解决方案,让PDFJS而不会泄漏源PDF URL工作,或以其他方式读取使用本地文件调用该文件?

+0

任何代码来提供? –

+0

那么,从pdf.js代码:* @param {string | TypedAray | object} source可以是一个URL,其中PDF为 *位于已经填充数据的类型化数组(Uint8Array)或 *和参数对象具有以下可能的字段: * - url - PDF的URL。 * - data - 带有PDF数据的键入数组。 * - httpHeaders - 基本身份验证标头。 * - 密码 - 用于解密受密码保护的PDF。 显然传递一个URL将暴露URL到外面的世界,但我不清楚如何一个PDF文件转换成指定的类型数组。 –

+0

很明显,如果我可以私密地阅读PDF文件,然后将其转换为PDFJS库可用的内容,那么我可以避开使用检查器的Network选项卡中显示的所有URL,打开并阅读并转换并传回要使用文件的掩码名称显示数据。 –

回答

0

好了,经过一番测试,解决方法很简单:

使用一个Ajax调用的函数,可以计算出实际的文件被查看的内容获取PDF数据。 在该PHP文件中... 将文件读入内存,正常使用fopen和fread。 使用base64_encode转换为base64 将该字符串传递回调用的Javascript。

在原来的调用函数,使用下面的字符串转换为UINT数组,然后传递到PDFJS库...

## The function that turns the base64 string into whatever a Uint8 array is... 
function base64ToUint8Array(base64) { 
    var raw = atob(base64); 
    var uint8Array = new Uint8Array(raw.length); 
    for (var i = 0; i < raw.length; i++) { 
    uint8Array[i] = raw.charCodeAt(i); 
    } 
    return uint8Array; 
} 

## the guts that gets the file data, calls the above function to convert it, and then calls PDF.JS to display it 
$.ajax({ 
type: "GET", 
data: {file: <a file id or whatever distinguishes this PDF>}, 
url: 'getFilePDFdata.php', (the PHP file that reads the data and returns it encoded) 
success: function(base64Data){ 
     var pdfData = base64ToUint8Array(base64Data); 
     ## Loading document. 
     PDFJS.getDocument(pdfData).then(function (pdfDocument) { 
     ## Document loaded, specifying document for the viewer and 
     ## the (optional) linkService. 
     pdfViewer.setDocument(pdfDocument); 
     pdfLinkService.setDocument(pdfDocument, null);   
    }); 
    } 
}); 
+0

Base64是PHP和浏览器端巨大的记忆猪,每次使用的每个字节增加250个字节(你可以看到,base64ToUint8Array功能将拨出2.5 * N的的base64,2 * N的列N为uint8Array字节在同一时间 - 总5.5 * N的你会只用取()或XHR + arraybuffer) – async5

+0

再得到什么:保护,在设置断点/阿贾克斯后输入'的window.open( 'data:; base64,'+ base64Data)'在控制台中将数据保存在下载文件夹中,不是? – async5