Aggiunta di tabelle a PDF esistenti nella stessa pagina – ITEXT

Ho due parti per il mio progetto java.

  • Ho bisogno di compilare i campi di un pdf
  • Devo aggiungere una tabella sotto la sezione popolata nell’area vuota della pagina (e questa tabella deve essere in grado di passare alla pagina successiva).

Sono in grado di fare queste cose separatamente (compila il pdf e crea un tavolo). Ma non posso efficacemente fonderli. Ho provato a fare un doc.add (tabella) che risulterà nella tabella nella pagina successiva del pdf, che non voglio.

In sostanza, devo solo essere in grado di specificare dove inizia la tabella sulla pagina (in modo che non si sovrapponga al contenuto esistente) e quindi timbrare la tabella sul pdf esistente.

La mia altra opzione se questo non funziona sta cercando di aggiungere campi al pdf originale che verrà riempito dal contenuto della tabella (quindi sarà invece una tabella basata sul campo).

Eventuali suggerimenti?

MODIFICARE:

Sono nuovo di iText e non ho usato columntext prima, ma sto provando a testarlo nel seguente codice ma la tabella non viene visualizzata. Ho esaminato altri esempi di columntext e non ho visto esattamente dove il testo della colonna è stato aggiunto al pdf.

//CREATE FILLED FORM PDF PdfReader reader = new PdfReader(sourcePath); PdfStamper pdfStamper = new PdfStamper(reader, new FileOutputStream(destPath)); pdfStamper.setFormFlattening(true); AcroFields form = pdfStamper.getAcroFields(); form.setField("ID", "99999"); form.setField("ADDR1", "425 Test Street"); form.setField("ADDR2", "Test, WA 91334"); form.setField("PHNBR", "(999)999-9999"); form.setField("NAME", "John Smith"); //CREATE TABLE PdfPTable table = new PdfPTable(3); Font bfBold12 = new Font(FontFamily.HELVETICA, 12, Font.BOLD, new BaseColor(0, 0, 0)); insertCell(table, "Table", Element.ALIGN_CENTER, 1, bfBold12); table.completeRow(); ColumnText column = new ColumnText(pdfStamper.getOverContent(1)); column.addElement(table); pdfStamper.close(); reader.close(); 

Si prega di dare un’occhiata all’esempio AddExtraTable . È una semplificazione dell’esempio AddExtraPage scritto in risposta alla domanda Come continuare l’output del campo su una seconda pagina?

Quella domanda è quasi un duplicato esatto della tua domanda, con la differenza che il tuo requisito è più facile da raggiungere.

Ho semplificato il codice in questo modo:

 public void manipulatePdf(String src, String dest) throws DocumentException, IOException { PdfReader reader = new PdfReader(src); Rectangle pagesize = reader.getPageSize(1); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); AcroFields form = stamper.getAcroFields(); form.setField("Name", "Jennifer"); form.setField("Company", "iText's next customer"); form.setField("Country", "No Man's Land"); PdfPTable table = new PdfPTable(2); table.addCell("#"); table.addCell("description"); table.setHeaderRows(1); table.setWidths(new int[]{ 1, 15 }); for (int i = 1; i <= 150; i++) { table.addCell(String.valueOf(i)); table.addCell("test " + i); } ColumnText column = new ColumnText(stamper.getOverContent(1)); Rectangle rectPage1 = new Rectangle(36, 36, 559, 540); column.setSimpleColumn(rectPage1); column.addElement(table); int pagecount = 1; Rectangle rectPage2 = new Rectangle(36, 36, 559, 806); int status = column.go(); while (ColumnText.hasMoreText(status)) { status = triggerNewPage(stamper, pagesize, column, rectPage2, ++pagecount); } stamper.setFormFlattening(true); stamper.close(); reader.close(); } public int triggerNewPage(PdfStamper stamper, Rectangle pagesize, ColumnText column, Rectangle rect, int pagecount) throws DocumentException { stamper.insertPage(pagecount, pagesize); PdfContentByte canvas = stamper.getOverContent(pagecount); column.setCanvas(canvas); column.setSimpleColumn(rect); return column.go(); } 

Come puoi vedere, le principali differenze sono:

  1. Creiamo una rectPage1 per la prima pagina e una rectPage2 per la pagina 2 e tutte le pagine successive. Questo perché non abbiamo bisogno di una pagina intera sulla prima pagina.
  2. Non abbiamo bisogno di caricare una PdfImportedPage , ma stiamo solo aggiungendo pagine bianche della stessa dimensione della prima pagina.

Possibili miglioramenti: ho hardcoded le istanze di Rectangle . Inutile dire che rect1Page dipende dalla posizione della tua forma originale. Ho anche hardcoded rect2Page . Se avessi più tempo, calcolerei rect2Page base al valore di pagesize .

Vedi le seguenti domande e risposte delle FAQ ufficiali:

  • Come aggiungere una tabella in un modulo (e magari inserire una nuova pagina)?
  • Come continuare l'output sul campo in una seconda pagina?