2016-04-14 2 views
4

Ich habe eine PHP-Anwendung, die ein Formular aus einem Datenbankaufruf ausfüllt. Momentan stelle ich das mit PDFtk zusammen, ich kann eine Reihe von PDFtk-Befehlen ohne Probleme ausführen und ich erarbeite gerade den gewünschten Befehl an der Befehlszeile.PDFtk löst eine Java-Ausnahme aus, wenn versucht wird, die Funktion 'fill_form' zu verwenden

Mein Ruf ist momentan so:

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 

Dieser Lauf genaue Aufruf mehrmals erzeugt diesen Fehler manchmal: manchmal

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) 

und diesen Fehler:

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) 

Die Fehlermeldung wechselt, aber der Befehl funktioniert nie und das Formular wird nie gefüllt. Wie gesagt, das PDFtk funktioniert mit anderen Befehlen, ich konnte verschlüsselte PDFs generieren und die fixierten Befehle erfolgreich ausführen.

Meine Frage ist, was verursacht diesen Fehler und wie behebe ich es?

Antwort

3

Wie sich herausstellte, war das Problem nicht so, wie Bruno Lowagie bezüglich der Konsistenz der PDF vorgeschlagen hatte.

Ich hatte keine Ideen mehr und dachte nur, ich würde versuchen, das FDF anders zu erstellen. Durch das Ausführen des Befehls:

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

Und dann die resultierende Datei die Kontrolle, ich war in der Lage, eine genauere FDF zu bekommen und dann, wenn ich den fill_form Befehl lautete:

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

ich eine richtige Antwort bekam und Alles hat funktioniert. Das Problem, das ich bekam, war in der Tat dadurch verursacht, dass das FDF in irgendeiner Weise missgebildet war.

Meine endgültige Lösung war this, wenn jemand interessiert ist. Es nimmt ein Template-PDF mit Feldern, generiert ein FDF, um es zu füllen, erstellt ein neues PDF, indem es die Daten aus FDF mit dem Template-PDF hinzufügt, leitet den Browser zum PDF-Speicherort um.

Vielen Dank an Bruno Lowagie für das bessere Verständnis des Systems und das Ausschließen einiger Dinge.

+0

Vielen Dank !!! –

7

Ich sehe meinen Namen im StackTrace. Das ist kein Zufall: PdfTk basiert auf einer mächtigen alten Version von iText. iText ist eine Java PDF-Bibliothek, die ursprünglich von mir geschrieben wurde, aber von einer dritten Partei verwendet wird, um PdfTk zu erstellen.

Der Fehler besagt, dass iText eine PDF analysiert, die entweder einen Fehler oder eine unerwartete Funktion aufweist.

Ein PDF besteht aus PDF-Objekten wie PDF-String-Objekten, PDF-Nummer-Objekten, PDF-Array-Objekten, PDF-Wörterbuch-Objekten, PDF-Stream-Objekten und so weiter. iText kann diese Objekte abrufen und sie wiederverwenden, um eine neue PDF zu erstellen. In Ihrem Fall wird eine neue PDF mit einigen ausgefüllten Formularfeldern basierend auf den Objekten der Original-PDF erstellt.

Es ist unmöglich, Ihre Frage zu beantworten, ohne das PDF zu sehen, das das Problem verursacht, aber sagen wir mal, Ihr PDF enthält einen /AcroForm Eintrag mit einem /Fields Array. In diesem Felder-Array gibt es einen Verweis auf ein Feldwörterbuch. Angenommen, eines der Feldwörterbücher in Ihrem PDF ist kein Wörterbuch, sondern ein PDF-Nullobjekt. Das Formular wird in Adobe Reader einwandfrei angezeigt, aber intern gibt es einen Fehler, der die ordnungsgemäße Verarbeitung des Formulars verhindert.

In diesem Fall wird iText die Einträge im Felder-Array durchlaufen, und einer dieser Einträge gibt kein Feldwörterbuch zurück, sondern ein PdfNull Objekt. In diesem Fall erhalten Sie eine ClassCastException, da PdfNull nicht zu PdfDictionary umgewandelt werden kann.

Dieses Wesen sagte:

  • Wenn ich meinen Namen in Ihrem Stack-Trace zu sehen, dies einen Alarm auslöst, weil es bedeutet, dass Sie eine iText Version verwenden, die iText 5. Eine solche Version früher hinfort länger verwendet werden. You should use a more recent version of iText. Es gibt eine große Chance, dass eine neuere Version von iText Ihnen entweder eine bessere Fehlermeldung gibt oder den Fehler in der PDF toleriert (und vielleicht sogar behebt).
  • Wenn Sie eine PdfTk-Version finden, die eine neuere Version von iText verwendet, würde mich das überraschen, denn soweit ich weiß, ist PdfTk nicht unter der AGPL verfügbar, noch ist PDF Labs (der Besitzer von PdfTk) ein Kunde von iText Software.
  • Wenn Sie PdfTk weiterhin verwenden möchten, sollten Sie keine Antwort erwarten, solange Sie das PDF-Dokument, das Sie auszufüllen versuchen, nicht teilen.

Eine Sache, die Sie versuchen könnten: Öffnen Sie das Formular in Adobe Acrobat. Speichern Sie das Formular in Adobe Acrobat. Es besteht die Möglichkeit, dass das gespeicherte Formular das Problem nicht mehr aufweist. Adobe Acrobat ist sehr tolerant gegenüber Fehlern in PDFs. Es versucht so viele wie möglich zu beheben. Wenn Sie das Formular dann speichern, ist der Fehler nicht mehr vorhanden.

+0

Hallo Bruno, ich weiß es wirklich zu schätzen, dass du dir die Zeit genommen hast, die Erklärung zu geben. Ich freue mich, auf das PDF zu verlinken, aber es klingt, als ob Sie eine sehr klare Vorstellung davon haben, was das Problem ist. Das Formular, das ich ausfüllen muss, ändert sich nicht und es gibt keine Optionen für Benutzer, eigene Formulare hinzuzufügen, da es vielleicht einfacher ist, das Formular mit einer anderen Methode zu generieren, um dieses Problem zu umgehen? – user3192649

+0

Ja. Wenn Sie das Formular freigegeben haben, ist das erste, was ich versuchen würde: Öffnen Sie das Formular in Adobe Acrobat. Speichern Sie das Formular in Adobe Acrobat. Es besteht die Möglichkeit, dass das gespeicherte Formular das Problem nicht mehr aufweist. Adobe Acrobat ist sehr tolerant gegenüber Fehlern in PDFs. Es versucht so viele wie möglich zu beheben. Wenn Sie das Formular dann speichern, ist der Fehler nicht mehr vorhanden. –

+0

Hi Mate, ich habe das fragliche PDF über Acrobat ausgeführt, aber ohne Erfolg. Das PDF finden Sie hier: https://www.dropbox.com/s/jyh3yz7crr4143p/job_card.pdf?dl=0 Wenn Sie einen Blick werfen könnten, würde ich es immens schätzen. – user3192649

1

Es sieht aus wie PDF TK war nicht in der Lage Stiche zu verarbeiten, die char hatte ( und ) ich ersetzte sie durch \) und \( ihnen zu entkommen, und es hat gut funktioniert.

Verwandte Themen