我正在使用FDPF为客户生成发票,然后将其附加到电子邮件中并发送给客户。发票/电子邮件是批量生成的(一次几百个)。在该批次的第一次实际运行中,少数(约200个)客户收到了损坏的PDF。它们之间的共同点是,它们的发票数量大于平均值,这使我相信生成发票所需的时间导致竞争条件,并且可能在PDF有时间完成生成之前发送电子邮件完全。有没有办法在发送电子邮件之前验证PDF是否已损坏?还是有另一种方法可以解决我忽略的问题吗?
答案 0 :(得分:0)
您可以通过在首次发送文件时为pdf创建md5哈希值来测试pdf是否完全生成,然后在电子邮件发送时再次创建,以及最后在发送之后再次创建。如果md5每次都更改,那么当电子邮件发送时,pdf生成器仍然会创建该文件。
以下是有关如何使用md5哈希的示例:
<?php
$file_name = 'md5_demonstration_file';
$file_changer = 0;
while($file_changer < 10)
{
file_put_contents($file_name, $file_changer);
echo md5_file ($file_name) . '</br>';
$file_changer++;
}
?>
您会注意到md5哈希在函数的每次迭代中都会发生变化,因为文件仍在被写入。如果您尝试此示例代码,则可能必须手动设置“md5_demonstration_file”的权限,以便任何人都可以写入。
如果竞争条件不是问题你是否已经阅读了这个SO建议帖子:Corrupt PDF email attachment when generated by FPDF and PHP
答案 1 :(得分:0)
请注意,最新版本的Acrobat阅读器对于阅读不完全符合正确pdf格式的文件非常麻烦。
pdf文档的开头由字符串%PDF表示。较旧版本的Acrobat会忽略%PDF标记之前发生的文件内容。例如,您可能在文件中留下了一些调试输出,如下所示:
debug line 1
debug line 2
%PDF-1.4
3 0 obj
<</Type /Page
etc.
并且Acrobat会打开它,(就像在OSX上预览一样)。
Acrobat再也不会接受了。
我被那个咬了,所以希望这会有所帮助!