Заполнение поля FieldType: Choice с несколькими вариантами с использованием FDF через Pdftk в PHP - PullRequest
2 голосов
/ 24 августа 2010

Я использую Pdftk и pdftk-php (который основан на forge-fdf). Я хотел бы создать FDF, который можно объединить с PDF, чтобы заполнить раскрывающееся текстовое поле с несколькими параметрами. По умолчанию pdftk-php работает, он будет заполнять выпадающие списки только одним значением; передача этого массива не работает.

Вот соответствующий вывод из имени файла pdftk dump_data_fields.

FieldType: Choice
FieldName: VehicleIDData1
FieldFlags: 4587520
FieldJustification: Left

Согласно этому примеру из спецификации PDF 1.2 для раскрывающихся списков требуется опция / Opt в FDF.

%FDF-1.2
1 0 obj <<
/FDF <<
/Fields
[
<<
/T (My Children)
/V (Tali)
/Opt [(Maya) (Adam) (Tali)]
November 12, 1996
: 379
>>
]
/F (Dependents.pdf)
>>
>>
endobj
trailer
<</Root 1 0 R>>
%%EOF

Это поддерживается таблицей на стр. 717 в спецификации 1.7

Opt
array
(Required; choice fields only) An array of options to be presented to the user. Each element of the array can take either of two forms:
•A text string representing one of the available options
•A two-element array consisting of a text string representing one of the available options and a default appearance string for constructing the item’s appearance dynamically at viewing time (see “Variable Text” on page 677)

pdftk-php не использует / Opt; если вы передадите ему массив значений для поля, оно будет использовать / Kids, которое не заполняет другие выпадающие записи. Я попытался изменить программу, чтобы вместо нее использовать / Opt, но в полученных PDF-файлах нет никакой разницы. Что я делаю не так?

protected function forge_fdf_fields( &$fdf,
          &$fdf_data,
          &$fields_hidden,
          &$fields_readonly,
          $accumulated_name,
          $strings_b ) // true <==> $fdf_data contains string data
    //
    // string data is used for text fields, combo boxes and list boxes;
    // name data is used for checkboxes and radio buttons, and
    // /Yes and /Off are commonly used for true and false
{
    if( 0< strlen( $accumulated_name ) ) {
        $accumulated_name.= '.'; // append period seperator
    }

    foreach( $fdf_data as $key => $value ) {
    // we use string casts to prevent numeric strings from being silently converted to numbers
        $fdf.= "<< "; // open dictionary

        if( gettype($value)== 'array' ) { // parent; recurse
            $fdf.= "/T (".$this->escape_pdf_string( (string)$key ).") "; // partial field name
            $fdf .= "/V (" . $this->escape_pdf_string((string)$value[0]) . ") ";

            $fdf .= "/Opt [";
            foreach ($value as $option) {
                $fdf .= "(" . $this->escape_pdf_string((string)$option) . ") ";
            }

            /* This is the older code I'm replacing.
            $fdf.= "/Kids [ ";                                    // open Kids array

            // recurse
            $this->forge_fdf_fields( $fdf,
                $value,
                $fields_hidden,
                $fields_readonly,
                $accumulated_name. (string)$key,
                $strings_b );
            */

            $fdf.= "] "; // close Kids array
        } else {

            // field name
            $fdf.= "/T (".$this->escape_pdf_string( (string)$key ).") ";

            // field value
            if( $strings_b ) { // string
                $fdf.= "/V (".$this->escape_pdf_string( (string)$value ).") ";
            }
            else { // name
                $fdf.= "/V /".$this->escape_pdf_name( (string)$value ). " ";
            }

            // field flags
            $this->forge_fdf_fields_flags( $fdf,
                        $accumulated_name. (string)$key,
                        $fields_hidden,
                        $fields_readonly );
        }
        $fdf.= ">> \x0d"; // close dictionary
    }
}

1 Ответ

1 голос
/ 11 сентября 2014

Меня очень заинтересовал бы ответ:)

Я пытаюсь заполнить это поле:

FieldType: Button
FieldName: conséquences
FieldFlags: 0
FieldValue: avec arr&#234;t
FieldJustification: Left
FieldStateOption: Off
FieldStateOption: avec arr&#234;t
FieldStateOption: deces
FieldStateOption: sans arr&#234;t

Когда я заполняю php-pdftk:

$pdf->fillForm(
    array(
         'conséquences' => 'avec arrêt'
    )
);

Это не работает.Ни с 'avec arr&#234 ;t'.Но это работает с 'deces'.

В чем проблема?

...