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

时间:2013-06-04 22:41:40

标签: php pdf fpdf pdftk

我有一个用PHP / MySql构建的数据库系统。我对此很新。系统允许用户上传发票。其他人允许支付发票。会计人员上传支票。上传支票后,它会生成一个PDF作为封面,然后使用PDFTK(使用Ben Squire的PDFTK-PHP-Library)将所有文件组合在一起,并向用户呈现单个PDF进行下载。

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

使用Putty我已经去了命令行并复制了同样的问题,PDFTK无法读取文件,它也挂起在命令行上。我尝试使用PDFMerge,它使用FPDF来组合文件并同时获取文件错误(我从中得到的错误是: FPDF错误:无法在预期位置找到对象(4,0))。在命令行上,我能够使用ImageMagick将PDF转换为JPG,但它给出了一个错误:“警告:文件的外部参照条目无效: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

2 个答案:

答案 0 :(得分:0)

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

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

How can you find a problem with a programmatically generated PDF?

答案 1 :(得分:0)

我不会说这是一个合适/最好的解决方案,但它可以解决您的问题,

在: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文件中

希望有所帮助。它对我有用。