在 PDF 中插入换行符

Posted

技术标签:

【中文标题】在 PDF 中插入换行符【英文标题】:Inserting line breaks into 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 的计划(或者至少,我用了一段时间,它很好,然后放弃了)。 【参考方案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);

【讨论】:

根据文档fpdf.org/en/doc/multicell.htm MultiCell 的第一个参数是width 而不是height【参考方案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,如果您从数据库中动态地获取此文本,它将正确地换行。

【讨论】:

以上是关于在 PDF 中插入换行符的主要内容,如果未能解决你的问题,请参考以下文章

PHPWord解决Word转PDF可能出现的空白页问题 | 插入换行符分页符定义文档网络时对齐网格

使用 <xsl:value-of> 在从 XSL FO 生成的 PDF 中插入换行符

java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题

java中使用pdfbox对pdf文件进行操作时,如何实现插入文本的自动换行操作?

如何使用 PDFBox drawString 插入换行符

java pdf itext 水印 怎么做到 汉字水印 平铺或者换行 不想每页只插入一行水印