【问题标题】:Using the mikehaertl\php-pdftk library for manipulating PDFs, chaining commands fails when getDataFields is called first使用 mikehaertl\php-pdftk 库来操作 PDF,首先调用 getDataFields 时链接命令失败
【发布时间】:2019-03-16 22:49:37
【问题描述】:

我正在尝试围绕mikehaertl\php-pdftk\pdf 对象创建一个包装类,以填充PDF 表单字段。当尝试通过documentation 链接命令时,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 对象并管理我自己的临时文件,我只是希望更多地利用类功能而不必做太多平凡的。此功能是否损坏,还是我使用不当?

【问题讨论】:

    标签: php pdftk php-pdftk


    【解决方案1】:

    在深入研究了 mikehaertl\php-pdftk\pdf 包装的 PDFTK library 并阅读了有关 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);
            }
        }
    }
    

    希望这可以帮助其他人。

    【讨论】:

    • 感谢您分享您的解决方案,并没有忘记您的自我问题。我的问题是 PDFTK 不想在临时文件夹中创建临时文件,因为权限共振但是临时文件夹具有 777 权限
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2013-09-16
    相关资源
    最近更新 更多