web-dev-qa-db-ja.com

pdftkエラー:PDFファイルを開くことができませんでした:

pdftkライブラリを使用してPDFからフォームフィールドを抽出しています。PDFファイルを取得したという1つの問題を除いて、すべてが正常に実行されています 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;

    }
9
Manoj Kumar

これはちょっとしたトリックの解決策かもしれませんが、あなたのために働くはずです。 @brunoが言ったように、これは暗号化されたファイルです。 pdftkに使用する前に、これを復号化する必要があります。このために、私はqpdfである復号化する方法を見つけました。これは、PDFを復号化し、所有者とユーザーのパスワードなどを削除するための無料のopemソースライブラリです。あなたはここでこれを見つけることができます Qpdf 。システムにインストールします。このコマンドを実行します

qpdf --decrypt input.pdf output.pdf

次に、pdftkコマンドで出力ファイルを使用します。それは動作するはずです。

8
manoj dhiman

PdfTkは、 iTextの廃止バージョン をGNUコンパイラfor Java(GCJ)を使用して実行可能ファイルにコンパイルすることによって作成されたツールです。 )(PdfTkはiText Group NVによって承認されていません)。

私はあなたのPDFを調べました、そしてそれはPdfTkが作成された時にiTextによってサポートされなかった2つの技術を使用します: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はPDF 1.5)でも導入されているため、XFAは失われます)。

更新:

フォームフィールドについて質問しているので、次の添付ファイルを追加します。

enter image description here

このスクリーンショットは、 iText RUPS (iTextがドキュメントを開くことができることを証明します)を使用して撮影されました。右側には、同じフォームが2回定義されていることがわかります。

enter image description here

Fieldsの下のツリーを歩くと、AcroFormテクノロジーを使用してPDF)に格納されているすべてのフィールドが見つかります。左側に説明が表示されます。そのような分野の:

enter image description here

XFAを見ると、同じフォームがXMLフォームアーキテクチャを使用して定義されていることがわかります。 datasetsをクリックすると、下のパネルにデータセットのXMLの説明が表示されます。

enter image description here

この情報はすべて、iText(Java)またはiTextSharp(C#)を使用してプログラムでアクセスできます。 PdfTkは、このテクノロジーの非常に古いバージョンに基づくツールにすぎません。

10
Bruno Lowagie