使用mikehaertl \ php-pdftk库处理PDF,第一次调用getDataFields时,链接命令失败

c0pp3rt0p

我正在尝试围绕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对象并管理自己的临时文件,我只是希望更多地利用类功能,而不必做太多平凡的事情。此功能是否损坏,或者我使用不正确?

c0pp3rt0p

在深入研究mikehaertl \ php-pdftk \ pdf包装PDFTK库并阅读关于dump_data_fields选项的文档后,我提出了以下意见:

  1. PDFTK不会为dump_data_fields命令生成输出文件
  2. 调用getDataFields时,php-pdftk类确实创建了基础的临时文件,但是它是空的并且保持这种方式。
  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);
        }
    }
}

希望这可以帮助其他人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Mikehaertl的WkHtmlToPdf创建风景PDF

使用itextsharp生成的PDF在第一次打印命令时出现错误

使用 mikehaertl/phpwkhtmltopdf

mysql php脚本只能在第一次使用

第一次单击后如何使用AJAX / JQUERY和PHP使按钮可重用

NSURLConnection不调用方法(第一次使用)

php stream_socket_client的第一次调用花费的时间太长

用户第一次使用 Laravel PWA 登录成功时如何处理身份验证?

第一次使用Mockito

Laravel - 第一次使用

第一次使用MVC

第一次使用 FOR

第一次调用 require() 时,node js 会做缓存吗?使用 Next.js

AJAX / PHP投票系统:第一次单击时内容未更新

仅在第一次登录 PHP 时执行代码

查找未传入数组 PHP 的第一次

第一次尝试php Joomla!插入

第一次使用 Flask 创建网站时,我不断提出“错误:创建数据库时没有这样的命令 'init-db'

第一次“使用”后,JTextField的动作侦听器失败

应用程序内购买第一次使用沙箱失败,下次工作正常

Django Heroku 推送在第一次后因 Grep 使用错误而失败

在PHP三元操作中两次使用某个函数时,该函数将被调用一次?

当我使用switch语句时,useEffect仅在第一次渲染时触发

Swift viewWillAppear第一次没有使用TabBarController调用

使用对象作为查找表:第一次调用后值不会更新

PHP OPP-我第一次尝试在数据库上进行连接

一次使用某些库时的歧义调用

如何在第一次警告时使用 tryCatch 退出 for 循环?

想要仅在第一次使用sed替换字符串时