【问题标题】:PHP8 PDFMerger - FATAL ERROR: Count() must be of type Countable|arrayPHP8 PDFMerger - 致命错误:Count() 必须是 Countable|array 类型
【发布时间】:2021-06-27 16:53:48
【问题描述】:

我正在使用 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(导致意外情况)或两者兼而有之?

【问题讨论】:

  • 也许你需要AND count($v[1]) >= 2 但是你没有指定$v看起来像我只是在猜测
  • 如果你像AND COUNT($v[1] >= 2) 那样做,你实际上是在计算一个布尔值,因此错误,在数组$v[1] 上使用它。并且可能更好地检查索引 1 的存在以确保
  • RiggsFolly - 请将此添加为答案,以便我接受。将代码更改为 AND count($v[1]) >= 2)) 似乎已经成功了。 PDF 现在再次合并。我也会在 GitHub 上发表评论。

标签: php pdf


【解决方案1】:

您正在尝试计算布尔值,即 $v[1] >= 2 的结果

我想你可能会写代码

AND count($v[1]) >= 2 

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 2021-09-27
    • 2021-11-27
    • 2023-02-08
    • 2020-08-15
    • 2019-02-26
    • 2019-06-20
    • 2020-04-08
    • 2021-01-07
    相关资源
    最近更新 更多