2016-04-14 16 views
4

データベース呼び出しからフォームを埋め込むPHPアプリケーションがあります。現在、私はPDFtkを使ってこれをまとめていますが、何の問題もなく数多くのPDFtkコマンドを実行することができます。現在、コマンドラインで目的のコマンドを実行しています。「fill_form」関数を使用しようとすると、PDFtkがJava例外をスローする

私の呼び出しは、現在、この:

Unhandled Java Exception in create_output(): 
java.lang.ClassCastException: pdftk.com.lowagie.text.pdf.PdfNull cannot be cast to pdftk.com.lowagie.text.pdf.PdfDictionary 
    at pdftk.com.lowagie.text.pdf.FdfReader.readFields(pdftk) 
    at pdftk.com.lowagie.text.pdf.FdfReader.readPdf(pdftk) 
    at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk) 
    at pdftk.com.lowagie.text.pdf.PdfReader.<init>(pdftk) 
    at pdftk.com.lowagie.text.pdf.FdfReader.<init>(pdftk) 

そして時には、このエラー:

Unhandled Java Exception in create_output(): 
Unhandled Java Exception in main(): 
java.lang.NullPointerException 
    at gnu.gcj.runtime.NameFinder.lookup(libgcj.so.10) 
    at java.lang.Throwable.getStackTrace(libgcj.so.10) 
    at java.lang.Throwable.stackTraceString(libgcj.so.10) 
    at java.lang.Throwable.printStackTrace(libgcj.so.10) 
    at java.lang.Throwable.printStackTrace(libgcj.so.10) 

エラーメッセージ

pdftk /var/www/html/CSR/template/job_card.pdf fill_form /var/www/html/CSR/template/wwwwu7mMH.fdf output /var/www/html/CSR/template/filled4.pdf 

この正確なコールの実行を複数回は時々、このエラーを生成します交互に表示されますが、コマンドは決して動作せず、フォームは決して満たされません。私が言っているように、PDFtkは他のコマンドで動作します。私は暗号化されたPDFを生成して、固定コマンドを実行することができました。

私の質問は、このエラーの原因とは何ですか、どのように修正しますか?

答えて

3

この問題は、Bruno Lowagie氏がPDFの一貫性について提案したようには分かりませんでした。

アイデアがなくなってしまい、FDFを別の方法で作成しようと考えていただけです。コマンドを実行して:

pdftk /full/path/to/template.pdf generate_fdf output /full/path/to/output.fdf 

そして、結果のファイルを検査し、私はより正確なFDFを得ることができたし、私はfill_formコマンド実行時:

pdftk /full/path/to/template.pdf fill_form /full/path/to/output.fdf output /full/path/to/output.pdf 

を、私は、適切な応答を持って、すべてがうまくいった。だから、私が得ていた問題は、FDFが何らかの形で不正な形式になっていたためです。

私の最終的な解決策は、誰でも興味があればthisでした。フィールドを持つテンプレートPDFを取り込み、それを埋めるためにFDFを生成し、テンプレートPDFでFDFからデータを追加して新しいPDFを作成し、ブラウザをPDFの場所にリダイレクトします。

システムをよりよく理解し、いくつかの事柄を除外するのに役立つBruno Lowagieに大きな感謝をします。

+0

ありがとうございました!!! –

7

StackTraceに自分の名前が表示されます。それは偶然ではありません:PdfTkはiTextの強力な古いバージョンに基づいています。 iTextは、私が最初に書いたJava PDFライブラリですが、PdfTkを作成するために第三者によって使用されています。

エラーは、iTextがエラーまたは予期しない機能を持つPDFを解析中であることを示します。

PDFは、PDF文字列オブジェクト、PDF番号オブジェクト、PDF配列オブジェクト、PDF辞書オブジェクト、PDFストリームオブジェクトなどのPDFオブジェクトで構成されています。 iTextはこれらのオブジェクトを取得し、それらを再利用して新しいPDFを作成することができます。あなたの場合、元のPDFのオブジェクトに基づいて、記入されたいくつかのフォームフィールドを含む新しいPDFが作成されます。

問題の原因となるPDFを見ずに質問に回答することは不可能ですが、/AcroFormのエントリに/Fieldsの配列が含まれているとします。このフィールド配列には、フィールド辞書への参照があります。 PDFのフィールド辞書の1つが辞書ではなく、PDFのヌルオブジェクトであるとします。フォームはAdobe Readerで完全に表示されますが、内部的にフォームの適切な処理を妨げる欠点があります。

この場合、iTextはフィールド配列内のエントリをループし、それらのエントリの1つはフィールド辞書を返しませんが、PdfNullオブジェクトを返します。その場合、が表示されます。PdfNullPdfDictionaryにキャストできないためです。

このビーイングは言った:それは、あなたがしなければならないようなバージョンをiTextの5.に先行iTextのバージョンを使用していることを意味するので

  • 私はあなたのスタックトレースに私の名前が表示された場合には、これはありません、アラームをトリガーもっと長く使うべきです。 You should use a more recent version of iText。 iTextのより最近のバージョンでは、より良いエラーメッセージを表示したり、PDF内のエラーを許容(場合によっては修正)する可能性が高くなります。
  • 私が知る限り、PdfTkはAGPLのもとでは利用できないし、PDF Labs(PdfTkの所有者)もiTextの最新バージョンを使用しているPdfTkバージョンを見つけたら、それは私を驚かせるでしょう。 iText Softwareのお客様
  • PdfTkを使い続けるには、入力しようとしているPDF文書を共有していない限り、回答は期待できません。

試してみてください:Adobe Acrobatでフォームを開きます。 Adobe Acrobatでフォームを保存します。保存されたフォームにもはや問題がない可能性があります。 Adobe AcrobatはPDFのエラーに対して非常に寛容です。できるだけ多く修正しようとします。フォームを保存すると、エラーはなくなります。

+0

こんにちは、本当にありがとうございます。私はPDFにリンクしてうれしく思いますが、問題の内容を明確に把握しているようです。私が配置する必要があるフォームは変更されず、ユーザーが独自のフォームを追加するオプションはありません。おそらく、この問題を回避するために別の方法を使用してフォームを生成する方が簡単でしょうか? – user3192649

+0

はい。フォームを共有した場合は、最初に試してみたいのは、Adobe Acrobatでフォームを開きます。 Adobe Acrobatでフォームを保存します。保存されたフォームにもはや問題がない可能性があります。 Adobe AcrobatはPDFのエラーに対して非常に寛容です。できるだけ多く修正しようとします。フォームを保存すると、エラーはなくなります。 –

+0

こんにちは、私は問題のPDFをAcrobatで実行しましたが、役に立たないです。 PDFは次のURLにあります:https://www.dropbox.com/s/jyh3yz7crr4143p/job_card.pdf?dl=0 もしあなたが一見することができれば、私はそれを非常に高く評価します。 – user3192649

1

PDF TKが、私はそれらをエスケープする\)\(でそれらを交換し、それがうまく働いた文字()を持っていた刺し傷を処理することができなかったようです。

関連する問題