使用 FPDI+TCPD 导入的 PDF 模板的大小问题
Posted
技术标签:
【中文标题】使用 FPDI+TCPD 导入的 PDF 模板的大小问题【英文标题】:Problem with size of the imported PDF template with FPDI+TCPDF 【发布时间】:2011-10-04 05:20:48 【问题描述】:我陷入了一个非常复杂的境地。 我正在开发用于贺卡的 php Web 应用程序。
为此,我使用了一些 Linux 工具以及 TCPDF 和 FPDI。 让我告诉你这一切是如何运作的:
有 4 页贺卡模板 PDF 文件。这是自定义大小的 5x7 英寸 300dpi PDF 文件。 我也在 TCPDF 中添加了自定义大小
case 'STANDARD_CARD' : $pf = array(1500.00,2100.00);break;
我所做的是,我使用:
pdftk templateX.pdf burst output page_%2d.pdf
将寺庙的每一页分开。
现在我使用:
$pdf = new FPDI($cardDetails['ORIENTATION'],"mm",$cardDetails['SIZE']);
//set source file for
$pdf->setSourceFile($pdfFile);
$templateIndex = $pdf->importPage(1);
$pdf->AddPage($cardDetails['ORIENTATION'],$cardDetails['SIZE']);
$pdf->useTemplate($templateIndex,0,0);
其他的事情,比如写消息打印图像。最后保存文件使用:
$pdf->output("file_name.pdf","F");
原始 PDF 文件(仅第一页):(5x7 英寸) Original pdf file 修改后的PDF和一些PDF操作:(29x20英寸) modified PDF
现在我得到的输出不是 5x7 pdf,而是 29 x 20 英寸的文件,这也破坏了我的计算和 PDF。
请告诉我我做错了什么......
【问题讨论】:
$cardDetails
的内容是什么?
$cardDetails 包含卡片大小和方向 code
$cardDetails['ORIENTATION'] = 'L'; $cardDetails['SIZE'] = 'STANDARD_CARD'; code
STANDARD_CARD 的大小在 TCPDF 类中被污染为 code
case 'STANDARD_CARD' : $pf = array(360.00,504.00);break; code
好吧,我的问题解决了(在某种程度上,不是100%)我想将 pdf 的大小设置为导入的 PDF 的大小,比如导入的 pdf 是 5.27 X 7.1。然后相应地设置大小。但是,没有运气,只是一些可行的解决方案,不是 100%,但是,似乎对我有用......
【参考方案1】:
嗨,拉维什,
我也遇到过这个问题。其实我的情况是这样的。我有一个法定尺寸 (8.5mm x 14mmmm) 的原始文件。当我像您一样使用 FPDI 输出显示它时,它只显示 字母大小(8.5mm x 11mm)。所以结果是:CROPPED PDF 文件。
我做了几次谷歌搜索,也从不同的帖子中找到了几个答案。这是我找到的最相关的解决方案。
首先是下面这段函数代码:useTemplate
$this->useTemplate($templateIndex, null, null, 0, 0, true);
通常,一些开发人员将最后一个参数设置为 TRUE。是的,如果你不设置宽度和长度是正确的。但是,我想强调的是,第 4 和第 5 个参数指定了导入的 PDF 的宽度和长度。因此,如果您将采用或获取导入文档的实际大小,请将最后一个参数设置为 FALSE,因为这将表明它将采用您设置的实际或特定大小。
请使用我做的这个示例代码:
$pdf = new FPDI();
$pdf -> setSourceFile('birform2316.pdf');
$tplIdx = $pdf -> importPage(1);
$size = $pdf->getTemplateSize($tplIdx);
$pdf -> AddPage();
$pdf ->useTemplate($tplIdx, null, null, $size['w'], 310, FALSE);
$pdf -> SetFont('Arial');
$pdf -> SetTextColor(0, 0, 0);
$pdf -> SetXY(18, 174);
$pdf -> Write(0, $employer_address);
$pdf -> Output('myOwn.pdf', 'D');
使用此代码,我生成了一个新的 PDF 不裁剪我设置的导入文件。意思是,模板的所有详细信息(原始文件)已显示。
另请注意,我在设置 PDF 的大小时观察到了一些东西:
首先,我的文件的原始宽度为 215.6mm,长度为 350.9mm。现在,当我使用 getTemplateSize 和 useTemplate 函数设置 PDF 的大小时,例如:
$size = $pdf->getTemplateSize($tplIdx);
$pdf ->useTemplate($tplIdx, null, null, $size['w'], $size['h'],FALSE);
或者简单地说:
$pdf ->useTemplate($tplIdx, null, null, 215.6, 350.9,FALSE);
结果是,我的新 PDF 文件在底部被CROPPED,我不知道为什么。
有了这个观察,我做了几个测试来找出原因。得出的结果是,使用 FPDI 生成 PDF 文件时存在长度限制。正如您在上面的代码中看到的那样,我没有使用文件的实际长度。我没有使用可以从$size[h']
派生的 350.9mm,而是没有使用它,因为它会给出一个裁剪的文件。我只是传递了一个接近它的数值和实际宽度以产生所需的结果。
$pdf->useTemplate($tplIdx, null, null, $size['w'], 310, false);
顺便说一句,310 毫米(长度)是我用来生成未裁剪的新 PDF 文件的最大数值。
我希望我已经为所有使用 FPDI 遇到 CROPPED PDF 结果问题的开发人员提供了一些意见。
谢谢大家...
李维斯帕默
【讨论】:
页面被裁剪的原因是,只要页面的方向和大小都没有变化,就不会在 FPDIs/FPDFsPageSizes
数组中创建条目(参见 source code)。由于 $size
数组包含浮点值,它只需手动将宽度或高度的整数传递给 useTemplate()
,因为浮点数和整数之间的差异被识别为更改的页面大小,因此添加了一个条目PageSizes
.【参考方案2】:
代替
$pdf->useTemplate($templateIndex,0,0);
使用
$this->useTemplate($templateIndex, null, null, 0, 0, true);
最后一个参数$adjustPageSize
默认设置为'false'。
【讨论】:
谢谢!我遇到了同样的问题。你有空值的地方,我有 0。用空值替换它们就可以了! 如果您对任何参数使用零,较新版本会报错,因此请使用所有空值,$this->useTemplate($templateIndex, null, null, null, null, true);
【参考方案3】:
我有同样的问题。我的 pdf 是从右侧裁剪的,FDPI 从底部开始添加空间。 我发现我的 pdf 的 width=215 和 height=279,而 FPDI 每次都导出 210x297。
useTemplate
函数可以将您的 pdf 缩放到特定大小,但输出仍将保持 210x297。
所以我将 useTemplate 保留为默认值和“adjustPageSize”=true:
$pdf->useTemplate($templateId, 0, 0, 0, 0, true);
需要改变的是输出尺寸,以匹配原始尺寸:
$templateSize = $pdf->getTemplateSize($templateId);
$pdf->AddPage('', [$templateSize['w'], $templateSize['h']]);
如果你要上传横向的 pdf,你必须设置方向:
$templateSize = $pdf->getTemplateSize($templateId);
$orientation = $templateSize['w'] > $templateSize['h'] ? 'L' : 'P';
$pdf->AddPage($orientation, [$templateSize['w'], $templateSize['h']]);
【讨论】:
这可行,但我需要使用width
和height
作为索引而不是w
和h
。因此,如果您遇到未定义的索引错误,您知道该怎么做。
我使用的是 fpdi 1.6.2。这个答案对于旧版本的 fpdi 也很有用。谢谢!以上是关于使用 FPDI+TCPD 导入的 PDF 模板的大小问题的主要内容,如果未能解决你的问题,请参考以下文章