2017-04-23 47 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