Como generar un archivo pdf en android studio

Hola amig@s como están espero que bien hoy veremos un nuevo tutorial, algunos usuarios han estado preguntando como crear un archivo pdf en android y este se guarde dentro de nuestro dispositivo movil, primero les invito a que revisen un post anterior donde veíamos como crear una app que nos permita leer archivos pdf:

como hacer una aplicación que lea archivos pdf online en android studio

Sin mas rodeos empezamos con el tutorial:

Como generar un archivo pdf en android studio

Primero tenemos que crear nuestra interfaces el cual consistirá en un solo boton al que llamaremos btngenerar, es de lo mas sencillo algo como la siguiente imagen:

Yo no debería dejar el código es un simple botón, pero ya se eres don vergas y doña vergas y hasta apuesto a que te sale error poniendo un botón  por eso te dejo el código del activity_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.androfast.pc.appgenerarpdf.MainActivity">

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

</android.support.constraint.ConstraintLayout>

Ahora antes de empezar con el código, les comento que tendremos que utilizar una librería de tipo .jar el cual nos permitirá utilizar colores tipo de letras y demás herramientas para crear nuestro archivo pdf.
Sino sabes como agregar una librería te recomiendo que pases por este tutorial, donde lo aprenderás hacer en dos minutos:

Como importar una librería en android studio

Si ya sabes como? proseguimos con el tutorial, descargate la siguiente librería:
droidText0.4.jar
Ya sabes que esta librería debe estar dentro de la carpeta lib.

Después tenemos que agregarlo a nuestro build.gradle como vemos al final del siguiente código dentro de dependencies.

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile files('libs/droidText.0.4.jar')
}

Debes agregar una imagen con el nombre logo dentro de tu carpeta Drawable

Ahora si podemos usar el código en nuestro MainActivity.

package com.androfast.pc.appgenerarpdf;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import harmony.java.awt.Color;

public class MainActivity extends AppCompatActivity {
private final static String NOMBRE_DIRECTORIO = "MiPdf";
private final static String NOMBRE_DOCUMENTO = "prueba.pdf";
private final static String ETIQUETA_ERROR = "ERROR";
Button btnGenerar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Permisos.
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,}, 1000);
} else {
}
// Generaremos el documento al hacer click sobre el boton.
btnGenerar=(Button) findViewById(R.id.btnGenerar);
btnGenerar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
generarPdf();
Toast.makeText(MainActivity.this, "Se creo tu archivo pdf", Toast.LENGTH_SHORT).show();

}

});
}


public void generarPdf() {

// Creamos el documento.
Document documento = new Document();

try {

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 writer = PdfWriter.getInstance(documento, ficheroPdf);

// Incluimos el pie de pagina y una cabecera
HeaderFooter cabecera = new HeaderFooter(new Phrase(
"Esta es mi cabecera"), false);
HeaderFooter pie = new HeaderFooter(new Phrase(
"Este es mi pie de pagina"), false);

documento.setHeader(cabecera);
documento.setFooter(pie);

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

// Añadimos un titulo con la fuente por defecto.
documento.add(new Paragraph("Titulo 1"));

Font font = FontFactory.getFont(FontFactory.HELVETICA, 28,
Font.BOLD, Color.RED);
documento.add(new Paragraph("Titulo personalizado", font));

// Insertamos una imagen que se encuentra en los recursos de la
// aplicacion.
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);

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

// Agregar marca de agua
font = FontFactory.getFont(FontFactory.HELVETICA, 42, Font.BOLD,
Color.GRAY);
ColumnText.showTextAligned(writer.getDirectContentUnder(),
Element.ALIGN_CENTER, new Paragraph(
"androfast.com", font), 297.5f, 421,
writer.getPageNumber() % 2 == 1 ? 45 : -45);

} catch (DocumentException e) {

Log.e(ETIQUETA_ERROR, e.getMessage());

} catch (IOException e) {

Log.e(ETIQUETA_ERROR, e.getMessage());

} finally {
// Cerramos el documento.
documento.close();
}
}


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

/**
* Obtenemos la ruta donde vamos a almacenar el fichero.
*
* @return
*/
public static File getRuta() {

// El fichero sera 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;
}

}

Revisemos un poco el cogido
La primera linea da el nombre a nuestra carpeta donde se guardara el archivo pdf
La segunda linea da el nombre al archivo pdf

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

Lo demás esta comentado linea por linea, para que veas donde se guardo tu documento debes ir a la memoria interna de tu móvil–descargas.

También debes de agregar estos dos permisos en tu AndroidManifest

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

ENLACES DE INTERÉS:

como hacer una aplicación que lea archivos pdf online en android studio

2 comentarios en «Como generar un archivo pdf en android studio»

  1. Victor Camacho

    i have an error in the line:
    Image imagen = Image.getInstance(stream.toByteArray());

    java.lang.UnsatisfiedLinkError: No implementation found for long org.apache.harmony.awt.gl.color.NativeCMM.cmmOpenProfile(byte[]) (tried Java_org_apache_harmony_awt_gl_color_NativeCMM_cmmOpenProfile and Java_org_apache_harmony_awt_gl_color_NativeCMM_cmmOpenProfile___3B)

  2. Leonardo

    Buenas noches muchas gracias por tu aporte!!!.

    Lo seguí al pie de la letra y me genera el pdf exactamente igual al tuyo pero sin la tabla ni la marca de agua. Agradezco si me puedas ayudar.

    Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

WhatsApp chat