PDFlib PHP return 并排两个元素的动态高度

PDFlib PHP return dynamic height of two elements side by side

所以,我有两个并排的元素。这些元素中的每一个都包含一个列表,并且在它们自己的高度上可以是动态的。但是我有两个问题。

1.) 如何将最高元素的高度赋予这两个元素下的下一个元素?我知道我可以 return 高度值,但截至目前,这并没有像我想要的那样工作。如果我return左元素的高度值,右元素,不会有右起点的高度,如果我只是return一个的高度值,下一个元素只会得到它的从该元素开始。意味着如果我,例如,return 正确元素的高度值,下一个元素将从那里获得它的起点。但是如果左边的元素比右边的长,它就不能正确显示。 我怎样才能实现我在这里想要做的事情?

2.) 另一个问题是目前的输出不正确。列表的项目来自一个数组。为了显示它们,我创建了一个 foreach 循环,它为每个列表项创建了自己的文本流。然后将在该循环内调整下一个项目的高度。前两个项目目前显示正确,但第三个项目和之后的每个项目都没有获得正确的高度值,将显示在第二个项目之下。有谁知道我在这里做错了什么?

我创建了两个函数,一个用于左侧元素,一个用于右侧。我的代码现在看起来像这样...... 左元素的函数:

private function createProductProfile(\PDFlib $p, int $y, int $fontLightRegular, int $elementStartLeft, int $elementStartHalf, int $elementEndRight, array $arrInput)
    {
        // Variable Declaration
        $productProfileContent = $arrInput['productProfile']['profileContent'];

        $right_x = $elementStartHalf - 20;
        $left_x = $elementStartLeft + 10;
        $right_y = $y;
        $left_y = $right_y - 20;

        // output every element of productProfileContent array as textflow
        foreach ($productProfileContent as $profile) {
            $this->placeHyphen($p, $elementStartLeft, $y);

            $optlistProfile = 'font=' . $fontLightRegular . ' fontsize=10 fillcolor=black wordspacing=0';

            $tfProfile = $p->add_textflow(0, $profile, $optlistProfile);
            if ($tfProfile == 0) {
                throw new Exception('Error: ' . $p->get_errmsg());
            }

            // Gebe Textflow aus
            $resultProfile = $p->fit_textflow($tfProfile, $left_x, $left_y, $right_x, $right_y, '');

            $right_y = $right_y - 20;
            $y = $y - 20;
        }
    }

这是正确元素的函数:

private function createProductAdvantages(\PDFlib $p, int &$y, int $fontLightRegular, int $elementStartLeft, int $elementStartHalf, int $elementEndRight, array $arrInput)
    {
        // Variable Declaration
        $productAdvantagesContent = $arrInput['productAdvantages']['advantagesContent'];

        $right_x = $elementEndRight;
        $left_x = $elementStartHalf + 30;
        $right_y = $y;
        $left_y = $right_y - 20;

        // output every element of $productAdvantagesContent array as textflow
        foreach ($productAdvantagesContent as $advantages) {
            $this->placeHyphen($p, $elementStartHalf + 20, $y);

            $optlistAdvantages = 'font=' . $fontLightRegular . ' fontsize=10 fillcolor=black wordspacing=0';

            $tfAdvantages = $p->add_textflow(0, $advantages, $optlistAdvantages);
            if ($tfAdvantages == 0) {
                throw new Exception('Error: ' . $p->get_errmsg());
            }

            // Gebe Textflow aus
            $resultAdvantages = $p->fit_textflow($tfAdvantages, $left_x, $left_y, $right_x, $right_y, '');

            $right_y = $right_y - 20;
            $y = $y - 20;
        }
    }

这里还有一张当前输出的图像。如您所见,连字符将正确显示,但数组项不会:

目前您的代码假定您始终需要完整的指定限定框(因此框的高度为 fit_textflow)。

    // Gebe Textflow aus
    $resultProfile = $p->fit_textflow($tfProfile, $left_x, $left_y, $right_x, $right_y, '');

    $right_y = $right_y - 20;
    $y = $y - 20;

我怀疑大多数时候情况并非如此。因此,after fit_textflow() 你应该选择文本的最终位置并继续计算它。您可以使用 info_textflow().

执行此操作
    // Gebe Textflow aus
    $resultProfile = $p->fit_textflow($tfProfile, $left_x, $left_y, $right_x, $right_y, '');
    $lly = $p->info_textflow($tfProfile, "y1");
    // now you can work with the lower left y position for further calculation

其次,如果要保持左右列的输出同步,则需要检索左右列的值,然后使用较低值的新 Y 起点。

另一方面,我觉得您也可以将布局视为具有两列的 table 布局。在这种情况下,您只需创建 Textflow 单元格,然后在放置内容时 PDFlib 将相应地生成布局。也许你可以考虑一下?