2017-04-23 5 views
0

pdf_viewer.js를 사용하여 화면에 문서를 표시하기 위해 PDF.js 라이브러리를 사용하여 PDf 파일을 표시하지만 표시중인 PDF 파일은 기밀입니다 사이트 내에서 보여줄 수 있어야하지만 위임 된 공용 사용자가 theie URL을 입력하고 브라우저에서 바로 볼 수있게함으로써 동일한 파일을 볼 수 없도록 차단할 수 있어야합니다.pdf.js 및 보호 된 파일을 볼 수없는 경우

내 htaccess 파일의 모든 줄에서 Deny를 추가하려고했지만 뷰어가 문서를 보여주지 못하게 막판을 차단 했으므로 이동하지 않는 것처럼 보입니다. 분명히 누구나 간단히 조사관을보고 시청자가 읽는 pdf 파일을 볼 수 있으므로 직접 URL이 어떤 방식 으로든 안전하지는 않습니다.

바이너리 데이터를 읽을 수있는 PDF.js에 대해 읽었지만, 필자 자신의 파일 시스템에서 PDF를 읽고 라이브러리에서 사용할 수 있도록 준비하는 방법에 대한 지식이 없습니다. 파일 내용을 가져 와서 즉시 처리하기 위해로드가 조금 느립니다.

누구나 소스 PDF URL을 공개하지 않고 PDFJS가 작동하거나 다른 방법으로 로컬 파일 호출을 사용하여 파일을 읽을 수있는 솔루션이 있습니까?

+0

모든 코드를 제공하기 위해 ... UINT 배열로 문자열을 변환 한 후 PDFJS 라이브러리에 그것을 전달하는 다음? –

+0

음, pdf.js 코드에서 : * @param {string | TypedAray | object} source PDF가 * 인 URL, 데이터로 이미 채워진 형식화 된 배열 (Uint8Array) 또는 * 및 매개 변수 object 가능한 필드는 다음과 같습니다. * - url - PDF의 URL입니다. * - data - PDF 데이터가있는 형식화 된 배열입니다. * - httpHeaders - 기본 인증 헤더. * - password - 암호로 보호 된 PDF의 암호를 해독합니다. 분명히 URL을 전달하면 해당 URL이 외부 세계에 노출되지만 PDF 파일을 지정된 형식화 된 배열로 변환하는 방법이 확실하지 않습니다. –

+0

PDF 파일을 개인적으로 읽은 다음 PDFJS 라이브러리에서 사용할 수있는 파일로 변환 할 수 있다면 Inspector의 Network 탭에서 URL을 사용하여 열어서 읽을 수 있고 변환하여 다시 전달할 수 있습니다. 파일에 마스크 된 이름을 사용하여 표시 할 데이터. –

답변

0

좋아, 몇 가지 테스트 후,이 솔루션은 매우 간단합니다 :

실제 파일을 볼 수 있도록 무엇인지 알아낼 수는 Ajax라고 불리는 기능을 사용하여 PDF 데이터를 가져옵니다. 해당 PHP 파일에서 ... fopen 및 fread를 사용하여 파일을 메모리로 읽습니다. base64_encode를 사용하여 base64로 변환 해당 문자열을 호출 자바 스크립트로 다시 전달합니다. 원래의 호출 함수에서

, 사용

## 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 및 브라우저 측면에서 거대한 메모리 돼지입니다. 사용되는 모든 바이트 당 2.5 바이트가 추가되었습니다 (base64ToUint8Array 함수는 base64, 2.5 * n에 대해 2 * n을 할당합니다. uint8Array 바이트에 대해 한 번에 n 개 - 총 5.5 * n (fetch() 또는 XHR + arraybuffer를 사용하여 얻을 수있는 것의 수) – async5

+0

: 보호 : ajax에서/이후에 중단 점을 설정하고'window.open 'data :; base64,'+ base64Data)'는 다운로드 폴더에 데이터를 저장하겠습니까? – async5