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;
}
これはちょっとしたトリックの解決策かもしれませんが、あなたのために働くはずです。 @brunoが言ったように、これは暗号化されたファイルです。 pdftk
に使用する前に、これを復号化する必要があります。このために、私はqpdf
である復号化する方法を見つけました。これは、PDFを復号化し、所有者とユーザーのパスワードなどを削除するための無料のopemソースライブラリです。あなたはここでこれを見つけることができます Qpdf 。システムにインストールします。このコマンドを実行します
qpdf --decrypt input.pdf output.pdf
次に、pdftk
コマンドで出力ファイルを使用します。それは動作するはずです。
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は失われます)。
更新:
フォームフィールドについて質問しているので、次の添付ファイルを追加します。
このスクリーンショットは、 iText RUPS (iTextがドキュメントを開くことができることを証明します)を使用して撮影されました。右側には、同じフォームが2回定義されていることがわかります。
Fields
の下のツリーを歩くと、AcroFormテクノロジーを使用してPDF)に格納されているすべてのフィールドが見つかります。左側に説明が表示されます。そのような分野の:
XFAを見ると、同じフォームがXMLフォームアーキテクチャを使用して定義されていることがわかります。 datasets
をクリックすると、下のパネルにデータセットのXMLの説明が表示されます。
この情報はすべて、iText(Java)またはiTextSharp(C#)を使用してプログラムでアクセスできます。 PdfTkは、このテクノロジーの非常に古いバージョンに基づくツールにすぎません。