PHP8 PDFMerger - FATAL ERROR: Count() must be of type Countable|array
PHP8 PDFMerger - FATAL ERROR: Count() must be of type Countable|array
我正在使用 PHP PDFMerger 库:https://github.com/myokyawhtun/PDFMerger
我们经常使用它来下载大量客户文档。
有时我会收到错误消息:
Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, bool given in C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php:503 Stack trace: #0 C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php(373): tcpdi_parser->decodeXrefStream() #1 C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php(212): tcpdi_parser->getXrefData() #2 C:\MyPath\www\PDFMerger\tcpdf\tcpdi.php(121): tcpdi_parser->__construct() #3 C:\MyPath\www\PDFMerger\tcpdf\tcpdi.php(88): TCPDI->_getPdfParser() #4 C:\MyPath\www\PDFMerger\PDFMerger.php(97): TCPDI->setSourceFile() #5 C:\MyPath\www\offline downloads\download-DL100.php(75): PDFMerger\PDFMerger->merge() #6 {main} thrown in C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php on line 503
错误行的代码是:
$valid_crs = false;
$sarr = $xrefcrs[0][1];
$keys = array_keys($sarr);
$columns = 1; // Default as per PDF 32000-1:2008.
$predictor = 1; // Default as per PDF 32000-1:2008.
foreach ($keys as $k=>$key) {
$v = $sarr[$key];
if (($key == '/Type') AND ($v[0] == PDF_TYPE_TOKEN AND ($v[1] == 'XRef'))) {
$valid_crs = true;
} elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {
// first object number in the subsection
$index_first = intval($v[1][0][1]);
// number of entries in the subsection
$index_entries = intval($v[1][1][1]);
} elseif (($key == '/Prev') AND ($v[0] == PDF_TYPE_NUMERIC)) {
// get previous xref offset
$prevxref = intval($v[1]);
} elseif (($key == '/W') AND ($v[0] == PDF_TYPE_ARRAY)) {
// number of bytes (in the decoded stream) of the corresponding field
$wb = array();
$wb[0] = intval($v[1][0][1]);
$wb[1] = intval($v[1][1][1]);
$wb[2] = intval($v[1][2][1]);
} elseif (($key == '/DecodeParms') AND ($v[0] == PDF_TYPE_DICTIONARY)) {
$decpar = $v[1];
foreach ($decpar as $kdc => $vdc) {
if (($kdc == '/Columns') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
$columns = intval($vdc[1]);
} elseif (($kdc == '/Predictor') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
$predictor = intval($vdc[1]);
}
}
} elseif ($filltrailer) {
switch($key) {
case '/Size':
case '/Root':
case '/Info':
case '/ID':
$xref['trailer'][1][$key] = $v;
break;
default:
break;
}
}
}
第 503 行是:
} elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {
我知道 Count 正在尝试对非数组值进行计数。我试过使用 is_countable();并指定 $v=array();但收效甚微。
这只对某些 PDF 失败。阅读周围我可以看到 PDF 合并不是防弹的并且确实会发生故障。但是,我想更多地了解代码,以确定导致错误的原因;错误的代码或错误的 PDF(导致意外情况)或两者兼而有之?
您正在尝试计算一个布尔值,即 $v[1] >= 2
的结果
我想你可能想到了代码
AND count($v[1]) >= 2
我正在使用 PHP PDFMerger 库:https://github.com/myokyawhtun/PDFMerger
我们经常使用它来下载大量客户文档。 有时我会收到错误消息:
Fatal error: Uncaught TypeError: count(): Argument #1 ($var) must be of type Countable|array, bool given in C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php:503 Stack trace: #0 C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php(373): tcpdi_parser->decodeXrefStream() #1 C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php(212): tcpdi_parser->getXrefData() #2 C:\MyPath\www\PDFMerger\tcpdf\tcpdi.php(121): tcpdi_parser->__construct() #3 C:\MyPath\www\PDFMerger\tcpdf\tcpdi.php(88): TCPDI->_getPdfParser() #4 C:\MyPath\www\PDFMerger\PDFMerger.php(97): TCPDI->setSourceFile() #5 C:\MyPath\www\offline downloads\download-DL100.php(75): PDFMerger\PDFMerger->merge() #6 {main} thrown in C:\MyPath\www\PDFMerger\tcpdf\tcpdi_parser.php on line 503
错误行的代码是:
$valid_crs = false;
$sarr = $xrefcrs[0][1];
$keys = array_keys($sarr);
$columns = 1; // Default as per PDF 32000-1:2008.
$predictor = 1; // Default as per PDF 32000-1:2008.
foreach ($keys as $k=>$key) {
$v = $sarr[$key];
if (($key == '/Type') AND ($v[0] == PDF_TYPE_TOKEN AND ($v[1] == 'XRef'))) {
$valid_crs = true;
} elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {
// first object number in the subsection
$index_first = intval($v[1][0][1]);
// number of entries in the subsection
$index_entries = intval($v[1][1][1]);
} elseif (($key == '/Prev') AND ($v[0] == PDF_TYPE_NUMERIC)) {
// get previous xref offset
$prevxref = intval($v[1]);
} elseif (($key == '/W') AND ($v[0] == PDF_TYPE_ARRAY)) {
// number of bytes (in the decoded stream) of the corresponding field
$wb = array();
$wb[0] = intval($v[1][0][1]);
$wb[1] = intval($v[1][1][1]);
$wb[2] = intval($v[1][2][1]);
} elseif (($key == '/DecodeParms') AND ($v[0] == PDF_TYPE_DICTIONARY)) {
$decpar = $v[1];
foreach ($decpar as $kdc => $vdc) {
if (($kdc == '/Columns') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
$columns = intval($vdc[1]);
} elseif (($kdc == '/Predictor') AND ($vdc[0] == PDF_TYPE_NUMERIC)) {
$predictor = intval($vdc[1]);
}
}
} elseif ($filltrailer) {
switch($key) {
case '/Size':
case '/Root':
case '/Info':
case '/ID':
$xref['trailer'][1][$key] = $v;
break;
default:
break;
}
}
}
第 503 行是:
} elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) {
我知道 Count 正在尝试对非数组值进行计数。我试过使用 is_countable();并指定 $v=array();但收效甚微。
这只对某些 PDF 失败。阅读周围我可以看到 PDF 合并不是防弹的并且确实会发生故障。但是,我想更多地了解代码,以确定导致错误的原因;错误的代码或错误的 PDF(导致意外情况)或两者兼而有之?
您正在尝试计算一个布尔值,即 $v[1] >= 2
我想你可能想到了代码
AND count($v[1]) >= 2