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

pdflib add textbox with dynamic height

我是 PDFLib 的新手,我正在努力工作

我遇到了以下情况:

有一个非常干净的 pdf,有两个文本行。 在这两个文本行之后,我想放置一段文本。问题是,这些文本的长度是动态的,因为它是用户输入的。它甚至可以超过 1 页的文本,全部在一个段落中。 在本段之后,我想像在本段之前一样继续添加文本行。当段落中的文本适合第一页时,这对我有用。如果没有,文本将溢出,我无法添加更多页面。 所以我在这种情况下的问题是: "How to create code that will dynamically add more pages if needed?" 我假设我的代码的其余部分正在工作并且包含 "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);
              }

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

你试过 pdf_show_boxed() 或 PDF_fit_textflow() 吗? pdf_get_value($p, "text", 0);会给你文本流的位置。

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

菜谱样本是您案例的一个很好的样本 "Continue note after Text" 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。该值位于页面下边框下方,文本将在下方流动。另外,我不确定 "verticalalign=center" 是否是您期望得到的。使用此功能时,文本将放置在给定限定框的中心。

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

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

正文完成后,可以使用

$textendy = $p->info_textflow($tf, "textendy"); to retrieve the end position of the placed text. Afterwards you can use this for further calculations for content below.