Hiển thị tệp PDF trong trình duyệt của người dùng qua PHP / Perl


121

Tôi muốn hiển thị tệp PDF cho người dùng của mình. Lý do tại sao tôi sử dụng cgi để hiển thị pdf là tôi muốn theo dõi số lần nhấp chuột cho pdf và che giấu vị trí thực của pdf đã lưu.

Tôi đã tìm kiếm trên Internet và chỉ tìm thấy cách hiển thị hộp thoại lưu cho người dùng và tạo pdf, không hiển thị tệp cho người dùng.

Điều tôi muốn là hiển thị cho người dùng các tệp pdf của tôi chứ không phải tạo hoặc tải xuống pdf. Đây là những gì tôi nhận được từ tài liệu php chính thức:

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

Cũng như mã perl google-search-result của tôi:

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

nếu bạn làm điều đó trên ruby, xin vui lòng nói điều đó với tôi. Nhưng tôi không chắc liệu máy chủ của mình có hỗ trợ đường ray hay không.

Xin lỗi nếu mã của tôi ở quá xa so với phương pháp hiển thị pdf, vì tôi không biết gì về xử lý pdf và cách thực hiện vấn đề này.

Giả sử rằng người dùng có trình cắm Adobe Reader. Vì vậy, làm thế nào để khắc phục sự cố của tôi?

chỉnh sửa : Tôi muốn hiển thị tệp pdf thuần túy. Mục đích chính của tôi: theo dõi các tệp pdf của tôi và sử dụng một số url ưa thích.

chỉnh sửa : Đây là mã php chính của tôi:

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

chỉnh sửa : Bây giờ mã đang hoạt động. Nhưng thanh tiến trình tải (trên plugin Adobe Reader X) không hiển thị. Tại sao? Bất cứ ai có thể giúp tôi? Đây là mã chính của tôi:

<?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);
?>

chỉnh sửa : Tất cả các vấn đề của tôi đã được giải quyết. Đây là mã cuối cùng:

<?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);
?>

Cảm ơn! :)


4
"hiển thị" chỉ có thể thực hiện được nếu máy khách đã cài đặt plugin Acrobat Reader. Nếu không, nó sẽ luôn được phân phối dưới dạng tệp tải xuống, bạn không thể làm gì về điều đó. Việc che khuất đường dẫn của tệp PDF cũng là điều không thể, việc tìm ra nó là một việc rất nhỏ. Đang cố gắng làm gì? Có thể có một số lựa chọn thay thế nếu chúng ta biết thêm về mục tiêu của mình
Pekka

4
plugin Adobe Reader chỉ được yêu cầu nếu bạn đang sử dụng một trình duyệt không xử lý PDF nguyên bản. Ngoài ra, nếu PDF được gửi đến trình duyệt qua PHP / Perl, rất có thể bị che khuất đường dẫn PDF thực, hoặc thậm chí có nó bên ngoài docroot nên không thể truy cập trực tiếp.
Stephen

1
Adobe Reader chỉ cần thiết nếu người dùng đang sử dụng một trình duyệt mà không xử lý PDF natively ...
GolezTrol

@Stephen tất nhiên là có thể che khuất đường dẫn thực, nhưng điều mà OP dường như muốn là che khuất URL để ngăn chặn hành vi trộm cắp.
Pekka

Giả sử rằng người dùng có trình cắm Adobe Reader. Vì vậy, làm thế nào để khắc phục sự cố của tôi?
dimassony

Câu trả lời:


49

Tôi cho rằng bạn muốn tệp PDF hiển thị trong trình duyệt hơn là buộc tải xuống. Nếu đúng như vậy, hãy thử đặt Content-Dispositiontiêu đề với giá trị là inline.

Cũng nên nhớ rằng điều này cũng sẽ bị ảnh hưởng bởi cài đặt trình duyệt - một số trình duyệt có thể được định cấu hình để luôn tải xuống tệp PDF hoặc mở chúng trong một ứng dụng khác (ví dụ: Adobe Reader)


Đúng. Nhưng khi tôi thử đề xuất của bạn, tôi gặp lỗi "Tệp không bắt đầu bằng '% PDF-'". Tôi sử dụng 'Nội dung-Bố trí: nội dòng; filename = "the.pdf". Tôi có làm sai không?
dimassony

4
<? php header ('Content-type: application / pdf'); header ('Nội dung-Bố trí: inline; filename = "the.pdf"); readfile ('/ dir / to / the.pdf'); ?>
dimassony

nghe có vẻ như nó không phải là một tệp PDF hợp lệ?
Stephen

@Stephen Khi tôi mở ngay tới tệp, nó sẽ hoạt động. Nhưng khi tôi sử dụng loại bỏ nội dung nội tuyến, nó không hoạt động.
dimassony

7
thật vui khi được nghe và thật tuyệt khi biết giải pháp! Sẽ rất tốt nếu bạn có thể đăng mã cuối cùng hiển thị tiêu đề nào bạn đang gửi cho bất kỳ ai khác gặp câu hỏi này.
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);

Đã kiểm tra và hoạt động tốt. Nếu bạn muốn tệp tải xuống thay thế, hãy thay thế

    Content-Disposition: inline

với

    Content-Disposition: attachment

Tại sao bạn tắt tính năng nén? ini_set ('zlib.output_compression', '0');
Enigma Plus

Bởi vì nén zlib không hoạt động với ob_gzhandler () và đây là một đoạn mã chứ không phải là một tập lệnh đầy đủ. Ngnix xử lý nén tốt hơn php. Bạn có thể sử dụng zlib nếu nó phù hợp với ứng dụng và thiết lập máy chủ của bạn.
Kareem

4

Bạn có thể sửa đổi trình kết xuất PDF như xpdf hoặc evince để hiển thị thành hình ảnh đồ họa trên máy chủ của bạn, sau đó cung cấp hình ảnh cho người dùng. Đây là cách thức hoạt động của chế độ xem nhanh tệp PDF của Google , họ hiển thị nó cục bộ, sau đó cung cấp hình ảnh cho người dùng. Không có tệp PDF nào được tải xuống và nguồn bị che khuất khá nhiều. :)


Đây là cách thực sự an toàn duy nhất để ngăn chặn việc đánh cắp tài liệu gốc.
Pekka

1
Tôi không bận tâm về việc ăn cắp tài liệu gốc. Nếu không, tôi muốn người dùng có thể lưu nó. Ngoài ra, tôi muốn chặn một số tiêu đề khách hàng. Và có thể tôi sẽ thực hiện đề xuất của bạn khi người dùng không có Adobe Reader.
dimassony

Bên cạnh đó, nó sẽ không phải là trộm cắp, bởi vì bản gốc vẫn còn đó.
Svante

@Svante - Tôi nghi ngờ rằng chủ sở hữu tài sản trí tuệ sẽ đồng ý với logic của bạn.
ashleedawg

@ashleedawg: Tôi nghi ngờ biệt danh "sở hữu trí tuệ". Đây chỉ là hack từ để làm cho việc tích trữ thông tin dường như không chỉ là một mô hình kinh doanh hợp pháp, mà thậm chí còn đáng để công chúng bảo vệ chống lại sự đổi mới.
Svante

1

Cách an toàn nhất để hiển thị PDF thay vì tải xuống dường như là nhúng nó bằng cách sử dụng một objecthoặc iframephần tử. Ngoài ra còn có các giải pháp của bên thứ 3 như trình xem PDF của Google.

Xem Cách tốt nhất để Nhúng PDF trong HTML để biết tổng quan.

Ngoài ra còn có DoPDF , một trình xem PDF trong trình duyệt dựa trên Java. Tôi không thể nói về chất lượng của nó nhưng nó trông rất thú vị.


0

Bạn cũng có thể sử dụng lớp fpdf có tại: http://www.fpdf.org . Nó cung cấp các tùy chọn để xuất ra tệp và hiển thị trên trình duyệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.