Informes en formato PDF en Android

Hoy, desde esta tribuna que es nuestro blog, os vamos a hablar de cómo generar de una manera ágil y sencilla informes en formato pdf a partir de las diferentes vistas que conforman nuestras aplicaciones Android.

Solo tenemos que navegar un poco por Internet para comprobar que existen un gran número de librerías que podemos incluir y utilizar en nuestros proyectos para generar ficheros pdf. Algunas de ellas son las siguientes:

iText 5.0+ Licencia AGPL

iText 4.2 Licencia MPL/LGPL

PDF Box Apache License, Version 2.0

JPedal Licencia LGPL

FOP Licencia Apache, Version 2.0

gnujpdf Licencia LGPL

PJX Licencia GPLv2

jPod Licencia BSD

Android PDF Writer Licencia BSD

PdfDocument (Propia de Android. Requiere un nivel de API 19 o superior)

Un aspecto muy importante que debemos tener en cuenta antes de elegir cualquiera de ellas es el tipo de licencia, de tal forma que para cada proyecto elijamos la que mejor cumpla con nuestros requisitos así como si son compatibles con Android sin tener que usar la librería swing.

En el ejemplo que describiremos a continuación utilizaremos la librería Android PDF Writer, que posee licencia BSD.

 

Informes en formato PDF en Android

Lo primero que haremos es, para cada una de las vistas que queremos incluir en el informe, generar su correspondiente bitmap.

LinearLayout linLayoutView = new LinearLayout(this);
 View child1 = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
 linLayoutView.addView(child1);

// Create a bitmap from a passed view
 linLayoutView.setDrawingCacheEnabled(true);
 linLayoutView.buildDrawingCache(true);
 linLayoutView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_AUTO); // Quality of the snapshot
 linLayoutView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
 linLayoutView.layout(0, 0, linLayoutView.getMeasuredWidth(),linLayoutView.getMeasuredHeight());

Bitmap bitmap1 = Bitmap.createBitmap(loadBitmapFromView(linLayoutView));
 linLayoutView.setDrawingCacheEnabled(false); // clear drawing cache

 /**
 * Load the bitmap referred to the passed view
 *
 * @param v: view
 * @return Bitmap
 */
 public static Bitmap loadBitmapFromView(View v) {
 Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b);
 v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredWidth());
 v.draw(c);
 return b;
 }

Posteriormente, crearemos un PDFWriter en el que definiremos las características del documento que permitirá generar los informes en formato pdf:

PDFWriter mPDFWriter = new PDFWriter(PaperSize.A4_WIDTH, PaperSize.A4_HEIGHT);

En caso de que necesitemos comprimir y escalar los bitmaps, podemos hacerlo como se muestra a continuación:

// Compress and scale the bitmap to the paper size
 ByteArrayOutputStream out = new ByteArrayOutputStream();
 bitmap1.compress(Bitmap.CompressFormat.PNG, 50, out);
 Bitmap decodedBitmap = Bitmap.createScaledBitmap(bitmap1, PaperSize.A4_WIDTH, PaperSize.A4_HEIGHT, true);

mPDFWriter.addImage(10, 10, decodedBitmap);

Si necesitamos añadir nuevas páginas a nuestro documento utilizaremos el método newPage() de la librería y en cada una de ellas iremos incluyendo el resto de vistas:

mPDFWriter.newPage();
 mPDFWriter.addImage(10, 10, bitmap2);

Finalmente, generamos el fichero físico que almacenaremos en el dispositivo:

File newFile = new File(this.getReportPDFFile());
 newFile.createNewFile();

FileOutputStream pdfFile = new FileOutputStream(newFile);
 pdfFile.write(mPDFWriter.asString().getBytes("ISO-8859-1"));
 pdfFile.close();

Como resultado, tendremos nuestro fichero PDF compuesto por las diferentes vistas que hemos ido incluyendo 🙂

 

Artículos relacionados

ASO – Posiciona tu app en el App Store o Google Play

Librería Android Priority Job Queue para tus tareas en segundo plano

Detección de dispositivos Bluetooth en Android

OCR en Android

Deja un comentario

¿Necesitas una estimación?

Calcula ahora