使用TCPDF库在PDF中嵌入图表

时间:2015-06-10 07:04:55

标签: php tcpdf

我正在开发一个要生成PDF文件的项目。 我使用Google Chart API生成不同的图表。我正在使用TCPDF库将它们转换为PDF,但我无法将这些生成的图形嵌入到PDF中。我认为TCPDF不接受脚本标记中写的内容。我怎样才能克服这个问题?

1 个答案:

答案 0 :(得分:0)

除了使用FPDF之外,我遇到了同样的问题。 在一天结束时,PDF文件包含静态内容,因此遗憾的是Javascript是不可能的。我最终做了什么:

我像往常一样准备HTML + Javascript图表并将其写入临时目录中的HTML文件。然后我使用PhantomJS(http://phantomjs.org/)创建页面的屏幕截图,然后将其包含在我的PDF中(或任何地方,真的)。

最棒的是:它适用于任何本地HTML页面。如果您只有一个URL,请使用file_get_contents()或cURL检索其内容并首先将其写入本地HTML文件。

胆量:

启动,下载phantomjs.exe并将其解压缩到应用程序可以访问的目录。我的示例使用的是我在应用程序根目录中复制到lib / phantomjs的1.9.8版。

我有一个函数接受HTML文件路径作为参数和一组PhantomJS选项。我建议将它添加到辅助类中。

function getHTMLImage($page, $options = array(), $js = null) {
    // Prepare the PhantomJS directory that contains phantomjs.exe, e.g. lib or vendor
    $phantomDir = $_SERVER['DOCUMENT_ROOT'] . '/lib/phantomjs/';
    // Add the PhantomJS directory to the PATH
    $origPath = str_replace('"', '', getenv('PATH'));
    if (!in_array($phantomDir, explode('/', $origPath)))
          putenv('PATH=' . $origPath . '/' . $phantomDir);

    // PhantomJS requires a Javascript file to process the request. In case no Javascript processing file is given, use the default
    if (is_null($js)) $js = $phantomDir . 'phantom.js';

    // Prepare the PhantomJS call
    $exec = 'phantomjs --ignore-ssl-errors=yes ' . $js . ' ' . escapeshellarg($page);
    // Prepare the PhantomJS options, e.g. width and height
    foreach ($options as $option) {
        $exec .= ' ' . escapeshellarg($option);
    }

    // Call PhantomJS. To catch errors, call exec($exec . ' 2>&1', $output, $errorMsg);
    exec($exec, $output);

    // Decode and return the image data
    return ($output ? base64_decode(reset($output)) : false);
}

Javascript文件(我的名为phantom.js,与phantomjs.exe放在同一目录中):

args = require('system').args;
page = require('webpage').create();

// In this case, I expect these indexes to be the width and height of the chart
if (typeof args[2] !== undefined) {
    page.viewportSize = {
        width: args[2],
        height: (typeof args[3] === undefined ? args[2] : args[3])
    };
}

page.open(args[1], function() {
    var base64 = page.renderBase64('png');
    console.log(base64);
    phantom.exit();
});

这样称呼:

// Make sure $width and $height are set, or exclude them altogether
$output = getHTMLImage($htmlPath, array($width, $height));
// Example output, you want to save the image and include it in your PDF file
header('Content-Type: image/png');
exit($output);