pdflib 添加具有动态高度的文本框


pdflib add textbox with dynamic height

我是PDFLib的新手,我正在尝试一些工作

我遇到了以下情况:

有一个非常干净的pdf,有两个文本行。在这两个文本行之后,我想放置一段文本。问题是,这些文本的长度是动态的,因为它是用户输入。它甚至可能是超过 1 页的文本,全部在一个段落中。在本段之后,我想继续添加文本行,就像我在段落之前所做的那样。当段落中的文本适合第一页时,这对我有用。如果没有,文本将流过,我无法添加更多页面。因此,在这种情况下,我的问题是:"如何创建在需要时动态添加更多页面的代码?我假设我的代码的其余部分正在工作,并且包含"TEST"的下一个文本行实际上放在段落之后,但问题是这是不可见的,因为页面的文本流动......

这是我的代码(一小部分):

$L_i_pageWidth  = 595;
              $L_i_pageHeight = 842;
              $L_i_pagecount = 0;
              $tf = 0;
              $y = 0;
              $L_s_fontNormal = "fontname=din-bold-webfont embedding fontsize=12 " .
                  "encoding=unicode textformat=utf8";
              $L_s_fontLarge = "fontname=din-bold-webfont embedding fontsize=18 " .
                  "encoding=unicode textformat=utf8";
              $L_s_fontSmall = "fontname=din-bold-webfont embedding fontsize=10 " .
                  "encoding=unicode textformat=utf8";

              try {
                $p = new PDFlib();
                # This means we must check return values of load_font() etc.
                $p->set_parameter("errorpolicy", "return");
                $p->set_parameter("SearchPath", "./assets/pdf/input");
                if ($p->begin_document("", "") == 0) {
                  throw new FrameworkException('Exception ' . get_class($e) . ' - ' . $e->getMessage(), 1001, $e);
                }
                /* Start the template */
                /* Page 1 */
                $p->begin_page_ext($L_i_pageWidth, $L_i_pageHeight, "");
                $L_i_pagecount++;
                $y = $L_i_pageHeight - 150;
                $p->fit_textline("text", 75, $y, $L_s_fontNormal);
                $p->fit_textline('This is a line of text', 220, $y, $L_s_fontNormal);
                $y -= 15;
                $text = 'sdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsf sdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsf sdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsf sdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsfsdsssds sddsdsdsf';
                $tf = $p->create_textflow($text, $L_s_fontNormal);
                if ($tf == 0)
                {
                  throw new FrameworkException('Exception ' . get_class($e) . ' - ' . $e->getMessage(), 1001, $e);
                }
                $result = $p->fit_textflow($tf, 75, $y, ($L_i_pageWidth-75), ($y - 800), 'verticalalign=center');
                // probleem: het loopt van de pagina af
                // combineren twee voorbeelden werkt niet
                $textx = $p->get_value("textx", 0);
                $texty = $p->get_value("texty", 0);
                // font
                $fsize = 12;
                $p->set_parameter("errorpolicy", "return");
                $p->set_parameter("textformat", "utf8");
                $font = $p->load_font("Helvetica-Bold", "unicode", "");
                if ($font == 0)
                print_r("Error: " . $p->get_errmsg());
                $p->setfont($font, $fsize);
                $p->set_text_pos(75, $y);
                $p->show_xy("TEST", 75, $texty -= ($fsize*1.2));
                $p->fit_textline("text", 75, $y, $L_s_fontNormal);
                $p->fit_textline('This is a line of text', 220, $y, $L_s_fontNormal);
                $y -= 15;

                $p->suspend_page("");
                foreach(range(1, $L_i_pagecount) as $pagenumber)
                {
                  $p->resume_page("pagenumber ".$pagenumber);
                  $p->end_page_ext("");
                }

                $p->end_document("");
                return $p->get_buffer();
              }
              catch (PDFlibException $e) {
                echo '<pre>';print_r($e);
                  throw new FrameworkException('Exception ' . get_class($e) . ' - ' . $e->getMessage(), 1001, $e);
              }
              catch (Exception $e) {
                  throw new FrameworkException('Exception ' . get_class($e) . ' - ' . $e->getMessage(), 1001, $e);
              }

如果需要更多信息,请告诉我。提前感谢!

一个简单的示例,它演示了如何跨越多个实例(页面、列等)的文本流句柄在 PDFlib 包中以及 PDFlib 说明书中可用。 => starter_textflow.php.http://www.pdflib.com/pdflib-cookbook/text-output/starter-textflow/php-starter-textflow/

适合您的案例的一个很好的例子是说明书样本"文本后继续注意"http://www.pdflib.com/pdflib-cookbook/text-output/continue-note-after-text/php-continue-note-after-text/

代码

中的相关代码片段是

$result = $p->fit_textflow($tf, 75, $y

, ($L_i_pageWidth-75), ($y - 800), 'verticalalign=center');

您应该应用左下角坐标和右上角坐标应放置文本的可能区域。在您的情况下,我想只有右上角位置的 y 位置是错误的。在调用 fit_textflow() y=677 的位置,因此 y 位置为 ($y-800) = -123。此值位于页面下边框下方,文本将在下方流动。另外,我不确定"垂直对齐=中心"是否是您所期望得到的。使用此功能时,文本将放置在给定适合框的中心。

因此,对于较低的值,您应该应用一些 0>,对于较高的 y 位置,您应该应用计算出的$y。

在此 fit_textflow() 调用之后,请检查$result。如果你得到"_stop",你知道,完整的内容被放置在Fitbox区域。如果你得到"_boxfull"你知道,有一些内容没有放置,你必须再次调用fit_textflow()。可能在下一页。

文本完成后,您可以使用

$textendy = $p->info_textflow($tf, "textendy"); 以检索置入文本的结束位置。之后,您可以使用它进一步计算以下内容。

你试过pdf_show_boxed()还是PDF_fit_textflow()?pdf_get_value($p, "文本", 0);将为您提供文本流的位置。