EDIT: diagramma di flusso aggiornato per spiegare meglio la complessità (probabilmente inutile) di ciò che sto facendo.
Noi della società per cui lavoro provo a creare file PDF complessi utilizzando Java iText (la versione gratuita della linea 2.1). I documenti sono costruiti pezzo per pezzo dai singoli file "modello" , che vengono aggiunti al documento finale uno dopo l'altro utilizzando la classe PdfStamper
e riempiti con AcroForms.
Ildesignattualeesegueunciclochevieneeseguitoperognimodellochedeveessereaggiuntoinordine(oltreallalogicapersonalizzatanecessariaperriempireciascuno).Inogniiterazionedelciclo,effettualeseguentioperazioni:
- Creaun
PdfReader
peraprireilfilemodello - Creaun
PdfStamper
cheleggedaPdfReader
escriveinun"buffer modello" - Compila i campi AcroForm e misura l'altezza del modello ottenendo la posizione di una "fine"
AcroField
. - Chiude
PdfReader
ePdfStamper
- Crea un
PdfReader
per leggere un "buffer di lavoro" che memorizza il documento finale corrente in corso - Crea un
PdfStamper
che legge daPdfReader
e scrive in un "buffer di archiviazione" - Chiude
PdfReader
, apre un nuovoPdfReader
al "buffer template" - Importa la pagina dal "buffer modello", la aggiunge al
ContentByte
diPdfStamper
- Chiude
PdfReader
ePdfStamper
- Scambia il "buffer di archiviazione" con il "buffer di lavoro" per essere pronto a ripetere.
Ecco un diagramma che illustra visivamente il processo di cui sopra, che viene eseguito per ogni iterazione del "loop" che esegue ogni modello:
Tuttavia,comerilevatoattraversoPdfStamper
può causare problemi significativi. "Abusare" il PdfStamper
creando e chiudendo lo stampatore troppe volte può causare corruzioni nel file risultante che agiscono solo su alcuni programmi, generando un documento apparentemente buono che potrebbe non funzionare in determinati contesti.
Qual è l'alternativa? La risposta di Mr. Lowagie suggerisce che esiste un modo più semplice o più diretto di usare PdfStamper
s, anche se non lo capisco ancora. Questo potrebbe essere fatto usando solo un singolo stamper? Potrebbe essere fatto senza utilizzare una serie di buffer rotanti?