使用PHP,我如何检查PDF文件是否有错误


With PHP, how can I check if a PDF file has errors

我有一个内置在PHP/MySql数据库系统。这方面我还是新手。系统允许用户上传发票。其他人则允许支付发票。会计人员上传支票。上传check后,它生成一个PDF作为封面,然后使用PDFTK(使用Ben Squire的PDFTK- php - library)将所有文件组合在一起,并向用户提供一个PDF供下载。

一些用户上传的PDF文件,导致PDFTK无限期挂起时,它试图将PDF与其他(但大多数时候它工作得很好)。没有返回错误,只是挂起。为了重新进入系统,用户必须清除缓存并重新登录。服务器没有记录任何错误消息,它只是冻结。我能在文件中找到的唯一区别是,在用Acrobat查看它们时,坏文件的大小是合法的(8.5 x 14)……但如果我创建自己的合法大小的文件并尝试,它会很好。

使用Putty我已经去命令行和复制相同的问题,PDFTK不能读取文件,它挂在命令行上。我尝试使用PDFMerge,它使用FPDF来组合文件并获得与文件的错误(我从中得到的错误是:FPDF错误:无法在预期位置找到对象(4,0))。在命令行上,我可以使用ImageMagick将PDF转换为JPG,但它给了我一个错误:"警告:文件有一个无效的xref条目:2。然后将其转换为jpg格式,但给出一些其他不太有用的警告。

如果我可以让PHP检查PDF文件以确定是否有效而不挂起系统,我可以使用ImageMagick转换文件,然后将其转换回PDF,但我不想对所有文件都这样做。我怎样才能让它在上传文件时检查文件的有效性,看看是否需要转换文件,而不会导致系统挂起?

这是一个文件的链接,导致问题:http://www.cssc-testing.org/accounting/school_9/20130604-a1atransportation-1.pdf

提前感谢您提供的任何指导!

我的代码(我猜不是很干净,因为我是新来的):

$pdftk = new pdftk();
if($create_cover) { $pdftk->setInputFile(array("filename" => $cover_page['server'])); }
// Load a list of attachments
$sql = "SELECT * FROM actg_attachments WHERE trans_id = {$trans_id}";
$attachments = Attachment::find_by_sql($sql);
foreach($attachments as $attachment) {
    // Check if the file exists from the attachments
    $attachment->set_variables();
    $file = $attachment->abs_path . DS . $attachment->filename;
    if(file_exists($file)){
        // Use the pdftk tool to attach the documents to this PDF
        $pdftk->setInputFile(array("filename" => $file));
    }
}
$pdftk->setOutputFile($save_file);
$pdftk->_renderPdf();

它调用的$pdftk类来自:https://github.com/bensquire/php-pdtfk-toolkit

您可以使用Ghostscript使用exec()来检查文件

这里不被接受的答案可能有所帮助:

如何发现程序生成的PDF的问题?

我不会说这是一个合适的/最好的修复,但它可能解决你的问题,

在:pdf_parser.php中,注释掉这行:

$this->error("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location");

应该在544行附近

您可能还需要替换:

    if (!is_array($kids))
        $this->error('Cannot find /Kids in current /Page-Dictionary');

:

    if (!is_array($kids)){
     //   $this->error('Cannot find /Kids in current /Page-Dictionary');
     return;
    }
在fpdi_pdf_parser.php文件

希望有帮助。