2014-08-31 1 views
1

То, что я пытаюсь выполнить, - это заполнение формы PDF с помощью PHP.
Я пробовал много способов, я обнаружил, что FPDM (FPDF) работает хорошо, когда я создаю новую форму, или использую форму из исходного файла, который они предоставили.
Моя проблема в том, что я использую уже созданную форму PDF, форма имеет такие ограничения, как пароль владельца, документ подписан и сертифицирован. Я использовал приложение, чтобы удалить эти ограничения, некоторые из них остались. На рисунке ниже вы можете увидеть, как выглядит мой текущий PDF-документ.Жилье в формате PDF с FPDM

enter image description here

Это PDF также был сжат, и потому FPDM бросает ошибку, что «объект потока» не поддерживается Я распакованы через Pdftk, поэтому файл изменился с 1,48 Мб до 6,78 Мб.

Чтобы получить все имена полей формы, я использовал также PDFTK, поэтому у меня есть их в txt-файле.

Есть два способа я могу сделать по поручению FPDM:

Первый способ только для отправки массива поле_формов => значения наряду с PDF Я хочу изменить, и это все. Поэтому, когда я использую PDF описано выше, я получаю ошибку:

'FPDF-Merge. Ошибка: поле form1 [0] # подчиненной [0] .Line1_GivenName [0] не найден'

Напомним, что у меня есть все имена и это имя существует.

<?php 
require('fpdm.php'); 

$fields = array(
     'form1[0].#subform[0].Line1_GivenName[0]' => 'my name' 
    ); 
$pdf = new FPDM('test.pdf'); 
$pdf->Load($fields, false); // second parameter: false if field values are in ISO-8859-  1, true if UTF-8 
$pdf->Merge(); 
$pdf->Output('new_pdf.pdf', 'F'); 
?> 

Другой способ заключается в том, что я создаю FDF файл с функцией createXFDF, а затем использовать FPDM слиться FDF в формате PDF. Это решение создает «new_file.pdf», как я хочу, но пустой :)

function createXFDF($file, $info, $enc = 'UTF-8') { 
$data = '<?xml version="1.0" encoding="'.$enc.'"?>' . "\n" . 
    '<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">' . "\n" . 
    '<fields>' . "\n"; 
foreach($info as $field => $val) { 
    $data .= '<field name="' . $field . '">' . "\n"; 
    if(is_array($val)) { 
     foreach($val as $opt) 
      $data .= '<value>' . 
       htmlentities($opt, ENT_COMPAT, $enc) . 
       '</value>' . "\n"; 
    } else { 
     $data .= '<value>' . 
      htmlentities($val, ENT_COMPAT, $enc) . 
      '</value>' . "\n"; 
    } 
    $data .= '</field>' . "\n"; 
} 
$data .= '</fields>' . "\n" . 
    '<ids original="' . md5($file) . '" modified="' . 
     time() . '" />' . "\n" . 
    '<f href="' . $file . '" />' . "\n" . 
    '</xfdf>' . "\n"; 

return $data; 
} 


require('fpdm.php'); 

$pdf = new FPDM('test.pdf', 'posted-0.fdf'); 
$pdf->Merge(); 
$pdf->Output('new_file.pdf', 'F'); 

Еще одна вещь, если я пытаюсь открыть файл FDF в Acrobat я получаю сообщение

«Файл, который вы пытаетесь open содержит комментарии или данные формы, которые должны быть помещены в test.pdf. Этот документ не найден. Возможно, это было перемещено или удалено. Хотели бы вы попытаться найти этот документ?

но файл отсутствует, не перемещается и не удаляется. Когда я нахожу его вручную, эта форма заполняется.

Если у кого-то есть опыт с этим, любая помощь или совет помогут много.

Спасибо заранее, Vukašin

EDIT: Более подробную информацию о файле PDF enter image description here

+0

Этот существующий PDF, каковы записи для PDF-продюсера и программного обеспечения для создания документов? (можно найти на вкладке «Описание» свойств документа). –

+0

Что происходит, когда вы вводите абсолютный путь целевого PDF-файла в XFDF? Что происходит, когда вы следуете рекомендациям Acrobat и находите целевой PDF-файл при открытии XFDF? Что происходит, когда вы активно импортируете XFDF в уже открытый целевой PDF? –

+0

Макс Wyss благодарит вас за ответ. Взгляните на мое редактирование вопроса. Thx – Wolf87

ответ

2

После раскрытия информации создателя/продюсера проблема ясна.

У вас нет реальной формы в формате PDF, но у вас есть форма XFA (созданная LiveCycle Designer), завернутая в оболочку PDF, чтобы Adobe Reader мог ее отображать.

Формы XFA не поддерживают (X) FDF. Им нужно импортировать данные с помощью XML. Вы можете попытаться экспортировать данные из заполненной версии, а затем использовать это как образец для создания XML-импорта.

Обратите внимание, что форма XFA-форматов экспорта/импорта XML не совпадает с XFDF (это просто XML-представление FDF, формата данных в формате PDF).

+0

Спасибо за ответ, я отмечу это как принятое, потому что на какие-то ответы на мой вопрос. Я попытался удалить xfa в PDFTK после этого [учебник] (http://beau-ford.blogspot.com/2011/02/convert-livecycle-form-back-to-acrobat.html), но все же я не могу заставить его работать, создатель все тот же, и у меня такие же проблемы, как и выше. Знаете ли вы, как я могу объединить XML в XFA? Еще раз спасибо – Wolf87

1

Я провел больше, чем целый день, работая над проблемами с FPDM, и мне было трудно найти кого-то, у кого были подобные проблемы.

The following format worked for me: PDF 1.4 (Acrobat 5). I had to actually go to Save As -> choose Adobe PDF Optimized, then click the Settings button. From there I had to choose the version from the drop-down/fly-out menu.

Я получил ошибку: «несовместим с быстрым просмотром веб-страниц» или аналогичным. Если в параметре «Оптимизированные PDF-параметры» вы нажимаете «Очистить» на левой стороне, вы можете развернуть быстрый просмотр в Интернете.

Теперь я получаю сообщение об ошибке, ошибка слияния PDF: поле «имя поля» не найдено. Когда я запускаю его через pdftk, надеясь разрешить это, я получаю сообщение об ошибке: FPDF-Merge Error: количество объектов (35) отличается от числа xrefs (36), что-то, таблица pdf xref повреждена :(

To решить эту проблему, я должен был загрузить и установить серверную утилиту Pdftk на убунту

sudo apt-get install pdftk 

После установки, я запустил эту команду, чтобы восстановить поврежденные XREF таблицы и потоковые длины в формате PDF в, если это возможно:

pdftk broken.pdf output fixed.pdf 

Когда я открываю файл fixed.pdf, он не имеет никаких проблем и заполняет поля правильно. Аллилуйя это была самая неприятная проблема в мире. Подводя итог, я должен был взять PDF и поставить его через следующие шаги:

  • Edit PDF предпочтению
  • Save As> .pdf оптимизировано> Настройки> Acrobat 5> снимите флажок быстрый веб-под очистки
  • Открыть файл в Pdftk и пересохраните
  • установки командной строки Pdftk через убунт
  • команды запуска: Pdftk выхода broken.pdf fixed.pdf

сделано.

1

Благодаря ответу Кайла я решил аналогичную проблему.

У меня есть pdf, созданный в Adobe Acrobat Pro DC, и вам нужно заполнить его поля формы с веб-входа.

На моей машине для разработки я создал файл fdf из своих данных в форме веб-формы и объединил его в pdf, используя pdftk (вызванный из php с exec()).

Но я не мог поместить это на облачный веб-сервер linux, где размещен мой сайт, потому что он требует устаревших библиотек.

Так что я перешел на FPDM и имел следующие ошибки:

'Режим Fast Web View не поддерживается. Я исправил это, установив предпочтения в «сохранить как» в Adobe Acrobat Pro (сохранить как -> pdf оптимизировано -> настройки -> очистить -> снять флажок Fast Web View).

«Объектные потоки не поддерживаются» - исправлено в «Сохранить как» предпочтения (очистить -> параметры сжатия объекта -> удалить сжатие).

«Инкрементные обновления не поддерживаются» - снова исправлено использование «save as» в Acrobat.

Затем FPDM работал, но не мог прочитать имена полей.

One-Step Решение:

Возьмите исходный файл PDF - с возрастающими обновлений, сжатие объекта и быстрый веб-просмотра - и передать его через Pdftk на Windows, точно так, как описывает Кайл.

> pdftk broken.pdf output fixed.pdf 

Теперь FPDM правильно заполняет поля из файла fdf.

+0

рад, что я мог бы помочь, поздравляю вас с первым вкладом, добро пожаловать в stackoverflow! –