IText Android – Añadir texto a PDF existente

Tenemos un PDF con algunos campos para recopilar algunos datos, y tengo que llenarlo de forma programática con iText en Android mediante la adición de algún texto en esas posiciones. He estado pensando en diferentes maneras de lograr esto, con poco éxito en cada uno.

Nota: Estoy usando la versión para Android de iText (iTextG 5.5.4) y un Samsung Galaxy Note 10.1 2014 (Android 4.4) para la mayoría de mis pruebas.

  • El enfoque que tomé desde el principio era "dibujar" el texto en coordenadas determinadas, para una página dada. Esto tiene algunos problemas con la gestión de los campos (tengo que ser consciente de la longitud de las cadenas, y podría ser difícil colocar cada texto en la coordenada exacta del pdf). Pero lo más importante es que el rendimiento del proceso es muy lento en algunos dispositivos / OSVersions (funciona muy bien en Nexus 5 con 5.0.2, pero toma varios minutos con un Pdf de 5 MB en la Nota 10.1).

    pdfReader = new PdfReader(is); document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); pdfCopy = new PdfCopy(document, baos); document.open(); PdfImportedPage page; PdfCopy.PageStamp stamp; for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) { page = pdfCopy.getImportedPage(pdfReader, i); // First page = 1 stamp = pdfCopy.createPageStamp(page); for (int i=0; i<10; i++) { int posX = i*50; int posY = i*100; Phrase phrase = new Phrase("Example text", FontFactory.getFont(FontFactory.HELVETICA, 12, BaseColor.RED)); ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, posX, posY, 0); } stamp.alterContents(); pdfCopy.addPage(page); } 
  • Pensamos en agregar "campos de formularios" en lugar de dibujar. De esta manera puedo configurar un TextField y evitar manejar los textos yo mismo. Sin embargo, el PDF final no debería tener ninguna anotación, así que tendría que copiarla en un nuevo PDF sin anotaciones y con esos "campos de formularios" dibujados. No tengo un ejemplo de esto porque no pude realizar esto, ni siquiera sé si esto es posible / vale la pena.

  • La tercera opción sería recibir un PDF con los "campos de formularios" ya agregados, de esa manera sólo tengo que rellenarlos. Sin embargo todavía necesito crear un nuevo pdf con todos esos campos y sin anotaciones …

Me gustaría saber cuál es la mejor manera en el rendimiento para hacer este proceso, y cualquier ayuda para lograrlo. Estoy realmente novato con iText y cualquier ayuda sería muy apreciada.

¡Gracias!

EDITAR

Al final utilicé la tercera opción: un PDF con campos editables que llenamos y luego utilizamos el "aplanamiento" para crear un PDF no editable con todos los textos ya existentes.

El código es el siguiente:

  pdfReader = new PdfReader(is); FileOutputStream fios = new FileOutputStream(outPdf); PdfStamper pdfStamper = new PdfStamper(pdfReader, fios); //Filling the PDF (It's totally necessary that the PDF has Form fields) fillPDF(pdfStamper); //Setting the PDF to uneditable format pdfStamper.setFormFlattening(true); pdfStamper.close(); 

Y el método para llenar los formularios:

 public static void fillPDF(PdfStamper stamper) throws IOException, DocumentException{ //Getting the Form fields from the PDF AcroFields form = stamper.getAcroFields(); Set<String> fields = form.getFields().keySet(); for(String field : fields){ form.setField("name", "Ernesto"); form.setField("surname", "Lage"); } } } 

La única cosa sobre este acercamiento es que usted necesita saber el nombre de cada campo para llenarlo.

Hay un proceso en iText conocido como "flattening", que toma los campos de formulario, y los reemplaza con el texto que contienen los campos.

No he utilizado iText en pocos años (y no en todos en Android), pero si buscas en el manual o en los ejemplos en línea para 'aplastar', deberías encontrar cómo hacerlo.

  • Cómo cambiar la línea de fondo de EditText mediante programación
  • Rx Java mergeDelayError no funciona como se esperaba
  • Cómo dibujar un borde alrededor de un mapview
  • No se puede resolver el método getSupportFragmentManager () en android studio
  • ¿Por qué estoy obteniendo una referencia nula en mi RecyclerView
  • Barra de acción Sherlock 4 color del texto del título - donde me estoy yendo mal?
  • Notification pendingIntent contentIntent falla cuando terminan las llamadas de actividad ()
  • ¿Cuál es la mejor manera de definir TAG constante en Kotlin?
  • Eliminar actividad de apk a través de Proguard
  • Convierta el Array de Java normal o ArrayList a Json Array en android
  • Cómo obligar a Android Studio a ver fuente `` en otros sabores, por lo que la refactorización de las clases abstractas sería más seguro
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.