在浏览器上显示PDF

14

我想在浏览器上显示存储在我们服务器上的PDF文件。以下是我的代码:

$path = $_SERVER['DOCUMENT_ROOT'].folder_name.'/resources/uploads/pdf/pdf_label_'.$order['id'].'.pdf';

$filename = 'pdf_label_'.$order['id'].'.pdf';

$file = $path;
$filename = $filename;

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

但是在浏览器上返回以下输出:

%PDF-1.4 % 5 0 obj >stream

需要展示的PDF文件:

图片描述

我正在使用CodeIgniter来完成这个操作。

我做错了什么?请在此帮助我。提前感谢您的帮助。

编辑:

我正在做以下操作:

foreach($orders as $order){

$path = $_SERVER['DOCUMENT_ROOT'].folder_name.'/resources/uploads/pdf/pdf_label_'.$order['id'].'.pdf';

$filename = 'pdf_label_'.$order['id'].'.pdf';

$file = $path;
$filename = $filename;

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

  }

那么我该如何在浏览器上显示多个文件?

编辑2 :-

根据下面的答案,我必须使用phpmerger来合并多个PDF文件并在浏览器中显示。 我浏览了这个网站http://pdfmerger.codeplex.com/但无法在codeignter中使用。 有人能帮我在我的codeingter中使用phpmerger吗?


这只是一个小的侧面问题,但您可以使用fPDF动态生成这些PDF。如果从数据库中提取所有必需的字段并生成PDF,则可以节省存储它们的所有资源。它非常轻量级且实用。 - Impulss
8个回答

22
$filePath="file path here";
$filename="file name here";
header('Content-type:application/pdf');
header('Content-disposition: inline; filename="'.$filename.'"');
header('content-Transfer-Encoding:binary');
header('Accept-Ranges:bytes');
@ readfile($filePath);

请尝试这段代码,我希望它能像我一样正常工作。


filename="'.$filename.'"'); 可以简写为 filename="'.$filename); (抱歉,这么多引号让我感到混乱) - James
4
@James这会导致一个未关闭的双引号字符串。请用不同的方式解决你头脑混乱的问题,比如花括号,如果你不喜欢点符号的话。 - mickmackusa
@arshad,请在您的代码回答中添加一些解释,如果您能够的话。 - mickmackusa

9
您可以使用 PDF Merger 库来实现您的目标。 这里是原始库的链接(已过时)。 建议使用 myokyawhtun 的分支,该分支得到维护。 以下是示例代码:
include 'PDFMerger.php';
$pdf = new PDFMerger;
$pdf->addPDF('path_to_pdf/one.pdf', '1, 3, 4')  //include file1 - pages 1,3,4
    ->addPDF('path_to_pdf/two.pdf', '1-2')      //include file2 -  pages 1 to 2
    ->addPDF('path_to_pdf/three.pdf', 'all')    //include file3 - all pages
    ->merge('browser', 'test.pdf');  // OUTPUT : make sure you choose browser mode here.

支持的模式 - 浏览器文件下载字符串


编辑:我看到你已经标记了CI,你可以将PDFMerger.php放在applications/libraries中,并在autoload.phpcontroller中加载它。

然后可以像这样使用它:$this->pdfmerger->addPDF()merge()函数。


是的,我正在使用CI,所以正如你所说,我必须在“applications/libraries”中包含pdfmerger.php,但还有另一个文件夹fpdf和fpdi,我应该将它上传到相同的位置吗? 我该如何在我的控制器中加载合并器? 你能帮我解决如何在CI中使用phpmerger的问题吗? - Rakesh Shetty
PDFMerger.php复制到application/libraries中。在autoload.php中包含$autoload['libraries'] = array('pdfmerger',........,然后您就可以像我在答案中提到的那样在CI中使用它 :) @RakeshShetty - Karan Thakkar
我尝试加载它,但现在它抛出错误 - require_once(fpdf / fpdi.php):无法打开流:没有这样的文件或目录。 - Rakesh Shetty
你没有复制 fpdffpdi 文件夹吗?复制后,如果你使用的是 PHP 5+,你会得到 Assigning the return value of new by reference is deprecated 的警告。你需要从这些行中删除 &,因为在 PHP 5+ 中已经被弃用了。@RakeshShetty - Karan Thakkar
我已经复制到了system/libraries位置。 - Rakesh Shetty
应该是 application/libraries,请复制 PHP 文件和两个文件夹。 - Karan Thakkar

3

在readfile之后使用exit:

$filepath = 'your-path/demo.pdf';
header('Content-Type: application/pdf');
header(sprintf("Content-disposition: inline;filename=%s", basename($filepath)));

@readfile($filepath);
exit;

注意:@符号在readfile函数前用于抑制错误,可能在开发模式下删除它。


1

不要使用

@readfile($file);

使用

echo file_get_contents($file);

或者省略@


谢谢,我尝试了一下file_get_contents($file);exit;它显示了PDF文件,但实际上有多个PDF文件,我正在使用foreach来显示PDF文件。因此,当我从file_get_contents($file)中删除exit;时,它会显示%PDF-1.4 % 5 0 obj >stream。 - Rakesh Shetty
你不能同时进行多个下载(除非通过JavaScript通过AJAX或类似方式多次调用代码)。 - RichardBernards
我想我在之前的评论中告诉过你如何实现它。 - RichardBernards
我可以这样做吗:include_once($path);? - Rakesh Shetty
@RakeshShetty 不,你必须多次调用脚本... 通过应用程序前端的 AJAX:请查看 https://dev59.com/TnE95IYBdhLWcg3wXsyR#2339452 - RichardBernards
首选方案是创建一个脚本来压缩这些文件 - 我是否应该为我的 PDF 文件创建一个 zip 文件夹,然后按照你的代码显示结果? - Rakesh Shetty

1

1
这种方法适用于想在浏览器页面中显示PDF的情况。
$file = 'filename.pdf';
echo "<embed src='$file' type='application/pdf' width='80%' height='600px' />";

0

朋友们只需使用锚点标签即可。现在的所有新浏览器都支持查看任何文件。


0

这个在Chrome上对我有效。

$path = $filename;
              header("Content-Length: " . filesize ( $path ) ); 
             // header("Content-type: application/pdf"); 
              header("Content-disposition: inline; filename=".basename($path));
              header('Expires: 0');
              header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
              ob_clean();
              flush();
              //readfile($path);






          echo "<embed src='$path' type='application/pdf' width='80%' height='320px' />";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接