PDFlib PHP возвращает динамическую высоту двух элементов рядом

#php #pdf #pdflib

Вопрос:

Итак, у меня есть два элемента бок о бок. Каждый из этих элементов содержит список и может быть динамичным по своей высоте. Но у меня есть две проблемы с этим.

1.) Как я могу присвоить высоту самого высокого элемента следующему элементу под этими двумя? Я знаю, что могу вернуть значение высоты, но на данный момент это работает не так, как я хочу. Если я верну значение высоты левого элемента, у правого элемента не будет правильной начальной точки по высоте, и если я просто верну значение высоты одного, следующий элемент получит только начальную точку от этого элемента. Это означает, что если я, например, верну значение высоты нужного элемента, следующий элемент получит от этого начальную точку. Но если левый элемент длиннее правого, он отображается неправильно. Как я могу достичь того, что я пытаюсь здесь сделать?

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 amp;$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;
        }
    }
 

Также вот изображение текущего выходного сигнала. Как вы можете видеть, дефисы будут отображаться правильно, но не элементы массива:
выход, генерируемый током

Ответ №1:

В настоящее время ваш код предполагает, что вам всегда нужен полный указанный fitbox (поэтому высота поля в 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;
 

Я подозреваю, что в большинстве случаев это не так. Поэтому после 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 более низкого значения.

С другой стороны, мне кажется, что вы также могли бы представить свой макет как макет таблицы с двумя столбцами. В этом случае вы просто создадите ячейки Textflow, и при размещении содержимого PDFlib будет соответствующим образом генерировать макет. Может быть, вы могли бы немного подумать об этом?

Комментарии:

1. Хорошо, поэтому я попытался рассчитать высоту элементов списка с помощью этого метода, но у меня все еще есть та же ошибка, что каждый элемент после второго будет отображаться на позиции второго. Я рассчитал высоту текстового потока с помощью $lly = $p->info_textflow($tfProfile, "y2"); (также попробовал с помощью y1), а затем присвоил это значение $right_y: $right_y = $lly - 10; (-10, чтобы оно было на той же высоте, что и дефис). Я все еще не совсем понимаю, что вызывает эту ошибку? Альтернативой была бы компоновка стола, но тогда мне нужно все это реконструировать.

2. Хорошо, да, забудьте об этом первом комментарии 😀 Я просто потратил время, чтобы перестроить его в таблицу, потому что в целом это намного проще использовать в дальнейшем в программе. Большое спасибо за вашу помощь и за то, что подумали!