为了填充PDF字段,我尝试在mikehaertl\php-pdftk\pdf对象周围创建一个包装类。当试图通过文档链接命令时,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对象并管理我自己的临时文件,我只是希望更多地利用类的功能,而不必做那么多平凡的事情。这个功能是坏了,还是我不正确地使用它?
发布于 2018-10-12 20:27:28
在深入研究了mikehaertl\php-pdftk\pdf包装的PDFTK库并阅读了关于字段选项的文档之后,我想出了一些跟踪观察:
溶液
当我调用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);
}
}
}希望这能帮到别人。
https://stackoverflow.com/questions/52767092
复制相似问题