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.
- Cómo programar mi aplicación para Android para que haga algo cada hora
- Android Formato de fecha con zona horaria
- Correcta forma de convertir entre Bitmap y Mat en OpenCV en Android?
- ¿Puedo detectar mediante programación si hay dispositivos Chromecast en la red WiFi actual?
- Dilatación y erosión en Android
-
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.
- No puedo dividir dos números correctamente
- El archivo existe y el directorio IS, pero listFiles () devuelve null
- Manteniendo la cámara en pausa
- Error en Android Studio al ejecutar mi aplicación
- ¿Cómo agregar efectos de sonido en Android?
- MissingResourceException: No se puede encontrar el paquete para el nombre base sun.util.logging.resources.logging, locale en_US
- Prueba de unidad de Android con Retrofit y Mockito
- ¿Qué es la devolución de llamada en Android?
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 obtener el número de teléfono del dispositivo Android con tarjeta SIM o
- La aplicación de ejemplo Android Geofencing sólo funciona si otra aplicación está abierta mediante GPS