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

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

1 Ответ

0 голосов
/ 12 октября 2018

После более глубокого изучения библиотеки 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);
        }
    }
}

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

...