0

如何将使用 ImageMagick 处理的图像(未保存)传递给 Zend_Pdf_Image?我想转移 $image = new Imagick($imageFile); 直接到 $pdfImage = Zend_Pdf_Image:: ...,不保存。那可能吗?

感谢您的建议,于尔根

4

2 回答 2

2

我正要简单地说“不”,但后来我想我会仔细检查代码并考虑是否还有其他可能性。

imageWithPath()方法利用其他类中的一些辅助方法来解码$filePath参数引用的图像。这些辅助方法中的每一个所做的第一件事就是打开$filePathusing fopen()

所以这意味着您可以将任何类型的资源传递给imageWithPath()您的 PHP 安装支持的方法。

一般来说,这意味着文件和 URL,但从 PHP 5.2 开始,它还包括data://包装器。我自己没有使用过这个(多年来我一直在写出临时文件,然后将它们传递给它们imageWithPath()),但根据手册页,它可能只允许您传入修改后的数据而不必先将其保存到文件中.

更多信息: http: //php.net/manual/en/wrappers.data.php

如果您使用这种方法得到了一些工作,请让我们都知道。:-)

于 2013-01-03T02:05:13.833 回答
1

我将把我的 3 美分加到上面的詹姆斯回答中。他是完全正确的——允许使用数据:包装器。

展示如何使用 ImageMagick 将 svg 转换为 Zend_Pdf_Image 的示例方法:

class My_Pdf extens Zend_Pdf {

    function imageFromSvg($path, $w, $h) {
        if (!class_exists('Imagick') || !file_exists($path)) return false;
        $svg = file_get_contents($path);
        $im = new Imagick();
        $im->readImageBlob($svg);
        $im->setImageFormat('png8');
        $im->adaptiveResizeImage($w,$h);
        return new Zend_Pdf_Resource_Image_Png('data:image/png;base64,'.base64_encode   ($im));
    }
}

注意 Zend_Pdf_Resource_Image_Png 不支持位深度大于 8 的 png。返回的对象可以很容易地使用它的 drawImage 方法嵌入到 Zend_Pdf 中。例子:

$pdf = new My_Pdf();
$page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4);
$page->drawImage($pdf->imageFromSvg($svg,400,400),400,100,100,100);

我使用重新缩放为 400x400 的 svg,因为那时我可以获得更好的打印质量。您可以根据自己的需要对此进行试验。祝你好运!

于 2014-01-23T12:35:29.793 回答