# PDF Formular mit JPod ausfüllen macht Probleme



## Rookie123 (22. Okt 2008)

Hallo JF-User!

Ich habe momentan ein merkwürdiges Problem mit der JPod Library. 
Grundsätzlich möchte ich eine PDF-Datei einlesen, das darin enthaltene Formular ausfüllen und wieder abspeichern.
Nach kurzer Suche im Netz habe ich JPod ausgewählt.

Schon in den Beispielklassen ist diese Aufgabenstellung implementiert, nur leider funktioniert es nicht so, wie gewünscht. Der Effekt der auftritt stellt sich wie folgt dar: Das Dokument wird gespeichert und die Textfelder sind auf den ersten Blick leer. Erst man man in diese clickt, wird der Text sichtbar. Als wenn sich Textfelder überlagen. Schreibe ich dann etwas hinein, bleibt der mit JPod eingefügte Text auch stehen. Schreibe ich nichts, verschwindet der Text wieder unter dem Textfeld.

Hatte jemand von euch schon mal ein ähnliches Problem?

Ich benutze 
- JPod 5.0 RC3
- Acrobat 9.0 Prof
- JDeveloper 10.1.3.4



```
try {
			String inputFileName = "form.pdf";
			String outputFileName = "form_neu.pdf";
			String fieldName = "ff_name";
			String fieldValue = "test_text";
			open(inputFileName);
			fillFormField(fieldName, fieldValue);
                        //fieldName = "ff_date";
                        //fieldValue = "test";
			save(outputFileName);
		} finally {
			close();
		}
```


```
public void fillFormField(String fieldName, String fieldValue) {
		PDAcroForm form = getDoc().getAcroForm();
		if (form == null) {
			return;
		}
		PDAcroFormField field = form.getField(fieldName);
		if (field == null) {
			return;
		}
		field.setValueString(fieldValue);
                //field.setReadOnly(false);
	}
```


```
protected PDDocument basicOpen(String pathname, Map options)
			throws IOException, COSLoadException {
		FileLocator locator = new FileLocator(pathname);
		return PDDocument.createFromLocator(locator, options);
	}

	protected void basicSave(PDDocument doc, String outputFileName)
			throws IOException {
		FileLocator locator = new FileLocator(outputFileName);
		doc.save(locator, null);
	}
```


Ich bin für jegliche Anregungen wirklich absolut dankbar!

Habt ihr eine Empfehlung für eine "bessere" Lib?

Thx in advance!


----------



## Rookie123 (23. Okt 2008)

Ich könnte mir vorstellen, dass es hier ein Referenz-Problem oder sowas in der Art gibt. Es wird nicht in das geladene Feld geschrieben, sondern in ein neues mit der gleichen Position etc.

Ich habe das jetzt mit iText neu gemacht. Der Code ist schön schlank und fukntioniert super:


```
public class StamperTest {
    public StamperTest() {
    }

    public static void main(String[] args) {
        
        try {
            PdfReader reader = new PdfReader("formular.pdf");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfStamper stamp = new PdfStamper(reader,baos); 
            AcroFields fields = stamp.getAcroFields();
            
            fields.setField("ff_date","ff_date");
            fields.setField("ff_time","ff_time");
            
            stamp.close();
        }
        catch (DocumentException e) {
            
        }
        catch (FileNotFoundException e) {
            
        }
        catch (IOException e) {
            
        }
    }
}
```

hf


----------



## mit (24. Okt 2008)

jPod selbst stellt die Basismanipulationen des PDF Modells zur Verfügung. Das bedeutet im PDF Jargon, das befüllen eines Feldes besteht aus:

- Anfordern der Feldänderung
- abarbeiten formularspezifischer JavaScripts (Formatierung, Berechnung etc.)
- setzen des value (Der "fachliche" Wert, der beispielsweise für import und export verwendet wird)
- setzen der appearances (Die sichtbare Grafik) in allen verbundenen annotations

Dieser komplexe Vorgang ist mit einem einfachen "setValue" nicht abgedeckt (das ist kein Bug oder so...)

Eine Möglochkeit besteht in der Verwendung des "NeedAppearances" Flags, so dass die INhalte der Felder beim Öffnen durch einen Viewer sofot berechnet werden. Die andere Möglichkeit besteht darin, dei Appearances selbst zu berechnen und an der Annotation zur Verfügung zu stellen. Für einfache Anwendungen kann eine Text Appearance sehr einfach mit dem CSCreator erzeugt werden. 

Zur Vereinfachung des Gesamtvorgangs gibt es den "IFormHandler" der all diese Funktionen und internen Zusammenhänge abdeckt. Die Standardimplementierung "StandardFormHandler" verwendet registries an die die Ausführung von Actions und das Erzeugen der Appearance delegiert wird. Diese KONKRETEN Implementierung sind aktuell nicht Bestandteil der jPod Auslieferung. Wir arbeiten an der Freigabe, die Prio für dieses 5.0 Release lag jedoch auf dem Renderer. 

Eigentlich glaube ich nicht, dass es eine "bessere" lib gibt  Die Frage ist was dein Ziel ist. Wenn es um skalierbare PDF Anwendungen geht, bleib bei jPod, da hier das PDF Modell vollständig offenliegt und sehr detaillierte Manipulationen möglich und PDF spezifischen Features enthalten sind. Die Basis ist schlicht mächtiger. Für viele Standardaufgaben gibt es Convenience Implementierungen wie den IFormHandler. Wenn es um "adhoc" Standard erstellung und Manpulation geht, bist du mit iText möglicherweise besser dran.


----------



## Rookie123 (27. Okt 2008)

Ok, dann wollte ich mir das wohl zu einfach machen ;-)

Bis dato sind für mich wirklich nur solche simplen Veränderungen an PDFs erforderlich. 
Aber ich werde JPod mal im Auge behalten und bei nächster Gelegenheit einsetzen.

Thx!


----------



## JPodDEV (15. Mai 2012)

Kann jemand mal ein einfachs Beispiel liefern, das zeigt wie man mit JPod & JPodRenderer ein PDF mit Formular öffnet, ausfüllt und wieder speichert?

Das Ausfüllen mit Update der Anzeige und des PDDocument ist das eigentliche Problem. Mir ist nicht klar wie man einen StandardFormhandler regiistriert und ansteuert.

Vielen Dank im voraus


----------

