【问题标题】:using header() to rewrite filename in URL for dynamic pdf使用 header() 为动态 pdf 重写 URL 中的文件名
【发布时间】:2011-01-02 05:25:31
【问题描述】:

我有一个生成 pdf 报告的 php 脚本。当我们去保存 pdf 文档时,Acrobat 建议的文件名是 report_pdf,因为 php 脚本名为 report_pdf.php。我想动态命名 pdf 文件,因此我不必在每次保存时都为报告键入适当的名称。

在新闻组中询问,有人建议这样做,其中filename="July Report.pdf" 是报告的预期名称

<?
header('Content-Type: application/pdf');
header('Content-disposition: filename="July Report.pdf"');

但它不起作用。我做错了吗,或者这会起作用吗?这是 mod_rewrite 的工作吗?


所以我都试过了
header('Content-disposition: inline; filename="July Report.pdf"');

header('Content-disposition: attachment; filename="July Report.pdf"');

(不是同时),也不适合我。这是我的虚拟主机的问题吗?对于这个url,这是我的代码:

<?
header('Content-disposition: inline; filename="July Report.pdf"');

// requires the R&OS pdf class
require_once('class.ezpdf.php');
require_once('class.pdf.php');

// make a new pdf object
$pdf = new Cpdf();
// select the font
$pdf->selectFont('./fonts/Helvetica');
$pdf->addText(30,400,30,'Hello World');
$pdf->stream();

?>

【问题讨论】:

  • 如果你想下载文件(而不是在浏览器中打开),添加这些:header('Content-Transfer-Encoding: binary'); header('Content-Type: application/force-download');否则,您仍应包含行 header('Content-Type: application/pdf') 以便浏览器知道如何打开文件。
  • 另外,您可能会丢失文件的内容长度 - 有些浏览器在没有这个的情况下可以正确打开文件,有些则不能。为此,将所有输出转储到输出缓冲区中,然后打印出标题并将其指定为 'Content-Length:'输出缓冲区的 strlen*
  • 暂时注释那些 php 标题行并查看输出。它不应包含任何 php 错误。如果是这样,请在修复任何错误后重新应用标题。

标签: php pdf mod-rewrite rename http-headers


【解决方案1】:

试试:

header('Content-Disposition: attachment; filename="July Report.pdf"');

header('Content-Disposition: inline; filename="July Report.pdf"');

另一种选择是使用$_SERVER['PATH_INFO'] 传递您的“July Report.pdf” - 示例链接可能是:

<a href="report_pdf.php/July%20Report.pdf?month=07">

该文件应默认保存为“July Report.pdf” - 其行为应与旧 php 脚本完全相同,只需更改生成 pdf 链接的代码即可。

【讨论】:

  • 那个href技巧奏效了!现在,当我去保存文件名时,文件名中的 %20 怎么样? ;)
【解决方案2】:

应该是:

header('Content-disposition: attachment;filename="July Report.pdf"'); 

【讨论】:

    【解决方案3】:

    基于https://github.com/rospdf/pdf-php/raw/master/readme.pdf(第19页) 流方法接受一个数组作为参数:

    stream([array options]) 用于输出,这将设置所需的标题并输出pdf代码。 options 数组可用于设置有关输出的许多内容:

    'Content-Disposition'=&gt;'filename' 设置文件名,...

    这段代码很适合我

    $ezOutput = $pdf->ezStream(array("Content-Disposition"=>"YourFileName.pdf"));
    

    就我而言,我使用ezStream(),但我认为stream() 应该给出相同的结果。

    【讨论】:

    • 实际上接受的对我不起作用。这个真的有效!!所以谢谢你!
    【解决方案4】:

    对于显示在浏览器标题选项卡上的名称

    我遇到了同样的问题,然后我发现我的 .pdf 中缺少元数据。 我使用工具(“debenu PDF 工具”)来编辑 pdf 属性,如作者、标题等... 我只是将标题从空字段更改为我想要的标题,上传新的 pdf,现在,使用相同的代码,相同的脚本浏览器显示正确的名称!

    当你要求保存文件时的名字

    是你在头文件名中指定的内容=

    【讨论】:

    • 在元数据中设置 PDF 标题也会修复在 Chrome 中查看 PDF 时显示在左上角的文件名。对于使用 FPDF 动态生成 PDF 的用户,请使用 $pdf-&gt;SetTitle('Your Title');。谢谢!
    【解决方案5】:

    您是否尝试使用连字符从文件名中删除空格?所以,我想它的名字一定是这样的;文件名=July-Report.pdf

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2015-07-13
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多