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.
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