PHP / Perl을 통해 사용자 브라우저에 PDF 파일 표시


121

사용자에게 PDF 파일을 표시하고 싶습니다. 내가 cgi를 사용하여 pdf를 표시하는 이유는 pdf에 대한 클릭을 추적하고 저장된 pdf의 실제 위치를 숨기고 싶기 때문입니다.

나는 인터넷에서 검색을 해왔고 사용자에게 파일을 표시하지 않고 사용자에게 저장 대화 상자를 표시하고 pdf를 만드는 방법 만 찾았습니다.

내가 원했던 것은 사용자에게 pdf를 만들거나 다운로드하지 않고 내 pdf 파일을 보여주는 것 입니다. 공식 PHP 문서에서 얻은 내용은 다음과 같습니다.

<?php
header('Content-type: application/pdf');
readfile('the.pdf');
?>

또한 내 Google 검색 결과 펄 코드 :

open(PDF, "the.pdf") or die "could not open PDF [$!]";
binmode PDF;
my $output = do { local $/; <PDF> };
close (PDF);

print "Content-Type: application/pdf\n";
print "Content-Length: " .length($output) . "\n\n";
print $output

루비로하면 제게 말씀 해주세요. 하지만 내 서버가 레일을 지원하는지 확실하지 않습니다.

pdf 처리와이 문제를 구현하는 방법에 대해 아무것도 모르기 때문에 내 코드가 pdf를 표시하는 방법에서 너무 멀다면 죄송합니다.

사용자에게 Adobe Reader 플러그인이 있다고 가정합니다. 그렇다면 내 문제를 해결하는 방법은 무엇입니까?

편집 : 일반 pdf 파일을 보여주고 싶습니다. 내 주요 목적은 내 pdf 파일을 추적하고 멋진 URL을 사용하는 것입니다.

편집 : 다음은 내 주요 PHP 코드입니다.

<?php
$file='/files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
@readfile($file);
?>

편집 : 이제 코드가 작동합니다. 그러나로드 진행률 표시 줄 (Adobe Reader X 플러그인에서)이 표시되지 않습니다. 왜? 누구든지 나를 도울 수 있습니까? 내 주요 코드는 다음과 같습니다.

<?php
$file='./files/the.pdf';
header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
@readfile($file);
?>

편집 : 내 모든 문제가 해결되었습니다. 최종 코드는 다음과 같습니다.

<?php
$file = './path/to/the.pdf';
$filename = 'Custom file name for the.pdf'; /* Note: Always use .pdf at the end. */

header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="' . $filename . '"');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . filesize($file));
header('Accept-Ranges: bytes');

@readfile($file);
?>

감사! :)


4
"show"는 클라이언트에 Acrobat Reader 플러그인이 설치된 경우에만 가능합니다. 그렇지 않으면 항상 다운로드 파일로 제공되며 이에 대해 할 수있는 작업이 없습니다. PDF의 경로를 가리는 것도 불가능하며 알아내는 것은 사소한 일입니다. 무엇을하려고합니까? 귀하의 목표에 대해 더 많이 알고 있다면 대안이있을 수 있습니다
Pekka 2011 년

4
Adobe Reader 플러그인은 PDF를 기본적으로 처리하지 않는 브라우저를 사용하는 경우에만 필요합니다. PDF 파일은 PHP / Perl을 통해 브라우저로 전송되는 경우에도,이다 매우 실제 PDF 경로를 모호하게, 심지어는 직접 액세스 할 수없는, 그래서 docroot에 외부를 가질 수 있습니다.
Stephen

1
경우 Adobe Reader가에만 필요합니다 사용자가 기본적으로 PDF 파일을 처리하지 않는 브라우저를 사용하고 있습니다 ...
GolezTrol

@Stephen 물론 실제 경로를 가리는 것이 가능하지만 OP가 원하는 것은 도난을 방지하기 위해 URL을 가리는 것입니다.
Pekka

사용자에게 Adobe Reader 플러그인이 있다고 가정 해 보겠습니다. 그렇다면 내 문제를 해결하는 방법은 무엇입니까?
dimassony

답변:


49

다운로드를 강요하지 않고 브라우저에 PDF를 표시하기를 원한다고 가정합니다. 이 경우 Content-Disposition값으로 헤더를 설정해보십시오 inline.

또한 이것은 브라우저 설정의 영향을받습니다. 일부 브라우저는 항상 PDF 파일을 다운로드하거나 다른 응용 프로그램 (예 : Adobe Reader)에서 열도록 구성 될 수 있습니다.


예. 그러나 제안을 시도 할 때 "파일이 '% PDF-'로 시작되지 않습니다."라는 오류 메시지가 표시됩니다. 나는 'Content-Disposition : inline; filename = "the.pdf" '. 내가 실수 했나요?
dimassony

4
<? php header ( 'Content-type : application / pdf'); header ( 'Content-Disposition : inline; filename = "the.pdf"'); readfile ( '/ 디렉터리 /to/the.pdf'); ?>
dimassony

유효한 PDF 파일이 아닌 것 같습니까?
스티븐

@Stephen 파일을 바로 열면 작동합니다. 그러나 인라인 콘텐츠 표시를 사용하면 작동하지 않습니다.
dimassony

7
듣기 좋으며 해결책을 알게되어 기쁩니다! 이 질문을 접하는 다른 사람을 위해 보내는 헤더를 보여주는 최종 코드를 게시 할 수 있다면 좋을 것입니다.
Stephen

18
    $url ="https://yourFile.pdf";
    $content = file_get_contents($url);

    header('Content-Type: application/pdf');
    header('Content-Length: ' . strlen($content));
    header('Content-Disposition: inline; filename="YourFileName.pdf"');
    header('Cache-Control: private, max-age=0, must-revalidate');
    header('Pragma: public');
    ini_set('zlib.output_compression','0');

    die($content);

테스트를 거쳐 잘 작동합니다. 대신 파일을 다운로드하려면

    Content-Disposition: inline

    Content-Disposition: attachment

압축을 끄는 이유는 무엇입니까? ini_set ( 'zlib.output_compression', '0');
Enigma Plus

zlib 압축은 ob_gzhandler ()에서 작동하지 않으며 전체 스크립트가 아닌 코드 조각이기 때문입니다. Ngnix는 php보다 압축을 더 잘 처리합니다. 앱 및 서버 설정에 적합한 경우 zlib를 사용할 수 있습니다.
Kareem

4

xpdf 또는 evince와 같은 PDF 렌더러를 수정하여 서버의 그래픽 이미지로 렌더링 한 다음 이미지를 사용자에게 전달할 수 있습니다. 이것이 Google의 PDF 파일 빠른보기 가 작동하는 방식이며 로컬에서 렌더링 한 다음 사용자에게 이미지를 제공합니다. 다운로드 된 PDF 파일이 없으며 소스가 잘 보이지 않습니다. :)


이것은 원본 문서의 도난을 방지 할 수있는 유일한 안전한 방법입니다.
Pekka

1
원본 문서 도난은 신경 쓰지 않습니다. 그렇지 않으면 사용자가 저장할 수 있기를 원했습니다. 또한 일부 클라이언트 헤더를 차단하고 싶었습니다. 그리고 사용자에게 Adobe Reader가 없을 때 제안을 구현할 것입니다.
dimassony 2011 년

게다가 원본이 아직 남아 있기 때문에 도난이 아닙니다.
Svante 2011 년

@Svante- 지적 재산 소유자 가 귀하의 논리에 동의 할 것 같지 않습니다 .
ashleedawg 19

@ashleedawg : "지적 재산"이라는 별명이 의심 스럽습니다. 이것은 정보 저장이 합법적 인 비즈니스 모델 일뿐만 아니라 대중이 혁신을 방어 할 가치가있는 것처럼 보이게하는 단어 해킹입니다.
Svante

1

PDF를 다운로드하는 대신 표시하는 가장 안전한 방법은 object또는 iframe요소를 사용하여 포함하는 것 같습니다 . Google의 PDF 뷰어와 같은 타사 솔루션도 있습니다.

개요 는 HTMLPDF 를 포함하는 가장 좋은 방법을 참조하십시오 .

또한 Java 기반 브라우저 내 PDF 뷰어 인 DoPDF 도 있습니다 . 품질에 대해서는 말할 수 없지만 흥미로워 보입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.