从 PHP 创建 PDF 文件

Posted

技术标签:

【中文标题】从 PHP 创建 PDF 文件【英文标题】:Create PDF file from PHP 【发布时间】:2017-11-03 19:37:56 【问题描述】:

我正在尝试使用 jsPDFphp 页面创建 PDF 文件,但它不起作用,我不知道出了什么问题。

有人可以帮我吗?

首先我有一个Iframe。我要转换的页面显示在iframe中:

iframe:

<?php
    <iframe id="frame" name="frame"   frameborder="0" src="./page.php?id=' . $_GET['id'] . '"></iframe>
    <button id="cmd">Button</button>
?>

当我点击Button 时,以下脚本应将页面转换为 PDF

脚本

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
<script type="text/javascript">
    var doc = new jsPDF();

    var specialElementHandlers = 
        '#editor': function(element, renderer)
            return true;
        
    ;

    $('#cmd').click(function () 
        doc.fromhtml($('frame').get(0), 15, 15, 
            'width': 170, 
            'elementHandlers': specialElementHandlers
        );

    doc.save('sample-file.pdf');
    );
</script>

但是当我点击Button。什么都没有发生。有人知道怎么回事吗?

【问题讨论】:

您没有任何 ID 为 cmd 的按钮,也没有名称为 cmd 的函数。 @Arg0n。它现在正在创建一个 PDF 页面。但是页面是空的 【参考方案1】:

你必须是获取iframe的html,所以使用contents()函数然后获取iframe的documentElement

<iframe id="frame" name="frame"   frameborder="0" src="http://localhost/"></iframe>
<button id="cmd">Button</button>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>
<script type="text/javascript">
    var doc = new jsPDF();

    var specialElementHandlers = 
        '#editor': function(element, renderer)
            return true;
        
    ;

    $('#cmd').click(function () 
        doc.fromHTML($('#frame').contents().find('html').html(), 15, 15, 
            'width': 170, 
            'elementHandlers': specialElementHandlers
        );

    doc.save('sample-file.pdf');
    );
</script>

注意:如果您的 iframe 源页面或其部分受 x-frame-options 标头保护,则您无法访问其中的 html。

【讨论】:

它什么也没做 当我写的时候它正在创建一个空的pdf文件:doc.fromHTML($('iframe')。 iframe 的 ID 和 NAMe 是frame。当我将 doc.fromHTML($('iframe') 更改为 doc.fromHTML($('frame') 时,它不再创建了 试试doc.fromHTML($('#iframe').contents()[0].documentElement 它仍然没有创建文件。也许这是答案所必需的。 iframe 的内容如下所示:jsfiddle.net/ss6780qn 我看到了你的编辑。它正在创建一个 pdf 文件,但 PDF 文件是空的【参考方案2】:
<button onclick="cmd()">Button</button>

把这个改成

<button id="cmd">Button</button>

您在 JS 中调用 id 上的点击事件。或者将onclick事件改成一个名为cmd的函数。

【讨论】:

还是什么都没有发生 什么也没发生,你能看到按钮吗?我看到您已将 HTML 放入 PHP 标记中。你应该把 GET 放在 PHP 中。如果您可以看到该按钮,则在 click 事件中添加一些日志记录并查看其是否触发。 我忘了删除()。现在它正在创建一个 PDF 页面。但是 PDF 是空的 不确定但可能将 $('frame') 更改为 $('#frame') 不,它还是空的【参考方案3】:

显然,jsPDF 有限制和/或错误。它有复杂表的问题(尤其是 colspans)。它会引发 javascript 错误,从而停止渲染器,这就是您得到空白 pdf 的原因。

https://github.com/MrRio/jsPDF/issues/516

https://github.com/MrRio/jsPDF/issues/595

这里已经发布了一个分支:https://github.com/jutunen/jsPDF-table_2,但我不确定它是否解决了 jsPDF 的其他限制。

【讨论】:

以上是关于从 PHP 创建 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP MySQL 创建 PDF 文件?

使用 PHP 获取 PDF 文件的高度和宽度

php - 使用 mpdf 工具从 googlemap 内容创建 pdf

从 base64 字符串 PHP 生成 PDF

创建更大的 pdf 时,mpdf 内存太低

如何创建受密码保护的 pdf 文件