Php 在作为电子邮件附件发送之前验证PDF

Php 在作为电子邮件附件发送之前验证PDF,php,fpdf,Php,Fpdf,我使用FDPF为客户生成发票,然后将发票附加到电子邮件并发送给客户。发票/电子邮件成批生成(一次生成几百封)。在这批产品的第一次实际运行中,少数(约200名客户中的5名)客户收到了腐败的PDF。它们之间的共同联系是,它们的发票比平均值大,这使我相信生成发票所需的时间导致了竞争条件,可能是在PDF有时间完成生成之前发送了电子邮件。在发送电子邮件之前,是否有方法验证PDF是否已损坏?或者有没有其他方法来解决我忽略的问题?您可以通过在文件首次发送时为pdf创建md5哈希,然后在电子邮件发送时再次创建,

我使用FDPF为客户生成发票,然后将发票附加到电子邮件并发送给客户。发票/电子邮件成批生成(一次生成几百封)。在这批产品的第一次实际运行中,少数(约200名客户中的5名)客户收到了腐败的PDF。它们之间的共同联系是,它们的发票比平均值大,这使我相信生成发票所需的时间导致了竞争条件,可能是在PDF有时间完成生成之前发送了电子邮件。在发送电子邮件之前,是否有方法验证PDF是否已损坏?或者有没有其他方法来解决我忽略的问题?

您可以通过在文件首次发送时为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_演示文件”的权限,以便任何人都可以对其进行写入


如果竞态条件不是问题,那么您是否阅读了这篇建议的文章:

请注意,最新版本的Acrobat reader在读取不完全符合正确pdf格式的文件时会更加挑剔

pdf文档的开头由字符串%pdf指示。旧版本的Acrobat将忽略出现在%PDF标记之前的文件内容。例如,您可能在文件中留下了一些调试输出,如下所示:

debug line 1
debug line 2
%PDF-1.4
3 0 obj
<</Type /Page
etc.
调试行1
调试行2
%PDF-1.4
30 obj

您是如何生成它的?看起来你应该能够通过手动生成一个大的PDF来快速检验你的假设。当我一次生成一个PDF时,它们工作得很好。我可能会做同一批,但电子邮件会发送到我自己的地址,这样我就可以看到发生了什么,并以这种方式进行修补。