pdflib添加动态高度的文本框

时间:2015-03-17 15:26:20

标签: php pdf pdflib

我是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);
              }

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

2 个答案:

答案 0 :(得分:0)

您是否尝试过pdf_show_boxed()或PDF_fit_textflow()? pdf_get_value($ p,“text”,0);将给你文本流的位置。

答案 1 :(得分:0)

一个简单的示例,演示了如何在PDFlib包中以及PDFlib库中提供跨越多个实例(页面,列等)的文本流句柄。 =&GT; starter_textflow.php。 http://www.pdflib.com/pdflib-cookbook/text-output/starter-textflow/php-starter-textflow/

您的案例的一个很好的样本是食谱样本&#34;继续注释文本&#34; http://www.pdflib.com/pdflib-cookbook/text-output/continue-note-after-text/php-continue-note-after-text/

代码中的相关代码片段是

  

$ result = $ p-&gt; fit_textflow($ tf,75,$ y,($ L_i_pageWidth-75),($ y - 800),&#39; verticalalign = center&#39;);

你应该应用左下角坐标和右上角坐标 应放置文本的可能区域。在你的情况下,我猜只是右上角位置的y位置是错误的。在您调用fit_textflow()y = 677的位置,因此y位置为($ y-800)= -123 。此值低于页面的下边框,文本将在下方流动。另外,我不确定,如果&#34; verticalalign = center&#34;是你期望得到的。使用此功能时,文本将放置在给定fitbox的中心。

因此,对于较低的值,您应该应用一些&gt; 0和上y位置应用您计算的$ y。

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

文本完成后,您可以使用

  

$ textendy = $ p-&gt; info_textflow($ tf,&#34; textendy&#34;);   检索放置文本的结束位置。之后,您可以将其用于进一步计算以下内容。