Android >> Ejemplo sencillo de creación de un PDF en Android

En este tutorial vamos a ver como crear un fichero PDF en Android. Para ello lo más importante es descargar la librería droidText. Esta librería es un port de la librería iText versión 2.1.7, que fue la última versión con licencia GPL. Puedes descargar la librería aquí.

  • Permisos de la aplicación

Una vez hemos descargada la librería la añadimos a nuestro proyecto. A continuación debemos proporcionar permiso de escritura a nuestra aplicación, ya que vamos a crear un archivo en la memoria del dispositivo. Nos vamos al fichero AndroidManifest.xml y añadimos la siguiente línea:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

De tal manera que dicho fichero quede de la siguiente manera:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.amatellanes.android.examples"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name=".GenerarPDFActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

</manifest>
  • Definiendo la vista

A continuación vamos a definir el único layout de nuestra aplicación, que estará formado por un botón, que al hacer clic sobre él nos generará el fichero PDF:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnGenerar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_texto" />

</LinearLayout>
  • Creando el documento

Por último, creamos la actividad que se va a ocupar de la creación del fichero PDF. El primer paso a realizar en la actividad será crear el fichero pdf para que podamos escribir en él:

import java.io.File;
import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfWriter;

...

private final static String NOMBRE_DOCUMENTO = "prueba.pdf";

...

// Creamos el documento.
Document documento = new Document();
// Creamos el fichero con el nombre que deseemos.
File f = crearFichero(NOMBRE_DOCUMENTO);

// Creamos el flujo de datos de salida para el fichero donde guardaremos el pdf.
FileOutputStream ficheroPdf = new FileOutputStream(f.getAbsolutePath());

// Asociamos el flujo que acabamos de crear al documento.
PdfWriter.getInstance(documento, ficheroPdf);

// Abrimos el documento.
documento.open();

La función crearFichero() simplemente nos crea el directorio /MiPdf en el directorio de descargas del dispositivo y el fichero prueba.pdf dentro de él:

public static File crearFichero(String nombreFichero) throws IOException {
	File ruta = getRuta();
	File fichero = null;
	if (ruta != null)
		fichero = new File(ruta, nombreFichero);
	return fichero;
}

public static File getRuta() {

	// El fichero será almacenado en un directorio dentro del directorio
    // Descargas
	File ruta = null;
	if (Environment.MEDIA_MOUNTED.equals(Environment
			.getExternalStorageState())) {
		ruta = new File(
				Environment
						.getExternalStoragePublicDirectory(
                                Environment.DIRECTORY_DOWNLOADS),
				NOMBRE_DIRECTORIO);

		if (ruta != null) {
			if (!ruta.mkdirs()) {
				if (!ruta.exists()) {
					return null;
				}
			}
		}
	} else {
	}

	return ruta;
}

  • Agregando elementos al documento

A partir de aquí solo tendremos que ir añadiendo los elementos que deseemos en el fichero PDF. La clase Document proporciona el método add() que nos permitirá añadir cualquier tipo de elemento que implemente el interfaz Element de la librería droidText. Dentro de estos elementos podemos encontrar: frases, párrafos, imágenes, tablas, separadores, capítulos, etc. Para leer más sobre los elementos que se pueden añadir al fichero PDF puedes visitar la documentación oficial de iText.

  • Agregando texto

Vamos a empezar añadiendo dos párrafos, uno de ellos usando los atributos por defecto, y en otro vamos a modificar la fuente, el tamaño, el estilo y el color:

import harmony.java.awt.Color;

import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.Paragraph;

// Añadimos un título con la fuente por defecto.
documento.add(new Paragraph("Título 1"));

// Añadimos un título con una fuente personalizada.
Font font = FontFactory.getFont(FontFactory.HELVETICA, 28,
					Font.BOLD, Color.RED);
documento.add(new Paragraph("Título personalizado", font));
  • Agregando imágenes

A continuación añadimos una imagen, en esta ocasión la imagen se encuentra almacenada en los recursos de la aplicación. La imagen deberá tener alguno de los formatos habituales como .jpg, .png o .gif, por ejemplo.

// Insertamos una imagen que se encuentra en los recursos de la aplicación.
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.logo);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
Image imagen = Image.getInstance(stream.toByteArray());
documento.add(imagen);
  • Agregando tablas

Por último vamos a añadir una tabla a nuestro PDF. Para tal fin deberemos de usar la clase PdfPTable, en el constructor podremos especificarle el número de columnas, un array de float (donde se le especifica el ancho de cada columna) u otro PdfPTable para realizar una copia. En nuestra caso, vamos a crear una tabla de 5 columnas y 3 filas. Para añadir una celda simplemente usamos el método addCell() que, al igual que el método add() de Document, nos permite añadir diferentes tipos de elementos, en esta ocasión vamos a añadir cadenas de caracteres.

import com.lowagie.text.pdf.PdfPTable;

// Insertamos una tabla.
PdfPTable tabla = new PdfPTable(5);
for (int i = 0; i < 15; i++) {
	tabla.addCell("Celda " + i);
}
documento.add(tabla);
  • Cerrando el documento

Por último, para que se guarde correctamente el fichero PDF debemos cerrarlo:

// Cerramos el documento.
documento.close();

El fichero PDF se almacenará en el directorio /MiPdf dentro del directorio de descargas de nuestro dispositivo. El fichero que hemos creado quedará así.

La aplicación completa está disponible en mi GitHub.

Etiquetado , ,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: