【问题标题】:dompdf creates defective pdf on wordpressdompdf 在 wordpress 上创建有缺陷的 pdf
【发布时间】:2017-01-06 10:09:48
【问题描述】:

我想用 dompdf 在我的 wordpress 主页上创建一个 pdf。用xampp本地我的电脑没有问题,一切正常。 在 wordpress 上,我使用插件“PHP Code For Posts”。我复制到插件文件夹的dompdf文件夹。 pdf 已创建,但有缺陷。

<?php

if(isset($_POST['button']))
{
    require_once("dompdf/dompdf_config.inc.php");
    spl_autoload_register('DOMPDF_autoload');

    function pdf_create($filename, $paper, $orientation, $stream=TRUE)  
    {
        $dompdf = new DOMPDF();
        $dompdf->set_paper($paper, $orientation);
        $dompdf->load_html('TEST');
        $dompdf->render();
        $dompdf->stream($filename.".pdf");
    }

    $filename = 'file_name';
    $dompdf = new DOMPDF();
    pdf_create($filename, 'A4', 'portait');  
}

?>

<form method="post" >
    <p>Test: <input type="text" name="price" /></p>
    <p><input type="submit" name="button" value="PDF" /></p> 
</form>

我希望有人可以帮助我。我不知道为什么它在本地工作,而在 wordpress 上它会创建一个有缺陷的文件。

更新:

这是我用记事本打开有缺陷的文件时的代码。

<!DOCTYPE html>

<html lang="de-DE">

<head>


<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="profile" href="http://gmpg.org/xfn/11">

<link rel="pingback" href="http://test-homepage.de/xmlrpc.php">


<!--[if lt IE 9]>
<script src="http://test-homepage.de/wp-content/themes/zerif-pro/js/html5.js"></script>
<link rel="stylesheet" href="http://test-homepage.de/wp-content/themes/zerif-pro/css/ie.css" type="text/css">
<![endif]-->

<title>Test &#8211; test-homepage</title>
<link rel="alternate" type="application/rss+xml" title="test-homepage &raquo; Feed" href="http://test-homepage.de/feed/" />
        <script type="text/javascript">
            window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/72x72\/","ext":".png","source":{"concatemoji":"http:\/\/test-homepage.de\/wp-includes\/js\/wp-emoji-release.min.js?ver=4.5.3"}};

【问题讨论】:

  • 下载 PDF 文件并在记事本或类似程序中打开。检查文档的标题,在大多数情况下,您会发现打乱 PDF 标题的 PHP 错误或警告消息。还要检查文件大小,如果它是 0KB,则错误阻止 DOMPDF lib 在将文档流式传输到客户端之前将文档保存在临时文件夹中。
  • 起初文件没有 0 KB。而且用记事本我也找不到任何错误。我在上面的问题中添加了记事本中的代码。
  • “在 wordpress 上我正在使用插件“PHP Code For Posts””——这可能是问题的一部分……很可能该插件旨在插入简短的 sn- ps 的 PHP 代码(分别是它们的输出)到渲染的帖子内容中——但它不会阻止“围绕”它的整个模板将被渲染,因此最终你仍然会得到一个完整的 HTML 文档,并且不是有效的 PDF。由于您似乎没有在代码中使用任何 WP 功能(?),因此将其作为独立脚本调用可能会更容易。
  • 正如 Cbroe 所提到的,插件通常只会向 Wordpress 添加功能,并且在大多数情况下,它将作为 Wordpress 布局的一部分加载,因此将包含模板中的 HTML。根据您的 php.ini 设置,可能会有 hack 可用;我将添加一个示例作为答案来说明这是如何工作的。
  • 我使用这个插件是因为短代码。我想创建一个 woocommerce 目录,而不是“添加到购物车”按钮,我想要一个用于创建 pdf 的按钮。我从 csv 文件导入此目录的产品。我的 csv 导入插件有一个修复保存的模板,我可以在其中添加 php 短代码。所以我可以确定我在所有产品页面上总是有 pdf 创建按钮。也许会有更优雅的方式,但我没有学过php,所以这对我来说都是新的和困难的。

标签: php wordpress dompdf


【解决方案1】:

如果您想坚持使用当前使用的 Wordpress 插件并启用输出缓冲,这可能是一个解决方案(webserver 和 php.ini 都可以控制输出缓冲;有关更多详细信息,请参阅 PHP.net 页面上的output buffering section .

<?php
if(isset($_POST['button']))
{
    // make sure that output buffering has been enabled
    if (ob_start()) {
        // clear previous contents from the server output cache
        ob_clean();
        try {
            require_once("dompdf/dompdf_config.inc.php");
            spl_autoload_register('DOMPDF_autoload');

            $filename = 'file_name';
            $paper= 'A4';
            $orientation= 'portrait';

            $dompdf = new DOMPDF();
            $dompdf->set_paper($paper, $orientation);
            $dompdf->load_html('TEST');
            $dompdf->render();
            $dompdf->stream($filename.".pdf");

            // make sure the content of the buffer is sent to the client.
            ob_flush();
            // terminate the script to make sure no additional content is sent.
            exit(0);
        } catch (Exception $ex) {
            error_log(sprintf("PDF generation failed with %s in line %d", $ex->getMessage(), $ex->getLine()));
        }
    } else {
        // log a message in default error log
        error_log("Output buffering could not be enabled (PDF routine)");
    }
}

?>

调试您的设置

正如您所说,您对 PHP 还很陌生,请创建一个包含内容的文件:

<?php
phpinfo();

将文件上传到您的服务器并使用浏览器打开文件,向下滚动直到找到“配置”>“PHP 核心”。在下面的列表中,搜索条目“output_buffering”。如果它设置为“0”,则输出缓冲已通过 php.ini 禁用。如果它已被禁用,则页面的所有输出都将直接发送到客户端,并且没有编程方式可以在不更改服务器设置的情况下完成您所实现的目标。

可能有多种方法可以启用缓冲,即您的提供商可能允许通过网络配置软件更改某些设置,或者您可以将.htaccess 文件添加到您的网络目录以启用它,如here 所述。


另一个更新

正如您已经发现的那样,输出缓冲已正确启用,因此即使之前已提供输出,我们也应该能够修改输出缓冲区以创建 PDF。我复制了你的代码,在一些输出已经发送到浏览器后运行了 PHP 部分,与你的网页上发生的情况相同,静态 HTML 内容也包含在我的 PDF 文档中。主要问题是 Wordpress 内部不使用输出缓冲,而是直接将输出发送到浏览器。

这是我解决问题的方法 -> 在 index.php 中尽快启动输出缓冲:

<?php ob_start(); ?>

启用缓冲后,我可以控制缓冲区并根据需要生成 PDF 文件。


进一步诊断

我只是想确保我们没有遗漏任何东西,您能否将其添加到您的 PDF 生成代码中:

if(isset($_POST['button']))
{
  $sent = headers_sent($file, $line);
  die("The output started in {$file} and at line {$line}");
}

【讨论】:

  • 谢谢。但我得到与以前相同的结果。 pdf也有缺陷,记事本中的代码实际上与我上面发布的相同。
  • 我不知道您的服务器上是否启用了错误日志记录,以及您是否有权访问您的日志文件目录,但我假设您在非自托管时无法直接访问它。将上述error_log 条目与die 语句交换,并查看是否达到其中一个语句。它可能是路径(即 DOMPDF 不可用)或权限问题之前提到的。
  • 我认为路径是正确的,因为如果我用错误的路径更改它,我的主页上会出现错误,并且不会创建 pdf。我用 die 函数更改了 error_log 函数,但我没有得到任何语句,我应该如何达到这个语句?
  • 我更新了上面的答案并添加了一些您需要执行的调试步骤。让我们知道您的发现!
  • 再次感谢。我无法更改 php.ini,但我现在将 php_value output_buffering On 添加到 .htcaccess 文件中。 output_buffering 的本地值现在打开,但 output_buffering 的主值仍然没有值。我不知道如何更改主值。使用此设置创建的 pdf 文件仍然存在缺陷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多