将大量pdf导入mPDF会导致/fopen失败

  • 本文关键字:fopen 失败 mPDF pdf 导入 php mpdf
  • 更新时间 :
  • 英文 :


编辑:在Jan 的协助下更新

编辑:代码在$mpdf->之前不会失败;输出($max.'imports.pdf','D'(;称为

PHP 7.1版

MPDF版本8.0.10

Setasign fpdi_pdf-parser 2.0.4版错误

无法打开文件(fopen(Compnay Induction(checklist(th v2.pdf无法打开文件(fopen(员工信息注册.pdf无法打开文件(fopen(Coshh listings v7.pdf无法打开文件(fopen(员工能力表.pdf

下面是我的代码片段,它会产生错误

function addCustomForms($forms, $mpdf, $Customer)
{
if ($forms) {
$handles = [];
foreach ($forms as $CustomPolicyForm) {
if (is_file('../cdata/' . $Customer->reference . '/policy-forms/' . $CustomPolicyForm->form)) {
try {
$h = fopen('../cdata/' . $Customer->reference . '/policy-forms/' . $CustomPolicyForm->form, 'rb');
// File not Opened
if ($h === false) {
echo 'Failed to open file (fopen) ' . $CustomPolicyForm->form . '<br/>';
return false;
} else {
$stream = new setasignFpdiPdfParserStreamReader($h, false);
$pagecount = $mpdf->setSourceFile($stream);
if ($pagecount > 0) {
for ($i = 1; $i <= ($pagecount); $i++) {
$mpdf->AddPage($CustomPolicyForm->orientation);
if ($i == 1) {
$html = '<h3 style="color: #ffffff;">' . sd($CustomPolicyForm->title) . '</h3>';
$mpdf->WriteHTML($html);
}
try {
$import_page = $mpdf->importPage($i);
try {
$mpdf->useTemplate($import_page);
} catch (Exception $e) {
echo 'Not worked for ' . $CustomPolicyForm->title .'<br/>';
return false;
}
} catch (Exception $e) {
echo 'importPage failed for ' . $CustomPolicyForm->title . ' Page ' . $i .'<br/>';
return false;
}
}
$handles[] = $h;
} else {
echo 'Page count is less than 1 for ' . $CustomPolicyForm->form .'<br/>';
return false;
}
}
} catch
(Exception $e) {
echo 'Failed to set source file for ' . $CustomPolicyForm->form . '<br/>';
return false;
}
} else {
echo 'File not found: ' . $CustomPolicyForm->form .'<br/>';
return false;
}
$pagecount = null;
}
return $handles;
} else {
// No forms found
echo 'No Forms Found';
return false;
}
}
$mpdf->Output(Customer::find_by_id($Policy->customer_id)->customer . '.pdf', 'D');
fclose($handles);

更改TOCuseLinking'=>false隐藏/解决了问题,但我不确定最初是什么原因导致了问题。

我正在使用的测试文件是https://1drv.ms/b/s!ApXTTaxD_QQPj7kwpxX3G4a5-2Ir2Q?e=WJRMi3(这是一个空白的PDF(

有人有什么线索吗?

mPDF的TOC功能试图通过克隆整个实例并重置它来发挥一些魔力……我没有深入研究它。但通过这一点,对流读取器的引用是未设置的。由于对象的数量,稍后会触发garbadge收集器,从而触发__destruct()方法,然后关闭流句柄。

若要绕过此问题,您需要控制文件句柄。你的例子可以这样重写:

$h = fopen('BLANK PDF.pdf', 'rb');
$stream = new setasignFpdiPdfParserStreamReader($h, false);
for ($count = 0; $count < $max; $count++) {
$pagecount = $mpdf->setSourceFile($stream);
if ($pagecount > 0) {
$mpdf->AddPage();
for ($i = 1; $i <= ($pagecount); $i++) {
if ($i == 1) {
$html = '<h3 style="color: #000;">' . htmlentities('Blank PDF ' . $count) . '</h3>';
$mpdf->WriteHTML($html);
}
$import_page = $mpdf->importPage($i);
$mpdf->useTemplate($import_page);
}
} else {
return false;
}
}
$mpdf->Output($max . ' imports .pdf', 'F');
fclose($h);

如果需要处理不同的文件,请将句柄存储在数组中以保留其引用。

您还应该注意到,操作系统对打开的文件句柄有限制。FPDI受此限制。

最新更新