在linux服务器上使用wkhtmltopdf创建PDF

时间:2016-01-15 17:55:04

标签: pdf linux

我创建了一个在WAMP服务器上运行的Wordpress站点以及由GoDaddy托管的Linux服务器。

我使用wkhtmltopdf生成PDF文档。

在WAMP服务器上,一切都按预期工作,但在Godaddy + Linux服务器上没有创建PDF,我只是得到一个空文档。

我检查了日志,但没有列出任何内容。

我在linux环境的代码中做错了什么,或者由于主机而在服务器上出错了什么?

<?php

require_once("../../../../wp-blog-header.php");

if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['url']) && !empty($_GET['url'])) {
    $post_id = url_to_postid($_GET['url']);
    $post = $post_id ? get_post($post_id) : null;

    if($post){
        $post_url = get_permalink($post_id);
        $html = file_get_contents($post_url);

        $descriptorspec = array(
            0 => array('pipe', 'r'), // stdin
            1 => array('pipe', 'w'), // stdout
            2 => array('pipe', 'a'), // stderr  <http://us3.php.net/manual/en/function.proc-open.php#97012>
        );
        $exe_path = (PHP_OS == 'WINNT') ? '"C:/wamp/bin/wkhtmltopdf/wkhtmltopdf.exe"' : ($_SERVER["DOCUMENT_ROOT"] . "/cgi-bin/whkhtmltopdf");

        //$process = proc_open("$exe_path -q - -", $descriptorspec, $pipes);
        $process = proc_open("$exe_path -q --print-media-type - -", $descriptorspec, $pipes);

        // Send the HTML on stdin
        fwrite($pipes[0], $html);
        fclose($pipes[0]);

        //stream_set_timeout($pipes[1], 1);
        //stream_set_timeout($pipes[2], 1);

        // Read the outputs
        $pdf = stream_get_contents($pipes[1]);
        $errors = stream_get_contents($pipes[2]);

        // Close the process
        fclose($pipes[1]);
        $return_value = proc_close($process);

        if($errors) {
            header("HTTP/1.1 500 Internal Server Error");
            header('Content-Type: text/plain');
            echo "An error occurred during PDF generation:\r\n\r\n$errors";
        } else {
            $file_name = "$post->post_title.pdf";

            header('Content-Type: application/pdf');
            header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
            header('Pragma: public');
            header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s').' GMT');
            header('Content-Length: ' . strlen($pdf));
            header('Content-Disposition: inline; filename="' . $file_name . '";');
            echo $pdf;
        }
    } else {
        header("HTTP/1.1 500 Internal Server Error");
        header('Content-Type: text/plain');
        echo "An error occurred during PDF generation:\r\n\r\nUnrecognized post.";
    }
}

1 个答案:

答案 0 :(得分:0)

原来这个问题对我来说是双重的。我能够确定我使用的是错误的可执行版本(32位对64位)。命令行中有一个段错误代码,在修复之后会引发另一个问题,即服务器上缺少多个库。