я использую pdftk
библиотека для извлечения полей формы из PDF. Все работает нормально, за исключением одной проблемы, которую я получил PDF-файл ссылка на файл PDF. которая вызывает ошибку, приведена ниже
Error: Failed to open PDF file:
http://www.uscis.gov/sites/default/files/files/form/i-9.pdf
Done. Input errors, so no output created.
Команда для этого
root@ri8-MS-7788:/home/ri-8# pdftk http://192.168.1.43/form/i-9.pdf dump_data_fields
та же команда работает для всех других форм.
Attempt1
Я пытался зашифровать PDF в небезопасную версию, но он выдает ту же ошибку. вот команда
pdftk http://192.168.1.43/forms/i-9.pdf input_pw foopass output /var/www/forms/un-i-9.pdf
Обновить
это моя полная функция, чтобы справиться с этим
public function Formanalysis($pdfname)
{
$pdffile=Yii::app()->getBaseUrl(true).'/uploads/forms/'.$pdfname;
exec("pdftk ".$pdffile." dump_data_fields 2>&1", $output,$retval);
//got an error for some pdf if these are secure
if(strpos($output[0],'Error') !== false)
{
$unsafepdf=Yii::getPathOfAlias('webroot').'/uploads/forms/un-'.$pdfname;
//echo "pdftk ".$pdffile." input_pw foopass output ".$unsafepdf;
exec("pdftk ".$pdffile." input_pw foopass output ".$unsafepdf);
exec("pdftk ".$unsafepdf." dump_data_fields 2>&1", $outputunsafe,$retval);
return $outputunsafe ;
//$response=array('0'=>'error','error'=>$output[0]);
//return $response;
}
//if (strpos($output[0],'Error') !== false){ echo "error to run" ; } // this is the option to handle error
return $output;
}
это может быть небольшим хитрым решением, но оно должно работать для вас. как @bruno сказал, что это зашифрованный файл. Вы должны расшифровать это, прежде чем использовать для pdftk
, Для этого я нашел способ расшифровать это qpdf
бесплатная исходная библиотека opem для расшифровки pdf, удаления паролей владельца и пользователя и т. д. и многого другого. Вы можете найти это здесь Qpdf. установите его в своей системе. и запустите эту команду
qpdf --decrypt input.pdf output.pdf
затем используйте выходной файл в pdftk
командование он должен работать .
PdfTk это инструмент, который был создан путем компиляции устаревшая версия iText в исполняемый файл с использованием компилятора GNU для Java (GCJ) (PdfTk не поддерживается iText Group NV).
Я проверил ваш PDF, и в нем используются две технологии, которые не поддерживались iText во время создания PdfTk: XFA и сжатые таблицы перекрестных ссылок.
Последнее то, что вызывает вашу проблему. PdfTk ожидает, что ваш файл заканчивается так:
xref
0 7
0000000000 65535 f
0000000258 00000 n
0000000015 00000 n
0000000346 00000 n
0000000146 00000 n
0000000397 00000 n
0000000442 00000 n
trailer
<</ID [<c8bf0ac531b0fc7b5b9ec5daf0296834><ec4dde54d00305ebbec62f3f6bbca974>]/Root 5 0 R/Size 7/Info 6 0 R>>
%iText-5.4.3
startxref
595
%%EOF
В этом фрагменте startxref
отмечает смещение байта xref
где начинается таблица перекрестных ссылок. Эта таблица содержит смещения байтов всех объектов в PDF.
Когда вы смотрите на PDF-файл, на который ссылаетесь, вы видите, что он заканчивается так:
64 0 obj
<</DecodeParms<</Columns 5/Predictor 12>>/Encrypt 972 0 R/Filter/FlateDecode/ID[<85C47EA3EFE49E4CB0F087350055FDDC><C3F1748360D0464FBA02D711DE864630>]/Info 970 0 R/Length 283/Root 973 0 R/Size 971/Type/XRef/W[1 3 1]>>stream
hÞìÒ±JQЙ·»7J¢©ÕØ(Xþ„ù »h%¤É¤¶”€mZ+;ÁN,,ÁÆ6 XÁ&‚("î½YŒI‘Bî‡áμ]ö1Áð÷³cfþ‹ûÐÚLî`z„Ýôœùw÷N×X?ÙkNv`hÁÒj¦G[œiÀå»›œ?b½Än…ÉëàÍþ gY—i7WW‡òj®îÍ°u¸Ò‡Ñ:óÆÛ™ñÎë&'×݈§ü†ù!ÿñ€ù%,\ácçÙ9˜ì±Þ€S¼Ãd—‰Áy~×.ø¶Åìþßn_˜$9Ôüw£X9#åxzçgRüüóÙwÝ¡œÄNJ©½’Ú+©½’R{%µWR{%ÿ·á”;`_ z6Ø
endstream
endobj
startxref
116
%%EOF
В этом случае, startxref
по-прежнему ссылается на начало первой таблицы перекрестных ссылок (это линеаризованный PDF), но таблица перекрестных ссылок хранится внутри объекта, и этот объект сжимается (см. тарабарщину между stream
а также endstream
ключевые слова).
Сжатые таблицы перекрестных ссылок и сжатые объекты были представлены в PDF 1.5 (2003), но они не поддерживаются PdfTk. Вам нужно будет найти инструмент, который может работать с такими потоками (например, недавнюю версию iText, которая по сравнению с PdfTk — реальная вещь), или вам нужно сохранить PDF как PDF 1.4, прежде чем обрабатывать его с помощью PdfTk. (но вы потеряете XFA, потому что XFA был также представлен в PDF 1.5).
Обновить:
Поскольку вы спрашиваете о полях формы, я добавляю следующее вложение:
Этот скриншот был сделан с помощью iText RUPS (что доказывает, что iText может открыть документ). Справа вы видите, что одна и та же форма определяется дважды:
Если бы вы пошли вниз по дереву под Fields
, вы найдете все поля, которые хранятся в PDF, используя технологию AcroForm. Слева вы можете увидеть описание такого поля:
Если вы посмотрите под XFA, вы заметите, что та же форма также определяется с использованием архитектуры форм XML. Если вы нажмете на datasets
Вы видите XML-описание набора данных в нижней панели:
Ко всей этой информации можно получить программный доступ с помощью iText (Java) или iTextSharp (C #). PdfTk — это просто инструмент, основанный на очень старой версии этой технологии.