我有一个用 PHP/MySql 构建的数据库系统。我对此很陌生。该系统允许用户上传发票。其他人允许支付发票。会计人员上传支票。上传支票后,它会生成一个 PDF 作为封面,然后使用 PDFTK(使用 Ben Squire 的 PDFTK-PHP-Library)将所有文件组合在一起,并为用户提供单个 PDF 以供下载。
一些用户上传 PDF 文件会导致 PDFTK 在尝试将 PDF 与其他文件合并时无限期挂起(但大多数情况下它工作正常)。没有返回错误,只是挂起。为了回到系统,用户必须清除缓存并重新登录。服务器没有记录错误消息,它只是冻结。我可以在使用 Acrobat 查看它们的文件中找到的唯一区别是坏文件是合法大小的(8.5 x 14)......但是如果我创建自己的合法大小的文件并尝试,它工作正常。
使用 Putty 我已经转到命令行并复制了同样的问题,PDFTK 无法读取文件,它也挂在命令行上。我尝试使用 PDFMerge,它使用 FPDF 合并文件并得到文件错误(我从中得到的错误是:FPDF error: Unable to find object (4, 0) at expected location)。在命令行上,我能够使用 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