通过PHP / Perl在用户浏览器中显示PDF文件


121

我想向我的用户展示PDF文件。我使用cgi显示pdf的原因是我想跟踪pdf的点击次数,并隐瞒已保存pdf的真实位置。

我一直在Internet上搜索,仅发现如何向用户显示保存对话框并创建pdf,而不向用户显示文件。

我想要的是用户显示我的pdf文件,而不是创建或下载 pdf。这是我从官方php文档中获得的信息:

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

还有我的google-search-result perl代码:

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文件并使用一些精美的网址。

编辑:这是我的主要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
仅当客户端安装了Acrobat Reader插件时,“显示”才可能。否则,它将始终作为下载文件,您对此无能为力。混淆PDF的路径也是不可能的,要找出它是微不足道的。试图做什么?如果我们对您的目标有更多了解,也许还有其他选择
Pekka

4
仅当您使用的浏览器本身无法处理PDF时,才需要Adobe Reader插件。同样,如果PDF是通过PHP / Perl发送到浏览器的,则可能会掩盖真正的PDF路径,甚至将其放在docroot之外,因此无法直接访问它。
斯蒂芬

1
如果ADOBE READER只需要用户使用不能处理的PDF原生浏览器...
GolezTrol

@Stephen当然可以遮盖真实路径,但是OP似乎想要遮盖URL以防止盗窃。
Pekka

假设用户具有Adobe Reader插件。那么,如何解决我的问题呢?
dimassony 2011年

Answers:


49

我假设您希望PDF在浏览器中显示,而不是强制下载。如果是这种情况,请尝试将Content-Disposition标头设置为inline

还要记住,这也会受到浏览器设置的影响-一些浏览器可能配置为始终下载PDF文件或在其他应用程序(例如Adobe Reader)中打开它们


是。但是,当我尝试您的建议时,出现错误消息“文件不是以'%PDF-'开头”。我使用'Content-Disposition:inline; filename =“ the.pdf”'。我做错了吗?
dimassony 2011年

4
<?php标头('Content-type:application / pdf'); header('Content-Disposition:inline; filename =“ the.pdf”'); readfile('/ dir / to / the.pdf'); ?>
dimassony 2011年

听起来像不是有效的PDF文件?
斯蒂芬,

@Stephen当我打开该文件时,它可以工作。但是当我使用内联内容分发时,它不起作用。
dimassony 2011年

7
很高兴听到,也很高兴知道解决方案!如果您能为遇到此问题的其他任何人张贴最终代码以显示要发送的标头,那将是很好的。
斯蒂芬

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');
谜加

因为zlib压缩不适用于ob_gzhandler(),所以这是一小段代码,而不是完整的脚本。Ngnix比php更好地处理压缩。如果适合您的应用程序和服务器设置,则可以使用zlib。
卡里姆

4

您可以修改PDF渲染器(例如xpdf或evince)以渲染到服务器上的图形图像中,然后将图像交付给用户。这就是Google 快速查看 PDF文件的方式,它们在本地呈现它,然后将图像传递给用户。没有下载的PDF文件,并且来源非常模糊。:)


这是防止原始文件被盗的唯一真正安全的方法。
Pekka

1
我不在乎原始文件被盗。否则,我希望它能够供用户保存。另外,我想阻止一些客户端头。当用户没有Adobe Reader时,也许我会实施您的建议。
夸张的

此外,因为原始文件仍在那儿,所以不会被盗。
Svante

@Svante-我怀疑知识产权所有人会同意您的逻辑。
ashleedawg

@ashleedawg:我怀疑这个绰号“知识产权”。这仅仅是黑客攻击,使信息ho积不仅看起来像是一种合法的商业模式,而且对于公众来说也值得抵制创新。
Svante

1

PDF显示而不是下载的最安全方法似乎是使用objector iframe元素将其嵌入。还有第三方解决方案,例如Google的PDF查看器。

有关概述,请参见将PDF嵌入HTML的最佳方法

还有DoPDF,一个基于Java的浏览器内PDF查看器。我不能说它的质量,但看起来很有趣。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.