【问题标题】:php include generated png in pdf via fpdfphp通过fpdf在pdf中包含生成的png
【发布时间】:2012-08-16 13:10:00
【问题描述】:

我正在尝试使用也由 php 生成的图像生成 PDF。 听起来很简单,我确定我只是搞砸了标题,但我似乎无法在这里找到解决方案。

首先我生成一个 PDF:

define('FPDF_FONTPATH','fonts/');
require('scpt/fpdf.php');

class PDF extends FPDF {}
$pdf = new FPDF('P','in',array(8.5,11));
$pdf->SetAutoPageBreak(false,0);

$pdf->SetTextColor(0,0,0);
$pdf->SetDrawColor(0,0,0);
$pdf->SetFont('Helvetica','',12);

$pdf->Image('label.php?imgid=17',0,0,0,0,'PNG');

$pdf->Output('label.pdf','D');

然后我在 label.php 中生成 PNG:

if(isset($_GET["imgid"])) {
 header("Content-Type: image/png");
 $im = @imagecreate(110, 20)
     or die("Cannot Initialize new GD image stream");
 $background_color = imagecolorallocate($im, 0, 0, 0);
 $text_color = imagecolorallocate($im, 233, 14, 91);
 imagestring($im, 1, 5, 5,  "A Simple Text String", $text_color);
 imagepng($im);
 imagedestroy($im);
}

这将输出:FPDF error: Not a PNG file:....

在浏览器中调用 label.php?imgid=17 会显示图像就好了...

我错过了什么?

编辑

在文档中: 示例

// Insert a logo in the top-left corner at 300 dpi
$pdf->Image('logo.png',10,10,-300);
// Insert a dynamic image from a URL
$pdf->Image('http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World',60,30,90,0,'PNG');

所以应该可以在不先保存的情况下包含动态生成的图像?!

编辑#2

我使它与库 mem_image 一起工作,但问题仍然是这不应该引发错误 IMO?!所以我让这个问题保持开放,看看我的脚本是否确实有问题,结果证明这是一个错误。

【问题讨论】:

  • 这是我直接从 php.net 站点获取 png 代码的代码的一个非常分解的版本......所以我猜这不是问题所在......

标签: php fpdf


【解决方案1】:
【解决方案2】:

您几乎拥有它,您只缺少几件事。首先,您需要在 URL 中为您的 Image() 调用提供完整的服务器地址,而不是

$pdf->Image('label.php?imgid=17',0,0,0,0,'PNG');

你需要:

$pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');

这将消除您遇到的 FPDF 错误。然后为了让 FPDF 正确呈现您的输出,您需要添加对 AddPage() 的调用,因此您的 PDF 生成脚本将变为:

require('scpt/fpdf.php');

$pdf = new FPDF('P','in',array(8.5,11));
$pdf->AddPage();
$pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');

$pdf->Output('label.pdf','D');

当然,如果您只包含单个图像,则不需要 SetTextColor()、SetFont() 等。您也不需要自定义类定义(我删除了不需要的行)。

不要忘记将www.yourserver.com 替换为脚本的适当域和路径。

【讨论】:

    【解决方案3】:

    Image 函数的参数必须是文件,而不是 URL 或其他脚本。由于您已经有了标签脚本,最简单的解决方法是将图像下载到临时位置,然后使用该临时文件调用 $pdf->Image()。

    【讨论】:

    • 好吧,我试图解决这个问题,因为我必须为这种情况编写一个 GC...
    • 如 FPDF 文档中所述,Image 函数接受作为图像源的 URL,以及本地文件的路径。在此处查看文档:fpdf.org/en/doc/image.htm
    【解决方案4】:

    您的文件名出现此问题,请确保您传递的文件名有效

    function _parsepngstream($f, $file)
    {
    // Check signature
    if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10))
        $this->Error('Not a PNG file: '.$file);
    
    ...
    }
    

    【讨论】:

    • 不确定您的意思,但这是一个简化的示例,Image() 已找到该文件(否则它会给我一个 stream failed 异常。
    • 我不知道我们是否应该像示例一样传递一些 GET 参数。 // 从 URL 插入动态图片 $pdf->Image('chart.googleapis.com/…);
    • 再次不完全确定您的意思,但您提出了一个非常重要的观点:手册谈到动态图像:// Insert a dynamic image from a URL $pdf->Image('http://chart.googleapis.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World',60,30,90,0,'PNG'); 所以应该是可能的吧?
    • 对不起,Dominik,我也不确定,但只是试着给你一个小费。
    • 我发现了有趣的链接:prestashop.com/forums/topic/…
    【解决方案5】:

    你只需要做改变

    require('fpdf.php');
    

    然后做

    $pdf->Image('http://www.yourserver.com/label.php?imgid=17',0,0,0,0,'PNG');
    

    并运行您的代码...

    【讨论】:

      【解决方案6】:

      首先,尝试使用此代码检查您的网址

      $handle = fopen("http://www.yourserver.com/label.php?imgid=17", "rb");

      print_r(fread($handle, 8192));

      您可以查看您的网址中包含的内容

      **) 确保您的 url 没有重定向到登录页面

      【讨论】:

        【解决方案7】:

        更简单,只需将 .png 放在动态链及其全部的末尾

        示例:

        $pdf->Image('http://www.yourserver.com/label.php?   imgid=17.png',0,0,0,0,'PNG');
        

        $pdf->Image('../label.php?imgid=17.png',0,0,0,0,'PNG');
        

        在 url 中无法识别 mime 类型为什么不显示 png,如果这是一个愚蠢的错误但已被证明,google 也会通过添加带有 url 和 PNG 的扩展名来做同样的事情

        【讨论】:

        • 所以您是说 URL 字符串需要以 .png 结尾才能以某种方式让 fpdf 知道尊重其标题?对我来说听起来很狡猾,但我会在有时间的时候尝试一下并报告。
        猜你喜欢
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-18
        • 2013-05-12
        • 1970-01-01
        相关资源
        最近更新 更多