使用 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。现在,当我使用 getTemplateSizeuseTemplate 函数设置 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/FPDFs PageSizes 数组中创建条目(参见 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']]);

【讨论】:

这可行,但我需要使用widthheight 作为索引而不是wh。因此,如果您遇到未定义的索引错误,您知道该怎么做。 我使用的是 fpdi 1.6.2。这个答案对于旧版本的 fpdi 也很有用。谢谢!

以上是关于使用 FPDI+TCPD 导入的 PDF 模板的大小问题的主要内容,如果未能解决你的问题,请参考以下文章

保留 PDF 表单域

如何使用 FPDF/FPDI 获得精确修改的 PDF?

PDFMerger 与 FPDI-PDF-PARSER

使用 FPDI 加载到 TCPDF 时调整 PDF 大小

支持 PDF 版本高于 1.4 的 FPDI 免费解析器

在 PHP 中使用 FPDI 在页面上生成多个 pdf