在 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】:我只是用“<br>
”标签替换了“\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
、<br/>
和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换行问题等问题