Используя библиотеку mikehaertl \ php-pdftk для управления PDF-файлами, команды цепочки завершаются неудачно, когда сначала вызывается getDataFields

Я пытаюсь создать класс-оболочку вокруг mikehaertl \ PHP-Pdftk \ PDF Объект для заполнения полей формы 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 для каждого действия и управляю своим собственным временным файлом, я просто надеялся воспользоваться функциональностью классов чуть больше и не должен был делать так много мирского. Эта функция нарушена или я ее неправильно использую?

0

Решение

Посмотрев глубже в Библиотека PDFTK который mikehaertl \ php-pdftk \ pdf переносит и читает документацию на 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);
}
}
}

Надеюсь, это может помочь кому-то еще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]