Ошибка pdftk: не удалось открыть файл PDF:

Я использую библиотеку 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

та же команда работает для всех других форм.

Попытка 1

Я пытался зашифровать 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;

    }

person Manoj Dhiman    schedule 15.05.2015    source источник
comment
вы можете использовать pdftk, только обратите внимание на следующие детали: 1 = загрузите и используйте последнюю сборку или скомпилируйте с pdflabs.com/docs/pdftk-version-history; 2 = к этому PDF-файлу применены ограничения (пароль владельца); вам нужно снять ограничения, прежде чем использовать pdftk. вы можете сделать это с помощью qpdf qpdf.sourceforge.net qpdf --decrypt *.pdf output.pdf, тогда вы можете без проблем использовать pdftk   -  person Dingo    schedule 16.05.2015
comment
на самом деле только очень старые сборки (pdftk 1.41) не имеют поддержки pdf версии›1.4/1.5, более новые полностью поддерживают эти версии и выше   -  person Dingo    schedule 16.05.2015


Ответы (2)


это может быть небольшое хитрое решение, но оно должно сработать для вас. как @bruno сказал, что это зашифрованный файл. Вы должны расшифровать это, прежде чем использовать для pdftk . Для этого я нашел способ расшифровки, который представляет собой qpdf бесплатную исходную библиотеку opem для расшифровки pdf, удаления паролей владельца и пользователя и т. д. и многое другое. Вы можете найти это здесь Qpdf. установите его в своей системе. и запустите эту команду

qpdf --decrypt input.pdf output.pdf

затем используйте выходной файл в команде pdftk. он должен работать .

person manoj dhiman    schedule 17.05.2015
comment
Где, по словам Бруно, документ был зашифрован? - person David van Driessche; 17.05.2015
comment
Эта расшифровка, похоже, сработала, когда я выполнил проблемный дочерний файл Word PDF, который я пытаюсь объединить с некоторыми другими файлами PDF. - person ryanjdillon; 25.06.2021

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 — это просто инструмент, основанный на очень старой версии этой технологии.

person Bruno Lowagie    schedule 15.05.2015
comment
не могли бы вы сослаться на библиотеку для этого - person Manoj Dhiman; 15.05.2015
comment
Я упомянул iText, который доступен на Java и C#. Как я объяснил: вы уже используете устаревшую версию iText, когда используете PdfTk. Последние версии файлов поддержки iText со сжатыми таблицами перекрестных ссылок. Я добавлю снимок экрана iText RUPS к своему ответу. - person Bruno Lowagie; 15.05.2015
comment
могу ли я использовать itext с php?? - person Manoj Dhiman; 15.05.2015