TCPDF错误:无法获取图像的大小

时间:2014-11-21 12:01:10

标签: php image tcpdf

我正在使用TCPDF来创建动态生成的pdf文件。在我的pdf文件中,根据用户输入生成图像,我想在我的pdf文件中添加该图像。这是我的代码

 $map_image = "example.com/wp-content/themes/example/map_image_leasing.php/?city=Calgary&suit_type=&min_area=&max_area=";

$pdf->Image ($map_image, 55, 19, '', '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);

如果我在我的网址上粘贴“ example.com/wp-content/themes/example/map_image_leasing.php/?city=Calgary&suit_type=&min_area=&max_area = ”这个这就像我想要的那样创建图像,但如果把这个url,它就不起作用了。它表示无法获得图像的大小

但如果我把这样的东西放在

$map_image = '/wp-content/themes/v3/resources/images/public/logo_side.jpg';

它可以成功生成带有该图像的pdf。

我该如何解决?

我访问了以下stackoverflow链接,但没有任何帮助

tcpdf working on localhost but not on my sever giving error TCPDF ERROR: [Image] Unable to get image:

cakephp tcpdf image error [Image] Unable to get image

TCPDF ERROR: [Image] Unable to get image

8 个答案:

答案 0 :(得分:13)

这可能是由于filesize()通过stat()无法HTTP wrapper远程图像文件(因为包装器不支持它)。

根据TCPDF image() method documentation,您可以直接传递图像数据,前缀为@符号。因此,您可以获取原始图像数据,然后将其传递给TCPDF,如下所示:

$img = file_get_contents('http://example.com/wp-content/themes/example/map_image_leasing.php/?city=Calgary&suit_type=&min_area=&max_area=');

$pdf->Image('@' . $img, 55, 19, '', '', 'JPG', '', 'T', false, 300, '', false, false, 0, false, false, false);

请注意,我没有对此进行测试(并且TCPDF文档很稀疏),因此您可能需要进行一些实验才能使其正常工作。


<强> 编辑:

这是一个完全有效的例子(在我的电脑上)。使用此选项可测试您是否可以成功检索图像并将PDF输出到浏览器。当然,您需要为图像设置已知的有效路径!

<?php

require './tcpdf/tcpdf.php';

$pdf = new TCPDF();

$pdf->AddPage();

$img = file_get_contents('http://path/to/your.jpg');
$pdf->Image('@' . $img);

$pdf->Output();

?>

答案 1 :(得分:4)

确认服务器能够使用PHP的file_get_contentscURL下载文件。 &#34;无法获得图像的大小&#34;是Image函数中的第一个错误,如果服务器上的这两个函数无法访问该文件,TCPDF将抛出该错误。

答案 2 :(得分:3)

要调试此问题,您可以在第6850行的tcpdf.php中删除@ from @gegreize($ file)中的@。搜索 [Image]无法获取图像的大小:并滚动一些排队。 @隐藏了实际的错误消息。

如果您能够从浏览器访问图像网址,则可能是您的系统未将网址指向所请求的主机。相关消息是 getimagesize():php_network_getaddresses:getaddrinfo failed:。这意味着,你的本地php配置不知道在哪里搜索url。在这种情况下,您需要更改/ etc / hosts文件并将本地设置指向urls ip。这通常是localhost设置的问题。

E.g。 127.0.0.1 yoururlhere.local

答案 3 :(得分:2)

确保使用相对路径,有时绝对路径无法使用

确定:&#34; ../../ myImage.png&#34;

错误的:&#34; http://www.example.com/myImage.png&#34;

答案 4 :(得分:2)

我的Magento商店出现了这个错误。

如果你打开tcpdf.php你会发现这个代码,$ file是一个url,它应该是jut文件的路径:

// check if is a local file
if (!@file_exists($file)) {
        // try to encode spaces on filename
        $tfile = str_replace(' ', '%20', $file);

为了快速修复,我添加了以下代码:

$file = str_replace("http://theurliwantgone/","",$tfile);

它有效!希望这对大多数人有帮助!

答案 5 :(得分:0)

对我来说奇怪的是(在2019年)我发现必须删除! include / tcpdf_static.php中1924行的内容。由于某种原因,它只会查看ini_get('allow_url_fopen'),如果它为假,但我的服务器设置为真-则修改代码即可正常工作。以前也可以,但是突然停止了!

答案 6 :(得分:0)

我的代码几乎一样:

$img_base64_encoded = $values["image_field_in_DB"];
$imageContent = file_get_contents($img_base64_encoded);

$my_file = $_SERVER['DOCUMENT_ROOT'].'tmp/image.png';
$handle = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file);
fwrite($handle, $imageContent);
$img = '<img src="'.$my_file.'" width="150" height="auto" alt="image"  data-default="KG" />';

$pdf->writeHTML($img, true, false, true, false, '');

答案 7 :(得分:-2)

在tcpdf.php

中搜索6877行
if ($imsize === FALSE) {
        if (($w > 0) AND ($h > 0)) {
            // get measures from specified data
            $pw = $this->getHTMLUnitToUnits($w, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
            $ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
            $imsize = array($pw, $ph);
        } else {
            $this->Error('[Image] Unable to get the size of the image: '.$file);
        }
    }

更改为:

if ($imsize === TRUE) {
        if (($w > 0) AND ($h > 0)) {
            // get measures from specified data
            $pw = $this->getHTMLUnitToUnits($w, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
            $ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k;
            $imsize = array($pw, $ph);
        } else {
            $this->Error('[Image] Unable to get the size of the image: '.$file);
        }
    }