【问题标题】:Inserting line breaks into PDF在 PDF 中插入换行符
【发布时间】:2010-10-26 02:20:34
【问题描述】:

我正在使用 PHP 即时生成一些 PDF 文件。我的问题是我需要在将插入 PDF 文件中的部分文本中插入换行符。比如:

$pdf->InsertText('Line one\n\nLine two');

所以它打印出来:

第一行

第二行

我知道\n 不适用于 PDF,但你们知道这些文件中有什么字符或代表换行符的东西吗?

【问题讨论】:

  • “一些第三方代码”:如果你准确地说出哪个库对每个人来说都会更容易(幸运的是,看起来 thomasrutter 确实认出了它)
  • InsertText() 没有出现在 fpdf 手册中,所以我怀疑第三方代码是 fpdf。我认为最好删除 fpdf 标签
  • 将近 3 年后回到这个问题,我为它的含糊程度感到尴尬。对不起。我很确定我指的是 fpdf,或者我在某处找到的它的变体。无论如何,我放弃了写 PDF 的计划(或者至少,我用了一段时间,它很好,然后放弃了)。

标签: php pdf fpdf carriage-return


【解决方案1】:

如果您使用的是 fpdf,为了能够使用换行符,您需要使用 multi-line text cell as described here

如果你使用它,那么你的文本中的换行符应该被正确解释和转换。

只是一个简单的例子:

$pdf->Multicell(0,2,"This is a multi-line text string\nNew line\nNew line"); 

这里,2 是多行文本框的高度。我不知道测量单位是什么,或者您是否可以将其设置为 0 并忽略它。如果一开始不起作用,也许可以尝试大量尝试。

【讨论】:

  • 先生,它没有将 \n 解释为换行符,它只是将它打印在 pdf 上作为 \n
  • @sqlchild - 您必须使用下面提到的双引号,并使用此处提到的 \n。它确实有效。自己试过了。
  • @thomasrutter,我也在使用 FPDF。有没有办法在Cell() 函数中读取\n?在第二页打印时,我在定位相邻的 MultiCell() 时遇到问题。我真的需要在Cell() 中阅读\n。请帮忙。谢谢。
  • 我不认为你可以在 Cell() 中
【解决方案2】:

你的代码读取

$pdf->InsertText('Line one\n\nLine two');

我不知道您正在使用的 PDF 库,但通常如果您希望 \n 被解释为换行符,您必须在 PHP 中使用双引号,例如

$pdf->InsertText("Line one\n\nLine two");

【讨论】:

    【解决方案3】:

    你说

    2是多行文本框的高度

    不,不是。 2 是文本行之间的距离。

    我认为没有一种真正的方法可以计算实际结果文本框的高度,除非您使用 GetY() 然后减去 SetXY() 语句中用于将 Multicell 放置在第一名。

    【讨论】:

    • 天哪。我不知道为什么这该死的东西不能正常工作——我想做的就是打印新行!然后我突然读到了这个。多么烦人。它可能在文档中更具体。对于 w,它仅声明 Height of cells. 复数形式对于理解它的含义至关重要。我以为这只是我想要打印的盒子的高度。D'oh!
    【解决方案4】:

    也许为时已晚,但我以非常简单的方式解决了这个问题, 我正在使用 Multicell 选项并且文本来自表单,如果我使用输入字段来获取文本,我无法以任何方式插入换行符,但如果使用 textarea 字段,则文本区域中的换行符是多单元格中的换行符......就是这样,即使我使用utf8_encode($text) 选项来保留重音符号,它也可以工作

    【讨论】:

      【解决方案5】:
      $pdf->SetY($Y_Fields_Name_position);
      $pdf->SetX(#);
      $pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);
      

      在每一个Column中,在你设置X Position之前先标明Y位置,所以变成了这样

      第 1 列

      $pdf->SetY($Y_Fields_Name_position);
      $pdf->SetX(#);
      $pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);
      

      第 2 列

      $pdf->SetY($Y_Fields_Name_position);
      $pdf->SetX(#);
      $pdf->MultiCell($height,$width,"Line1 \nLine2 \nLine3",1,'C',1);
      

      【讨论】:

      【解决方案6】:

      另一种选择是使用TCPDF::Ln()。它在 PDF 中添加了一行,并带有设置高度的选项。

      如果换行符已经在您的内容中,那么 MultiCell() 可能是要走的路,正如其他人所提到的,但我发现我喜欢使用:

      $pdf->Cell(0, 0, 'Line 1', 0, 0, 'C');
      $pdf->Ln();
      $pdf->Cell(0, 0, 'Line 2', 0, 0, 'C');
      

      Cell()MultiCell() 接受不同的参数让我感到困惑,所以我倾向于只使用 Cell()。此外,它读起来像 PDF 的换行符,就像 \n 读起来像文本中的换行符或 HTML 中的 <br> 一样。

      【讨论】:

      • $pdf->cell(0, 0, 'Line 1', 0, 1, 'C') 工作正常!
      【解决方案7】:

      或者在每个文本段落之后尝试这个换行。

      $pdf->Write(0, ' ', '*', 0, 'C', TRUE, 0, false, false, 0) ;

      【讨论】:

        【解决方案8】:
        MultiCell($w, $h, 'text<br />', $border=0, $align='L', $fill=1, $ln=0,
            $x='', $y='', $reseth=true, $reseth=0, $ishtml=true, $autopadding=true,
            $maxh=0);
        

        您可以将MultiCell 配置为基本读取html。

        【讨论】:

          【解决方案9】:

          另一种解决方案(使用 TCPDF)

          对长字符串使用 HEREDOC。例如,将 HERDOC 用于 CONST(定义不同的语言)

          $_prepare_const_EN = <<<EOT
          this is a long string
          and new line as well ...
          EOT;
          
          $define('STR_EN', $_prepare_const_EN);
          
          $pdf->InsertText(STR_EN);
          

          对我很有效....

          【讨论】:

            【解决方案10】:

            我只是用“&lt;br&gt;”标签替换了“\n”。工作得很好。似乎 TCPDF 将文本呈现为 HTML

            $strText = str_replace("\n","<br>",$strText);
            $pdf->MultiCell($width, $height,$strText, 0, 'J', 0, 1, '', '', true, null, true);
            

            【讨论】:

            • 你能用你传递的参数更新你的代码吗?例如 $w =205, $h = 10。对于专家用户来说可能很容易理解,我不是。感谢您的帮助
            【解决方案11】:

            我将 '\n' 更改为 chr(10) 并且成功了:

            $pdf->MultiCell(0,5,utf8_decode($variable1 . chr(10) . $variable2),1);
            

            【讨论】:

            • 这是因为 PHP 从字面上理解单引号 (') 中的文本,而双引号 (") 中包含的文本是 'interpreted',所以这意味着 '\n' 是一个 2 个字符的字符串,其中一个斜线和一个 n 字符,而 "\n" 是一个 1 字符的字符串,包含一个换行符。;)
            【解决方案12】:

            做了这么多噩梦后,我找到了解决办法。

            utf8_decode(chr(10))
            

            我尝试了\n&lt;br/&gt;chr(10),但没有任何效果。然后我意识到是utf-8 并尝试了上面的那个。它适用于MultiCell,但不适用于Cell

            【讨论】:

              【解决方案13】:

              我找到的解决方案是:

              $text = 'Line one\n\nLine two');
              $text = explode('\n', $text);
              
              foreach ($text as $txt){
                  $pdf->Write($txt);
                  $pdf->Ln();
              }
              

              因此,这样,您可以在任何位置有任意数量的 \n,如果您从数据库中动态地获取此文本,它将正确地换行。

              【讨论】:

                猜你喜欢
                • 2012-03-05
                • 2014-01-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-11-14
                • 2013-05-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多