首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mikehaertl\php-pdftk库操作PDF,当首先调用getDataFields时,链接命令将失败。

使用mikehaertl\php-pdftk库操作PDF,当首先调用getDataFields时,链接命令将失败。
EN

Stack Overflow用户
提问于 2018-10-11 18:54:16
回答 1查看 2.3K关注 0票数 3

为了填充PDF字段,我尝试在mikehaertl\php-pdftk\pdf对象周围创建一个包装类。当试图通过文档链接命令时,pdf无法正确地执行第二个命令(或在第一个命令之后的任何命令)。看起来,这似乎是底层临时文件处理和tmep文件在我查看临时文件夹时未被写入的问题。当我调试时,临时文件就在那里,但大小为0。

示例代码演示了问题

代码语言:javascript
复制
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对象并管理我自己的临时文件,我只是希望更多地利用类的功能,而不必做那么多平凡的事情。这个功能是坏了,还是我不正确地使用它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-12 20:27:28

在深入研究了mikehaertl\php-pdftk\pdf包装的PDFTK库并阅读了关于字段选项的文档之后,我想出了一些跟踪观察:

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

溶液

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

这里有一个妖魔化的例子:

代码语言:javascript
复制
<?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);
        }
    }
}

希望这能帮到别人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52767092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档