基本问题:在将MultiCell放入文档之前是否可以确定它的高度?
原因:我的任务是创建表单的PDF版本。此表单允许文本输入,结果可变长度。一个人我没有输入任何东西,另一个人可能会写几段。 “那些力量”不希望这些文本在页面之间打破。
目前,在放置每个块之后,我检查页面上的位置,如果我接近结束,我会创建一个新页面。
if($this->getY() >= 250) {
$this->AddPage('P');
}
在大多数情况下,这是有效的。但是有一些偷偷摸摸的进来,比如249,然后有大量的文字。在放置它之前确定块的高度似乎更有意义,看它是否真的适合页面。
肯定有办法做到这一点,但谷歌搜索并没有证明是非常有用的。
编辑以澄清:在提交表单后生成PDF。不是一个活跃的,可编辑的PDF表单......
答案 0 :(得分:7)
获得这个问题的风滚草徽章。 :(无论如何,在有机会有同样问题的情况下,我想我会回答我的所作所为。我怀疑这是最有效的方法,但它完成了工作。
首先,我创建了两个FPDF对象;一个永远不会得到输出的临时文件,以及最终用户将看到的最终完整的PDF文件。
我在两个对象中获得当前的Y坐标。然后,我使用Cell()或MultiCell()(对于此形式,通常是两者的组合)将数据块放入临时对象,然后检查新的Y坐标。然后我可以做数学来确定块的高度。注意,如果块在页面中断,数学可以变得有点时髦。请记住将上下边距考虑在内。
现在我知道一个块的高度,我可以获取目标对象的当前Y坐标,从页面的总高度减去它(减去下边距)以获得我的可用空间。如果块适合,请将其放置,如果没有,则添加页面并将其放在顶部。
重复每个块。
我看到的唯一警告是,如果任何单个块比整个页面长,但是使用这种形式,这种情况永远不会发生。 (着名的遗言......)
答案 1 :(得分:2)
另见https://gist.github.com/johnballantyne/4089627
DateTime AquariusStart = new DateTime(1900, 01, 20);
DateTime AquariusEnd = new DateTime(1900, 02, 18);
if (userBD.Month >= AquariusStart.Month &&
userBD.Month <= AquariusEnd.Month &&
userBD.Day >= AquariusStart.Day &&
userBD.Day <= AcquarisStart.Day)
{
Console.WriteLine("Your Star Sign is Aquarius!");
}
答案 2 :(得分:0)
除了JLuc的答案之外,这也是人们想象中的。但是,实现此功能并非易事,需要您扩展主fpdf类。
首先,如果您已经拥有扩展的fpdf,则可以仅复制JLuc的答案并跳过此步骤。如果没有,请像这样继续:
创建扩展FPDF的文件和类(将文件命名为您的类名):
<?php
namespace YourNameSpace\Library;
class FpdfExtended extends \FPDF {
...
}
如果不使用名称空间,则可以使用require。创建该文件后,从要点或此答案中插入GetMultiCellHeight。
现在,您需要使用最有可能满足要求的简单构造函数实例化扩展类。
use YourNameSpace\Library\FpdfExtended
...
$pdf = new FpdfExtended();
...
现在您可以简单地使用GetMultiCellHeight方法来确定下一个单元格的高度,如下所示:
$col1 = 'col 1 text without line break';
$col2 = 'col 2 text with line break \n and some more text';
// get next cell height
$nextHeight = $pdf->GetMultiCellHeight($width, $height, $col2);
$pdf->MultiCell($width, $nextHeight, $col1, 0, 'L', 1);
祝您好运,并且仍在使用FPDF编码可怜的人。
答案 3 :(得分:0)
我就是这样做的。我们正在多单元格中传递高度。那是$h。总高度为(行数 * $h)。因为 $h 是一行的高度。我们想知道总高度,所以总高度是 $totalLines * $h。