dompdf错误无法传输已发送的pdf:标头

时间:2016-06-30 19:41:35

标签: php pdf dompdf

我的案子比其他人回答的要复杂一点。使用相同的代码,结果会有所不同。

工作中心 - 第一步

转到http://renamchristofoletti.com/en/works/covers/

单击缩略图,然后添加TILL 4图像。

点击下载,然后点击下载产品组合。

PDF按预期生成。 =)

ERROR CENARIO - 第2步

执行与上面相同的操作,但现在,在缩略图中添加6个以上的图像。

PDF获取“无法传输pdf:标头已发送错误”

与你选择的图像无关,同样的事情发生。

DOMPDF代码

ob_clean();
echo '<html><body>...'; // above html and css goes here

$images2 = str_replace(' ', "", $_COOKIE['rc_folio']);
$images = explode(',', $images2);
$images = array_filter($images);

foreach ( $images as $image ) {
    $img_id = get_image_id($image);

    $imglocal = wp_get_attachment_metadata( $img_id );

        $img_abs_path = ABSPATH . 'wp-content/uploads/' . $imglocal['file'];
        list($width, $height) = getimagesize($img_abs_path);
        if ($width > $height) {
            // Landscape
            echo '<div style="page-break-after: always; text-align: center;"><div class="content-line"></div><div class="content-line-2"></div><img src="' . $img_abs_path . '" style="width: 80%; max-width: 80%; height: auto; margin-top: 250px;" /></div>'; 
        } else {
            // Portrait or Square
            echo '<div style="page-break-after: always; text-align: center;"><div class="content-line"></div><div class="content-line-2"></div><img src="' . $img_abs_path . '" style="width: auto; height: 60%; max-height: 60%; margin-top: 180px;" /></div>';
        }
}
echo '</body></html>';

$html = ob_get_contents();
ob_get_clean();

$pdf_path = ABSPATH . 'wp-content/themes/moqueca/dompdf-master/dompdf_config.inc.php';
require_once( $pdf_path );

$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper('letter', 'portrait');
$dompdf->render();
$dompdf->stream("renam_christofoletti_customfolio.pdf");
exit();

请有人澄清我的想法吗?我已经尝试了很多其他解决方案,但没有什么可以解决的。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您似乎在输出缓冲区大小的限制内运行。您可以通过检查output_buffering配置参数的值来检查是否存在大小限制:

public bool PCInUse(string Hostname)
{
    ConnectionOptions connection = new ConnectionOptions();
    connection.Username = "username;
    connection.Password = "password";

    ManagementScope scope = new ManagementScope("\\\\" + Hostname + "\\root\\CIMV2", connection);
    try
    {
        scope.Connect();
        var Query = new SelectQuery("SELECT LogonId FROM Win32_LogonSession Where (LogonType= 10) or (LogonType= 2)");
        var Searcher = new ManagementObjectSearcher(scope, Query);

        if (Searcher.Get().Count > 0)
            return true;
        else
            return false;
     }
     catch
     {
         return false;
     }
}

如果是这种情况,您可以修改缓冲区大小:

echo ini_get('output_buffering');

或按照Dharam对您的问题的评论中的说明,直接将内容推送到变量中,而不是依赖于输出缓冲:

ini_set('output_buffering', true); // no limit
ini_set('output_buffering', 12288); // 12KB limit

答案 1 :(得分:0)

案件解决了。我只是改变了html的回声。=一切都很完美。

感谢。