gpt4 book ai didi

php - 使用 mikehaertl\php-pdftk 库处理 PDF,当首先调用 getDataFields 时链接命令失败

转载 作者:行者123 更新时间:2023-12-04 15:53:47 32 4
gpt4 key购买 nike

我正在尝试围绕 mikehaertl\php-pdftk\pdf 创建一个包装器类用于填充 PDF 表单域的对象。尝试通过 documentation 链接命令时pdf 无法正确执行第二个命令(或第一个命令之后的任何命令)。看起来这是底层临时文件处理的问题,当我查看我的临时文件夹时,tmep 文件没有被写出。在我调试时,临时文件就在那里,但大小为 0。

演示问题的示例代码

use mikehaertl\pdftk\Pdf;
class PDFTKTest extends TestCase
{
public function testPdfTkOperations()
{
$cmdPath = 'D:\PDFtk\bin\pdftk.exe';
$formPath = 'D:\test\sample_files\test.pdf';
$options = ['command' => $cmdPath];

$pdf = new Pdf($formPath, $options);

$this->assertNotNull($pdf);

//Get fields from PDF
$fields = $pdf->getDataFields();
$this->assertNotNull($fields);

//Set some field Values
$values = ['full_name' => 'John Q. Programmer'];
$pdf2 = new Pdf($pdf, $options); //chaining broken
//$pdf2 = new Pdf($formPath, $options); //works fine creating a new Pdf object
$this->assertNotNull($pdf2);

$res = $pdf2->fillForm($values)->execute();
//Next assertion fails using chaining
$this->assertTrue($res, "Execute failed: \n". $pdf2->getError());

//Get fields with the updates
$fields = $pdf2->getDataFields();
$this->assertNotNull($fields);
//Next assertion fails, getDataFields fails on a chained command
$this->assertGreaterThan(0, count($fields));
}
}

我有一个解决方法,我为每个操作使用单独的\Pdf 对象并管理我自己的临时文件,我只是希望更多地利用类功能而不必做那么多世俗的。此功能是否已损坏,还是我使用不当?

最佳答案

在深入了解 PDFTK library 之后which mikehaertl\php-pdftk\pdf wraps and reading the documentation on the dump_data_fields选项我想出了以下观察结果:

  1. PDFTK 不为 dump_data_fields 命令生成输出文件
  2. php-pdftk 类在调用 getDataFields 时确实创建了底层临时文件,但它是空的并保持原样。
  3. 当链接另一个 Pdf 对象时,它引用上一个命令中的空临时文件。问题就在这里。

解决方案

当我调用 getFieldData 时,我创建了一个新的 Pdf 对象并将其链接到前一个对象,但是我没有保存对该对象的引用。我只保存新链接的对象,如果它是创建实际输出的命令。

这是一个演示的例子:

<?php
use mikehaertl\pdftk\Pdf;

class PDFTKFormService
{
protected $pdf = null;

/**
* @return array|bool|\mikehaertl\pdftk\DataFields
*/
public function getDataFields()
{
//get data fields doesn't output a new file
//so we need to use the existing instance or create a new one and
$pdf = $this->getNextPdf();
$fields = $pdf->getDataFields();
if ($fields === false)
return [];
return $fields;
}

/**
* @param array $data
*
* @return resource The stream resource
*/
public function setDataFieldValues($data = [])
{
$this->pdf = $this->getNextPdf();
$this->pdf->fillForm($data)->execute();
}

protected function getNextPdf()
{
$options = ['command' => 'Path\To\PDFTK\binary'];

if ($this->pdf === null) {
return new Pdf($this->getTemplatePath(), $options);
} else {
return new Pdf($this->pdf, $options);
}
}
}

希望这可以帮助其他人。

关于php - 使用 mikehaertl\php-pdftk 库处理 PDF,当首先调用 getDataFields 时链接命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52767092/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com