Crear PDF con PHP y FPDF

En este artículo vamos a ver como crear pdf con PHP, usando la librería FPDF, la misma está escrita totalmente en PHP lo que nos libera de usar una librería externa como PDFlib. Para saber más sobre FPDF haz click aquí.

Crear un PDF en PHP es simple, lo primero que debemos hacer es bajarnos la clase desde aqui, luego debemos copiarla a nuestro directorio de trabajo y estamos listos para empezar.

Veamos un ejemplo:

AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'¡Hola, Mundo!');
$pdf->Output();
?>

El código anterior es simple y claro, incluimos la clase mediante «require», creamos una instancia de la misma, agregamos una página con «AddPage», seteamos la fuente a usar, definimos un rectángulo donde aparecerá el texto y finalmente creamos el pdf con «output».

Ahora que conocemos las funciones básicas, vamos a hacer algo mas avanzado, supongamos que queremos imprimir 100 recibos donde queremos cambiar el número de recibo automáticamente.

Aquí es donde entra en juego la colección de clases de FPDI, que permite leer documentos PDF y tratarlos como templates desde FPDF, para bajarte FPDI puedes hacerlo desde aqui.

Siguiendo con la situación planteada:

setSourceFile($template_pdf);

 // seteamos la fuente, el estilo y el tamano 
$pdf->SetFont('Times','B',10);

// seteamos la posicion inicial
$pdf->SetXY(25, 80);

// iteramos 100 veces, una por recibo
for($i=0; $i < 100; $i++){
	//agregamos una pagina
        $pdf->AddPage();
	// seleccionamos la primera pagina del docuemnto importado
	$tplIdx = $pdf->importPage(1);
	// usamos la pagina importado como template
	$pdf->useTemplate($tplIdx);
	//seteamos la posicion X		
	$pdf->SetX(25);
        //escribimos el numero de recibo
	$pdf->Write(0, "Numero: " . $i);
        //salto de linea
	$pdf->Ln(5);
}

//enviamos cabezales http para no tener problemas
header("Content-Transfer-Encoding", "binary");
header('Cache-Control: maxage=3600'); 
header('Pragma: public');

//enviamos el documento creado con un nombre nuevo y forzamos su descarga.
$pdf->Output('recibos.pdf', 'D');

?>

El código anterior genera un documento llamado recibos.pdf de 100 páginas, una por recibo (por favor, leer los comentarios en el código).

Es fácil darse cuenta que estas librerías son súmamente útiles a la hora de trabajar con documentos PDF, basta con leer la documentación oficial para comprender las posibilidades que nos ofrecen.

Juan Benitez

Fundador de Tecnopedia.net. Licenciado en Informática, desarrollador Web, Android y PHP. Apasionado de las tecnologías y el fútbol. Reparto mis días programando, creando sitios, apps o escribiendo en @Tecnopedianet... y sí, además tengo esposa y una hija ;)

View all posts by Juan Benitez →

14 thoughts on “Crear PDF con PHP y FPDF

  1. Estimado Amigo,
    El primer ejemplo sale correctamente.
    En el ejercicio de los recibos me sale el siguiente mensaje:
    FPDF error: Cannot open recibo_template.pdf !
    Muy amable por su ayuda.
    Saludos cordiales
    Richard

  2. Richard, en el segundo ejemplo asumimos que el archivo recibo_template.pdf ya existe, dado que partimos de un recibo pre armado al cual queremos cambiar el número nada más.
    Asi que te recomiendo que armes un archivo PDF (puede estar vacío) y lo renombres a recibo_template.pdf para que te funcione el ejemplo.

    saludos, Juan.

  3. Hola que tal use tu ejemplo, y pareciera que todo funciona correctamente, pero no me descarga el archivo, aun que si lo crea. me sale el siguiente error:
    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Podrias orientarme a que se debe.

  4. quiero hacer una constancia de estudio y que lo imprima en php de fpdf
    AddPage();

    /* seleccionamos el tipo, estilo y tamaño de la letra a utilizar */

    $pdf->SetFont(‘Helvetica’, ‘B’, 14);

    $pdf->Write (7,”HOLA ESTOY GENERANDO MI PRIMER PDF“,”http://AprendeAProgramarEnPHPya.com/blog”);

    $pdf->Ln();
    $pdf->Write (7,$_POST[‘aquiencorresponda’]);

    $pdf->Ln(); //salto de linea
    $pdf->Write (7,$_POST[‘nombre’]);

    $pdf->Ln(); //salto de linea

    $pdf->Write (7,$_POST[‘atentamente’]);

    $pdf->Ln(); //salto de linea

    $pdf->Write (7,$_POST[‘dependencia’]);

    $pdf->Ln(); //salto de linea
    $pdf->Write(60,7,$_POST[‘atentamente’],1,0,’C’);

    $pdf->Ln(15);//ahora salta 15 lineas

    $pdf->SetTextColor(’255′,’0′,’0′);//para imprimir en rojo

    $pdf->Multicell(190,7,$_POST[‘tel’].”\n esta es la prueba del multicell”,1,’R’);

    $pdf->Line(0,160,300,160);//impresión de linea

    $pdf->Output(“prueba.pdf”,’F’);

    echo “window.open(‘prueba.pdf’,’_self’,”);”;//para ver el archivo pdf generado

    exit;

    ?>
    me marca error Parse error: syntax error, unexpected T_STRING in C:\AppServ\www\Pruebas\fpdf\generador.php on line 21

  5. Hola Angel, en el ejemplo usamos un bucle for con una variable $i que nos dice la cantidad de paginas, ya que en cada iteración agregamos una nueva.
    Pero si salimos del ejemplo tenemos disponible el método $pdf->PageNo() que nos retorna la página actual del documento creado.
    Espero que te sirva, saludos.

  6. Buen Día Lic. Benitez,

    el caso que tengo es el siguiente:
    cree un documento en php usando la librería fpdf y la incluí en mi pagina, después modifique mi pagina para que sea adaptativa(responsive) con bootstrap. Para ahorrarme la tarea de crear una aplicación, con android studio genere un apk que llame a mi pagina, pero al intentar descargar desde el apk no funciona el link al archivo php que genera el pdf.

    espero que me pueda ayudar, gracias de antemano.

    Angel Laura.

  7. Hola Buenas tardes muy interesante y sobretodo muy util este post, solo tengo una consulta estoy tratando de varias paginas con datos jalados de mysql, pero tengo algunas clases de la libreria fpdf que no funcionan, todo lo demas funciona muy bien cuando comento dichas clases, espero me pueda ayudar. Muchas gracias de antemano.

    Ejem de clases

        function ImprimirTexto2($texto){
            $txt = $texto;
            //Se imprime
            $this->MultiCell(0,5,$txt);
        }

  8. hola me gustaria saber si se puede hacer una cell resposive por que yo estoy haciendo un pdf que el texto es de 20 pero lo tengo que poner en una cel de 10  no se si se puede hacer responcive o algo asi?

  9. Buen día. Como sería para generar los recibos, pero que se genere un archivo por cada recibo.

Comments are closed.