public function PdftkPdfBackend::parseFile in FillPDF 5.0.x
Same name and namespace in other branches
- 8.4 src/Plugin/PdfBackend/PdftkPdfBackend.php \Drupal\fillpdf\Plugin\PdfBackend\PdftkPdfBackend::parseFile()
Parse a PDF and return a list of its fields.
@todo Replace output array by a value object.
Parameters
\Drupal\file\FileInterface $template_file: The PDF template whose fields are to be parsed.
Return value
string[][] An array of associative arrays. Each sub-array contains a 'name' key with the name of the field and a 'type' key with the type. These can be iterated over and saved by the caller.
Overrides PdfBackendInterface::parseFile
See also
\Drupal\fillpdf\Plugin\PdfBackendInterface::parseStream()
1 call to PdftkPdfBackend::parseFile()
- PdftkPdfBackend::parseStream in src/
Plugin/ PdfBackend/ PdftkPdfBackend.php - Parse a PDF and return a list of its fields.
File
- src/
Plugin/ PdfBackend/ PdftkPdfBackend.php, line 107
Class
- PdftkPdfBackend
- Pdftk PdfBackend plugin.
Namespace
Drupal\fillpdf\Plugin\PdfBackendCode
public function parseFile(FileInterface $template_file) {
$template_uri = $template_file
->getFileUri();
$pdftk_path = $this
->getPdftkPath();
$status = FillPdf::checkPdftkPath($pdftk_path);
if ($status === FALSE) {
$this
->messenger()
->addError($this
->t('pdftk not properly installed.'));
return [];
}
// Escape the template's realpath.
$template_path = $this->shellManager
->escapeShellArg($this->fileSystem
->realpath($template_uri));
// Use exec() to call pdftk (because it will be easier to go line-by-line
// parsing the output) and pass $content via stdin. Retrieve the fields with
// dump_data_fields_utf8().
$output = [];
exec("{$pdftk_path} {$template_path} dump_data_fields_utf8", $output, $status);
if (count($output) === 0) {
$this
->messenger()
->addWarning($this
->t('PDF does not contain fillable fields.'));
return [];
}
// Build a simple map of dump_data_fields_utf8 keys to our own array keys.
$data_fields_map = [
'FieldType' => 'type',
'FieldName' => 'name',
'FieldFlags' => 'flags',
'FieldValue' => 'value',
'FieldJustification' => 'justification',
];
// Build the fields array.
$fields = [];
$fieldindex = -1;
foreach ($output as $lineitem) {
if ($lineitem == '---') {
$fieldindex++;
continue;
}
// Separate the data key from the data value.
list($key, $value) = explode(':', $lineitem);
if (in_array($key, array_keys($data_fields_map), NULL)) {
// Trim spaces.
$fields[$fieldindex][$data_fields_map[$key]] = trim($value);
}
}
return $fields;
}