【问题标题】:How to embed dynamic PDFs?如何嵌入动态 PDF?
【发布时间】:2023-10-30 21:09:01
【问题描述】:

我有一个网站,它使用 FPDF(来自 fpdf.org)基于传递给 PHP 脚本的 HTML 表单动态生成 PDF。截至目前,一切正常,直到信息通过并且 FPDF 生成 PDF。但是,我一直在研究嵌入选项,但不能让它正常工作。我的页面的其他区域嵌入了 PDF,但它们是我生成并保存到服务器的区域。我的问题是,是否可以动态生成 PDF 并将其直接输出到 HTML 页面的嵌入区域内的浏览器 ($pdf->Output();)?现在它只是生成并占据整个窗口,但我想在 PDF 中包含其他信息,例如说明和其他信息。我试图通过以下方式将 pdf 作为字符串输出到变量中:

$output = $pdf->Output('','S');

这确实将信息作为字符串输出到 $output 变量中;但是,我不确定我是否能够嵌入它。我尝试指定 MIME 类型(如application/pdf),但唯一可用的属性是src,所以我不确定是否可以在任何地方使用该字符串。过去,我使用了 2 种不同的技术来嵌入 PDF。标签和一个带有谷歌文档查看器的标签,但是在玩了一段时间之后,我无法让它工作=(有人有什么想法吗?

【问题讨论】:

    标签: php html pdf-generation embed fpdf


    【解决方案1】:

    嵌入的 PDF 是基于浏览器功能的。 您可以使用框架并在页面的上部或左侧显示说明,在其余部分显示 pdf。

    正如您所说,您可以使用 Google 文档,但它会将整个文档转换为用于嵌入的图像。

    【讨论】:

    • 是的,我只是将保存到服务器的 PDF 嵌入没有问题(例如,如果它们是用 FPDF 生成并保存的),但是当我不保存 PDF 时问题就来了.它通常只会在浏览器中打开,但我想嵌入它...而不是占据整个屏幕?
    • 和我说的一样,在一帧中你可以生成pdf,只需传递正确的标题header("Content-type:application/pdf");
    • 对不起,正如我在我的问题中所说的那样......我已经这样做了,但它没有用,但我认为它与 FPDF 有特殊关系。我使用了框架并嵌入了标签和标题/类型,并在 5 种不同的浏览器中查看了它。它不起作用。如果您坚持认为它确实有效……您有代码示例吗?也许我做错了什么。
    【解决方案2】:

    如果您使用与我相同的 FPDF,那么您已经拥有了所需的一切!

    只需将您的“I”更改为“D”即可强制下载,而不是内联。

    来自:

    function Output($name='', $dest='')
    {
        //Output PDF to some destination
        if($this->state<3)
            $this->Close();
        $dest=strtoupper($dest);
        if($dest=='')
        {
            if($name=='')
            {
                $name='doc.pdf';
                $dest='I';
            }
            else
                $dest='F';
        }
        switch($dest)
        {
            case 'I':
                //Send to standard output
                if(ob_get_length())
                    $this->Error('Some data has already been output. Can\'t send PDF file');
                if(php_sapi_name()!='cli')
                {
                    //We send to a browser
                    header('Content-Type: application/pdf');
                    if(headers_sent())
                        $this->Error('Some data has already been output. Can\'t send PDF file');
                    header('Content-Length: '.strlen($this->buffer));
                    header('Content-Disposition: inline; filename="'.$name.'"');
                    header('Cache-Control: private, max-age=0, must-revalidate');
                    header('Pragma: public');
                    ini_set('zlib.output_compression','0');
                }
                echo $this->buffer;
                break;
            case 'D':
                //Download file
                if(ob_get_length())
                    $this->Error('Some data has already been output. Can\'t send PDF file');
                header('Content-Type: application/x-download');
                if(headers_sent())
                    $this->Error('Some data has already been output. Can\'t send PDF file');
                header('Content-Length: '.strlen($this->buffer));
                header('Content-Disposition: attachment; filename="'.$name.'"');
                header('Cache-Control: private, max-age=0, must-revalidate');
                header('Pragma: public');
                ini_set('zlib.output_compression','0');
                echo $this->buffer;
                break;
            case 'F':
                //Save to local file
                $f=fopen($name,'wb');
                if(!$f)
                    $this->Error('Unable to create output file: '.$name);
                fwrite($f,$this->buffer,strlen($this->buffer));
                fclose($f);
                break;
            case 'S':
                //Return as a string
                return $this->buffer;
            default:
                $this->Error('Incorrect output destination: '.$dest);
        }
        return '';
    }
    

    【讨论】:

      【解决方案3】:

      当您将 fpdf 保存为字符串时,您可以使用 php 将其编码为 base64,然后将其传递给您用于将 pdf 嵌入到 html 文档中的任何内容。 PHP:

      $output = $pdf->Output('','S');
      $output = base64_encode($output);
      

      在您的 html 文档中:

      <embed src="data:application/pdf;base64,<?php echo $output ?>" type='application/pdf'>
      

      我知道这至少适用于 chrome。我没有在其他浏览器中测试过。您可能需要实现其他方式将 pdf 嵌入到 html 页面中,以实现跨浏览器支持。我假设您可以从这一点上弄清楚这一点。希望这对某人有所帮助。

      【讨论】: