Показать PDF-файлы в браузере пользователя через PHP / Perl

111

Я хочу показать своим пользователям файлы PDF. Причина, по которой я использую cgi для показа pdf, - это то, что я хочу отслеживать клики для pdf и скрывать реальное местоположение сохраненного pdf.

Я искал в Интернете и только нашел, как показать диалог сохранения пользователям и создать pdf файл, а не показывать файлы пользователям.

То, что я хотел, - это показать пользователям мои pdf файлы, не создавать или загружать pdf. Вот что я получил из официальной документации php:

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

Также мой Perl-код google-search-result:

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

edit: все мои проблемы решены. Здесь последний код:

<?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
    «Показать» возможно только в том случае, если на клиенте установлен плагин Acrobat Reader. В противном случае он всегда будет использоваться в качестве загружаемого файла, с этим ничего нельзя поделать. Затмение пути PDF также невозможно, это тривиально выяснить. Что пытаетесь сделать? Может быть, есть какие-то альтернативы, если мы узнаем больше о ваших целях
  • 4
    плагин Adobe Reader требуется только в том случае, если вы используете браузер, который не поддерживает PDF-файлы. Кроме того, если PDF-файл отправляется в браузер через PHP / Perl, очень возможно скрыть реальный путь к PDF-файлу или даже оставить его вне документа, чтобы он не был напрямую доступен.
Показать ещё 11 комментариев
Теги:
pdf

5 ответов

49

Я предполагаю, что вы хотите, чтобы PDF отображался в браузере, а не заставлял загружать. Если это так, попробуйте установить заголовок Content-Disposition со значением inline.

Также помните, что на это также влияют настройки браузера - некоторые браузеры могут быть настроены на всегда загружать PDF файлы или открывать их в другом приложении (например, Adobe Reader)

  • 0
    Да. Но когда я пробую ваше предложение, я получаю сообщение об ошибке «Файл не начинается с«% PDF- »». Я использую 'Content-Disposition: inline; имя файла = "the.pdf". Я сделал ошибку?
  • 0
    @dimassony возможно покажи полный код
Показать ещё 22 комментария
9
    $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
4

Вы можете изменить рендеринг PDF, такой как xpdf, или продемонстрировать рендеринг в графическом изображении на вашем сервере, а затем доставить изображение пользователю. Так работает Google быстрый просмотр файлов PDF, они отображают его локально, а затем доставляют изображения пользователю. Нет загруженного PDF файла, и источник довольно хорошо скрыт.:)

  • 0
    Это единственный действительно безопасный способ предотвратить кражу оригинального документа.
  • 1
    Я не возражаю против кражи оригинального документа. В противном случае я хотел, чтобы пользователи могли его сохранить. Кроме того, я хотел заблокировать некоторые заголовки клиента. И, возможно, я буду реализовывать ваше предложение, когда у пользователя нет Adobe Reader.
Показать ещё 1 комментарий
1

Самый безопасный способ отображения PDF файла вместо загрузки, кажется, встраивает его с помощью элемента object или iframe. Существуют также сторонние решения, такие как Google PDF viewer.

См. Лучший способ вставить PDF в HTML для обзора.

Там также DoPDF, Java-браузер In-browser PDF. Я не могу говорить о его качестве, но он выглядит интересным.

0

Вы также можете использовать класс fpdf, доступный по адресу: http://www.fpdf.org. Он предоставляет опции для вывода в файл и отображения в браузере.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню