tablas pie pdfwriter pagina headerfooter example encabezado ejemplos editar crear java pdf itext

java - pie - itext tablas ejemplos



iText: agregue contenido al archivo PDF existente (4)

Quiero hacer lo siguiente con iText:

(1) analizar un archivo PDF existente

(2) agregue algunos datos, en la página única existente del documento (como una marca de tiempo)

(3) escribe el documento

Simplemente no puedo entender cómo hacer esto con iText. En pseudo código, haría esto:

Document document = reader.read(input); document.add(new Paragraph("my timestamp")); writer.write(document, output);

Pero por alguna razón, la API de iText es tan complicada que no puedo entenderlo. El PdfReader realmente contiene el modelo de documento o algo así (en lugar de escupir un documento), y usted necesita un PdfWriter para leer páginas de él ... ¿eh?


El código de Gutch está cerca , pero solo funcionará correctamente si:

  • No hay anotaciones (enlaces, campos, etc.), no hay estructura de documento / contenido marcado, no hay marcadores, ningún script a nivel de documento, etc., etc., etc.
  • El tamaño de la página es A.4 (probabilidades decentes, pero no funcionará en ningún PDF antiguo con el que se encuentre)
  • No te importa perder todos los metadatos del documento original (productor, fecha de creación, posiblemente autor / título / palabras clave), y tal vez la identificación del documento. No puede copiar la fecha de creación y la ID del documento, a menos que realice hackers bastante profundos en el mismo iText).

El Método Aprobado es hacerlo al revés. Abra el documento existente con un PdfStamper, y use el PdfContentByte devuelto de getOverContent () para escribir texto (y cualquier otra cosa que necesite) directamente en la página. No se necesita un segundo documento.

Y puede usar un Texto de Columna para manejar el diseño y eso para usted ... no es necesario ensuciarse con beginText (), setFontAndSize (), drawText (), drawText () ..., endText ().


Este es el escenario más complicado que puedo imaginar: tengo un archivo PDF creado con Ilustrator y modificado con Acrobat para tener AcroFields (AcroForm) que voy a llenar con datos con este código Java, el resultado de ese archivo PDF con el los datos en los campos se modifican agregando un documento.

En realidad, en este caso estoy generando dinámicamente un fondo que se agrega a un PDF que también se genera dinámicamente con un documento con una cantidad desconocida de datos o páginas.

Estoy usando JBoss y este código está dentro de un archivo JSP (debería funcionar en cualquier servidor web JSP).

Nota: si está utilizando IExplorer debe enviar un formulario HTTP con el método POST para poder descargar el archivo. Si no, verá el código PDF en la pantalla. Esto no ocurre en Chrome o Firefox.

<%@ page import="java.io.*, com.lowagie.text.*, com.lowagie.text.pdf.*" %><% response.setContentType("application/download"); response.setHeader("Content-disposition","attachment;filename=listaPrecios.pdf" ); // -------- FIRST THE PDF WITH THE INFO ---------- String str = ""; // lots of words for(int i = 0; i < 800; i++) str += "Hello" + i + " "; // the document Document doc = new Document( PageSize.A4, 25, 25, 200, 70 ); ByteArrayOutputStream streamDoc = new ByteArrayOutputStream(); PdfWriter.getInstance( doc, streamDoc ); // lets start filling with info doc.open(); doc.add(new Paragraph(str)); doc.close(); // the beauty of this is the PDF will have all the pages it needs PdfReader frente = new PdfReader(streamDoc.toByteArray()); PdfStamper stamperDoc = new PdfStamper( frente, response.getOutputStream()); // -------- THE BACKGROUND PDF FILE ------- // in JBoss the file has to be in webinf/classes to be readed this way PdfReader fondo = new PdfReader("listaPrecios.pdf"); ByteArrayOutputStream streamFondo = new ByteArrayOutputStream(); PdfStamper stamperFondo = new PdfStamper( fondo, streamFondo); // the acroform AcroFields form = stamperFondo.getAcroFields(); // the fields form.setField("nombre","Avicultura"); form.setField("descripcion","Esto describe para que sirve la lista "); stamperFondo.setFormFlattening(true); stamperFondo.close(); // our background is ready PdfReader fondoEstampado = new PdfReader( streamFondo.toByteArray() ); // ---- ADDING THE BACKGROUND TO EACH DATA PAGE --------- PdfImportedPage pagina = stamperDoc.getImportedPage(fondoEstampado,1); int n = frente.getNumberOfPages(); PdfContentByte background; for (int i = 1; i <= n; i++) { background = stamperDoc.getUnderContent(i); background.addTemplate(pagina, 0, 0); } // after this everithing will be written in response.getOutputStream() stamperDoc.close(); %>

Hay otra solución mucho más simple y resuelve tu problema. Depende de la cantidad de texto que desee agregar.

// read the file PdfReader fondo = new PdfReader("listaPrecios.pdf"); PdfStamper stamper = new PdfStamper( fondo, response.getOutputStream()); PdfContentByte content = stamper.getOverContent(1); // add text ColumnText ct = new ColumnText( content ); // this are the coordinates where you want to add text // if the text does not fit inside it will be cropped ct.setSimpleColumn(50,500,500,50); ct.setText(new Phrase(str, titulo1)); ct.go();


iText tiene más de una forma de hacerlo. La clase PdfStamper es una opción. Pero creo que el método más fácil es crear un nuevo documento PDF y luego importar páginas individuales desde el documento existente al nuevo PDF.

// Create output PDF Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, outputStream); document.open(); PdfContentByte cb = writer.getDirectContent(); // Load existing PDF PdfReader reader = new PdfReader(templateInputStream); PdfImportedPage page = writer.getImportedPage(reader, 1); // Copy first page of existing PDF into output PDF document.newPage(); cb.addTemplate(page, 0, 0); // Add your new data / text here // for example... document.add(new Paragraph("my timestamp")); document.close();

Esto se leerá en un PDF desde templateInputStream y lo escribirá en outputStream . Estos pueden ser flujos de archivos o secuencias de memoria o lo que sea adecuado para su aplicación.


Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("E:/TextFieldForm.pdf")); document.open(); PdfPTable table = new PdfPTable(2); table.getDefaultCell().setPadding(5f); // Code 1 table.setHorizontalAlignment(Element.ALIGN_LEFT); PdfPCell cell; // Code 2, add name TextField table.addCell("Name"); TextField nameField = new TextField(writer, new Rectangle(0,0,200,10), "nameField"); nameField.setBackgroundColor(Color.WHITE); nameField.setBorderColor(Color.BLACK); nameField.setBorderWidth(1); nameField.setBorderStyle(PdfBorderDictionary.STYLE_SOLID); nameField.setText(""); nameField.setAlignment(Element.ALIGN_LEFT); nameField.setOptions(TextField.REQUIRED); cell = new PdfPCell(); cell.setMinimumHeight(10); cell.setCellEvent(new FieldCell(nameField.getTextField(), 200, writer)); table.addCell(cell); // force upper case javascript writer.addJavaScript( "var nameField = this.getField(''nameField'');" + "nameField.setAction(''Keystroke''," + "''forceUpperCase()'');" + "" + "function forceUpperCase(){" + "if(!event.willCommit)event.change = " + "event.change.toUpperCase();" + "}"); // Code 3, add empty row table.addCell(""); table.addCell(""); // Code 4, add age TextField table.addCell("Age"); TextField ageComb = new TextField(writer, new Rectangle(0, 0, 30, 10), "ageField"); ageComb.setBorderColor(Color.BLACK); ageComb.setBorderWidth(1); ageComb.setBorderStyle(PdfBorderDictionary.STYLE_SOLID); ageComb.setText("12"); ageComb.setAlignment(Element.ALIGN_RIGHT); ageComb.setMaxCharacterLength(2); ageComb.setOptions(TextField.COMB | TextField.DO_NOT_SCROLL); cell = new PdfPCell(); cell.setMinimumHeight(10); cell.setCellEvent(new FieldCell(ageComb.getTextField(), 30, writer)); table.addCell(cell); // validate age javascript writer.addJavaScript( "var ageField = this.getField(''ageField'');" + "ageField.setAction(''Validate'',''checkAge()'');" + "function checkAge(){" + "if(event.value < 12){" + "app.alert(''Warning! Applicant//'s age can not" + " be younger than 12.'');" + "event.value = 12;" + "}}"); // add empty row table.addCell(""); table.addCell(""); // Code 5, add age TextField table.addCell("Comment"); TextField comment = new TextField(writer, new Rectangle(0, 0,200, 100), "commentField"); comment.setBorderColor(Color.BLACK); comment.setBorderWidth(1); comment.setBorderStyle(PdfBorderDictionary.STYLE_SOLID); comment.setText(""); comment.setOptions(TextField.MULTILINE | TextField.DO_NOT_SCROLL); cell = new PdfPCell(); cell.setMinimumHeight(100); cell.setCellEvent(new FieldCell(comment.getTextField(), 200, writer)); table.addCell(cell); // check comment characters length javascript writer.addJavaScript( "var commentField = " + "this.getField(''commentField'');" + "commentField" + ".setAction(''Keystroke'',''checkLength()'');" + "function checkLength(){" + "if(!event.willCommit && " + "event.value.length > 100){" + "app.alert(''Warning! Comment can not " + "be more than 100 characters.'');" + "event.change = '''';" + "}}"); // add empty row table.addCell(""); table.addCell(""); // Code 6, add submit button PushbuttonField submitBtn = new PushbuttonField(writer, new Rectangle(0, 0, 35, 15),"submitPOST"); submitBtn.setBackgroundColor(Color.GRAY); submitBtn. setBorderStyle(PdfBorderDictionary.STYLE_BEVELED); submitBtn.setText("POST"); submitBtn.setOptions(PushbuttonField. VISIBLE_BUT_DOES_NOT_PRINT); PdfFormField submitField = submitBtn.getField(); submitField.setAction(PdfAction .createSubmitForm("",null, PdfAction.SUBMIT_HTML_FORMAT)); cell = new PdfPCell(); cell.setMinimumHeight(15); cell.setCellEvent(new FieldCell(submitField, 35, writer)); table.addCell(cell); // Code 7, add reset button PushbuttonField resetBtn = new PushbuttonField(writer, new Rectangle(0, 0, 35, 15), "reset"); resetBtn.setBackgroundColor(Color.GRAY); resetBtn.setBorderStyle( PdfBorderDictionary.STYLE_BEVELED); resetBtn.setText("RESET"); resetBtn .setOptions( PushbuttonField.VISIBLE_BUT_DOES_NOT_PRINT); PdfFormField resetField = resetBtn.getField(); resetField.setAction(PdfAction.createResetForm(null, 0)); cell = new PdfPCell(); cell.setMinimumHeight(15); cell.setCellEvent(new FieldCell(resetField, 35, writer)); table.addCell(cell); document.add(table); document.close(); } class FieldCell implements PdfPCellEvent{ PdfFormField formField; PdfWriter writer; int width; public FieldCell(PdfFormField formField, int width, PdfWriter writer){ this.formField = formField; this.width = width; this.writer = writer; } public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvas){ try{ // delete cell border PdfContentByte cb = canvas[PdfPTable .LINECANVAS]; cb.reset(); formField.setWidget( new Rectangle(rect.left(), rect.bottom(), rect.left()+width, rect.top()), PdfAnnotation .HIGHLIGHT_NONE); writer.addAnnotation(formField); }catch(Exception e){ System.out.println(e); } } }