我正在处理大量的页面(字母),除了地址和一些其他细节之外,它们是相同的。我相信PDF创建速度最慢的是我在每个页面上都包含的徽标图像(即使它相当小)。
我希望通过缓存徽标来加快这一过程,即通过加载文件一次并将其存储在变量中并使用TCPDF,而不是每次都加载图像。 TCPDF可以加载“PHP图像数据流”,给出的示例如下:
$imgdata = base64_decode('iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABlBMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDrEX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==');
$pdf->Image('@'.$imgdata);
但是,我不知道如何从文件中创建这样的图像流。
我的徽标是一个小的(4kB)PNG文件。如果我使用readfile($file)
并将其发送到前面带有'@'的$pdf->Image
,则会出错 - 有关缓存文件夹的内容已经设置为chmod 777(它是测试服务器 - 我会处理实时服务器上的适当权限)。我相信我也试过了base64_encode
这也没有用。
关于如何做到这一点的任何想法?
PS:我已经注意到我在PDF中包含的页面越多,它就越慢,所以我会找到一个好的中间(每个文件大概200-250页而不是当前的500页)。谢谢!
答案 0 :(得分:2)
在sourceforge(sourceforge forum post)的TCPDF论坛上发布了同样的问题,TCPDF的作者回答了。
他说图像是在内部缓存的,但是如果图像需要处理,他建议使用XObject()
模板系统(请参阅TCPDF网站上的example 62)。
我花了一段时间才开始工作(但仍然不确定为什么它一开始对我不起作用),但是一旦我看起来与使用Image()
的原始版本完全相同,我跑了一些测试大约3,000个条目分为PDF文件,每个500页。
在XObject()
和Image()
之间根本没有速度增益,XObject()
实际上似乎使得生成的文件稍微大一点(在1.2MB文件中为2.5kB)
虽然这并没有直接回答我原来的问题(如何创建可以使用Image('@'.$image)
直接在TCPDF中使用的PHP数据流),但它告诉我我真正需要知道的是 - 图像已经是缓存,使用XObject()
进行缓存并不能为我的情况带来任何好处。