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