Cómo crear ticket en PDF con PHP en 3 pasos

Alfredo
Sígueme!
Últimas entradas de Alfredo (ver todo)
Ticket con FPDF
ticket PDF con PHP

Si dispones de algún ERP o POS y lo que quieres es crear ticket en PDF o una factura simplificada, este es tu POST.

Existen varias librerías para poder generar ficheros PDF en PHP, pero vamos a usar la librería FPDF.

¿Qué es FPDF?

Generar pdf con FPDF
FPDF es una librería para generar PDF con PHP.

FPDF es una clase PHP que permite generar ficheros PDF con PHP (no utiliza la biblioteca PDFlib). Es gratuito: puedes usarlo y modificarlo para cualquier tipo de uso.

FPDF tiene son:

  • Selección de unidad de medida, formato de página y márgenes.
  • Encabezado de página y gestión de pie de página.
  • Salto de página automático.
  • Salto de línea automático y justificación de texto.
  • Soporte de imágenes (JPEG, PNG y GIF).
  • Colores.
  • Enlaces.
  • TrueType, Type1 y soporte de codificación.
  • Compresión de página.

FPDF no requiere extensión (excepto Zlib para habilitar la compresión y GD para soporte GIF). La última versión requiere al menos PHP 5.1.

Empezamos..

  1. Vamos a crear un fichero php, lo vamos a llamar factura.php
  2. Descargamos la última versión que ofrece FPDF que es la versión 1.81.
  3. Enlazamos la librería con nuestro fichero mediante “require”.
  4. (Opcional) Almacenamos en una constante el símbolo Euro.
  5. Llamamos a la función FPDF y tenemos que pasar 3 parámetros:
    • Orientación de la página:
      • (P) Vertical
      • (L) Horizontal
    • Unidad de medida:
      • (pt) Punto
      • (mm) Milímetro
      • (cm) Centímetro
      • (in) Pulgada
    • Tamaño de la Página:
      • A3
      • A4 (Por defecto)
      • A5
      • Carta
      • Documento legal
      • Personalizado ► array(x,y) ► El ancho del ticket es de 80mm y de largo añadimos 150mm
  6. Añadimos la página del PDF.

Este sería el resultado:

// CONFIGURACIÓN PREVIA
require('fpdf181/fpdf.php');
define('EURO',chr(128)); // Constante con el símbolo Euro.
$pdf = new FPDF('P','mm',array(80,150)); // Tamaño tickt 80mm x 150 mm (largo aprox)
$pdf->AddPage();

Preparamos la cabecera del ticket en PDF

En la cabecera vamos a poner los datos de la empresa, CIF, dirección, teléfono y página web. Las funciones que nos vamos a encontrar en el siguiente código son:

  • SetFont. Deberemos de rellenar los siguientes parámetros:
    • Fuente (Escribimos el nombre de la fuente)
    • Estilo:
      • Vacío Normal
      • B Negrita
      • I Itálica
      • U Subrayado
    • Tamaño (valor en pt)
  • Cell. Imprime una celda con bordes, color de fondo y un string. La posición inicial se ubica arriba a la izquierda. El texto puede estar alineado o centrado. (Opcional) existe la posibilidad de añadir un enlace al string. Estos son los parámetros que hay que rellenar:
    • Anchura de la celda. Si es 0, la celda se extiende hasta el margen derecho.
    • Altura de la celda. Por defecto es 0
    • La cadena o el string a imprimir.
    • Borde en la celda:
      • 1 Si
      • 0 No (Por defecto)
      • O una cadena que contiene algunos o todos los siguientes caracteres (en cualquier orden):
        • L: Izquierda
        • T: Parte superior
        • R: Derecha
        • B: Parte inferior
    • Indica en qué posición debe de ir la celda después de la llamada. Poner 1es equivalente a poner 0y llamar a Ln () justo después. Hay 3 opciones:
      • 0Derecha
      • 1 Al comienzo de la siguiente línea
      • 2 Abajo
    • Permite centrar o alinear el texto. Los valores posibles son:
      • L (o vacío) Alinear texto a la izquierda (valor predeterminado)
      • C: Alinear texto al centro
      • R: Alinear texto a la derecha
    • Opcional: Indica si el fondo de la celda debe estar pintado ( true) o transparente ( false).
    • Opcional: URL del enlace.
  • Ln. Realiza uno o varios saltos de línea. Vuelve al márgen izquierdo y según la cantidad pasada como parámetro, se sitúa más abajo.

// CABECERA
$pdf->SetFont('Helvetica','',12);
$pdf->Cell(60,4,'Lacodigoteca.com',0,1,'C');
$pdf->SetFont('Helvetica','',8);
$pdf->Cell(60,4,'C.I.F.: 01234567A',0,1,'C');
$pdf->Cell(60,4,'C/ Arturo Soria, 1',0,1,'C');
$pdf->Cell(60,4,'C.P.: 28028 Madrid (Madrid)',0,1,'C');
$pdf->Cell(60,4,'999 888 777',0,1,'C');
$pdf->Cell(60,4,'alfredo@lacodigoteca.com',0,1,'C');

// DATOS FACTURA        
$pdf->Ln(5);
$pdf->Cell(60,4,'Factura Simpl.: F2019-000001',0,1,'');
$pdf->Cell(60,4,'Fecha: 28/10/2019',0,1,'');
$pdf->Cell(60,4,'Metodo de pago: Tarjeta',0,1,'');

Ahora añadimos el listado de los productos.A la hora de repetir las celdas de los productos, lo más sencillo sería utilizar un WHILEcon una sentencia de SQL. Otra función que nos vamos a encontrar en el siguiente código es:

  • Multicell. A diferencia de Cell, permite imprimir texto con saltos de línea automáticos. También se puede hacer un salto de línea manual (con el carácter \n). Crea tantas celdas como sean necesarias son creadas, uno debajo de otra.
    El texto puede ser alineado, centrado o justificado. El bloque de celda puede ser enmarcado y el fondo impreso.
    Los siguientes parámetros son:
    • Anchura de las celdas. Si es 0, las celdas se extiende hasta el margen derecho.
    • Altura de las celdas. Por defecto es 0
    • La cadena o el string a imprimir.
    • Opcional: Borde en las celdas:
      • 1 Si
      • 0 No (Por defecto)
      • O una cadena que contiene algunos o todos los siguientes caracteres (en cualquier orden):
        • L: Izquierda
        • T: Parte superior
        • R: Derecha
        • B: Parte inferior
    • Opcional: Permite centrar o alinear el texto. Los valores posibles son:
      L: Alinear texto a la izquierda
      C: Alinear texto al centro
      R: Alinear texto a la derecha
      J: Justificado (valor por defecto)
    • Opcional: Indica si el fondo de la celda debe estar pintado (true) o transparente (false).

// COLUMNAS
$pdf->SetFont('Helvetica', 'B', 7);
$pdf->Cell(30, 10, 'Articulo', 0);
$pdf->Cell(5, 10, 'Ud',0,0,'R');
$pdf->Cell(10, 10, 'Precio',0,0,'R');
$pdf->Cell(15, 10, 'Total',0,0,'R');
$pdf->Ln(8);
$pdf->Cell(60,0,'','T');
$pdf->Ln(0);

// PRODUCTOS
$pdf->SetFont('Helvetica', '', 7);
$pdf->MultiCell(30,4,'Manzana golden 1Kg',0,'L'); 
$pdf->Cell(35, -5, '2',0,0,'R');
$pdf->Cell(10, -5, number_format(round(3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(2*3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Malla naranjas 3Kg',0,'L'); 
$pdf->Cell(35, -5, '1',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Uvas',0,'L'); 
$pdf->Cell(35, -5, '5',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1*5,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);

Ahora el pie de pagina del ticket

Ya casi estamos acabando nuestro ticket en PDF. En el pie de página vamos a poner la suma de los precios de los artículos,descuentos,total sin IVA,incremento del IVA, el total del IVA y para finalizar, poner el periodo de devoluciones o simplemente poner el típico mensaje como “Gracias por su compra”.

Tip: Si quieres ver como se formatea un número para los precios, totales del IVA, lee el siguiente POST.

Por último: Debemos indicar cómo queremos que interactúe nuestro ticket en PDF. Para ello vamos a utilizar el parámetro:

  • Output. Cierra y envía el documento a un destino. Los parámetros a enviar son:
    • Destino del documento:
      • I (Por defecto) : Muestra el documento en el navegador web.
      • D: Muestra el documento en el navegador web y fuerza al usuario a descargar el PDF.
      • F: Guarda el documento en el servidor web.
      • S: Devuelve el documento como una cadena.
    • Nombre del documento
    • Códificación del nombre del documento. Indica si el nombre del documento es codificado en ISO-8859-1 (false) ó UTF-8 (true). Solo usa destinos I y D. El valor por defecto es false.

// SUMATORIO DE LOS PRODUCTOS Y EL IVA
$pdf->Ln(6);
$pdf->Cell(60,0,'','T');
$pdf->Ln(2);    
$pdf->Cell(25, 10, 'TOTAL SIN I.V.A.', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'I.V.A. 21%', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)),2)-round((round(2*3,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'TOTAL', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round(12.25,2), 2, ',', ' ').EURO,0,0,'R');

// PIE DE PAGINA
$pdf->Ln(10);
$pdf->Cell(60,0,'EL PERIODO DE DEVOLUCIONES',0,1,'C');
$pdf->Ln(3);
$pdf->Cell(60,0,'CADUCA EL DIA  01/11/2019',0,1,'C');

$pdf->Output('ticket.pdf','i');

Ahora todo junto…

<?php
// CONFIGURACIÓN PREVIA
require('fpdf181/fpdf.php');
define('EURO',chr(128));
$pdf = new FPDF('P','mm',array(80,150));
$pdf->AddPage();

// CABECERA
$pdf->SetFont('Helvetica','',12);
$pdf->Cell(60,4,'Lacodigoteca.com',0,1,'C');
$pdf->SetFont('Helvetica','',8);
$pdf->Cell(60,4,'C.I.F.: 01234567A',0,1,'C');
$pdf->Cell(60,4,'C/ Arturo Soria, 1',0,1,'C');
$pdf->Cell(60,4,'C.P.: 28028 Madrid (Madrid)',0,1,'C');
$pdf->Cell(60,4,'999 888 777',0,1,'C');
$pdf->Cell(60,4,'alfredo@lacodigoteca.com',0,1,'C');

// DATOS FACTURA        
$pdf->Ln(5);
$pdf->Cell(60,4,'Factura Simpl.: F2019-000001',0,1,'');
$pdf->Cell(60,4,'Fecha: 28/10/2019',0,1,'');
$pdf->Cell(60,4,'Metodo de pago: Tarjeta',0,1,'');

// COLUMNAS
$pdf->SetFont('Helvetica', 'B', 7);
$pdf->Cell(30, 10, 'Articulo', 0);
$pdf->Cell(5, 10, 'Ud',0,0,'R');
$pdf->Cell(10, 10, 'Precio',0,0,'R');
$pdf->Cell(15, 10, 'Total',0,0,'R');
$pdf->Ln(8);
$pdf->Cell(60,0,'','T');
$pdf->Ln(0);

// PRODUCTOS
$pdf->SetFont('Helvetica', '', 7);
$pdf->MultiCell(30,4,'Manzana golden 1Kg',0,'L'); 
$pdf->Cell(35, -5, '2',0,0,'R');
$pdf->Cell(10, -5, number_format(round(3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(2*3,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Malla naranjas 3Kg',0,'L'); 
$pdf->Cell(35, -5, '1',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1.25,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);
$pdf->MultiCell(30,4,'Uvas',0,'L'); 
$pdf->Cell(35, -5, '5',0,0,'R');
$pdf->Cell(10, -5, number_format(round(1,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Cell(15, -5, number_format(round(1*5,2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);

// SUMATORIO DE LOS PRODUCTOS Y EL IVA
$pdf->Ln(6);
$pdf->Cell(60,0,'','T');
$pdf->Ln(2);    
$pdf->Cell(25, 10, 'TOTAL SIN I.V.A.', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'I.V.A. 21%', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round((round(12.25,2)),2)-round((round(2*3,2)/1.21),2), 2, ',', ' ').EURO,0,0,'R');
$pdf->Ln(3);    
$pdf->Cell(25, 10, 'TOTAL', 0);    
$pdf->Cell(20, 10, '', 0);
$pdf->Cell(15, 10, number_format(round(12.25,2), 2, ',', ' ').EURO,0,0,'R');

// PIE DE PAGINA
$pdf->Ln(10);
$pdf->Cell(60,0,'EL PERIODO DE DEVOLUCIONES',0,1,'C');
$pdf->Ln(3);
$pdf->Cell(60,0,'CADUCA EL DIA  01/11/2019',0,1,'C');

$pdf->Output('ticket.pdf','i');
?>

¡Ya tienes tu ticket en PDF con PHP!

ticket en PDF
ticket PDF con PHP

Si necesitas más parámetros puedes verlos aquí o si quieres probar con otras librerías, aquí te mostramos las 5 librerías para generar PDF en PHP.

Nuevo: Enviar ticket por email

Para enviar el ticket por email, vamos a utilizar el framework PHPMailer (en el siguiente enlace dejo cómo descargarlo, instalarlo y configurarlo). Lo colocamos junto a la invocación de la librería FPDF.

que vamos a realizar es invocar la librería de PHPMailer, que muestre el ticket por pantalla y que lo almacene en el servidor.

require('phpmailer/PHPMailer.php');
require('phpmailer/SMTP.php');
require('phpmailer/Exception.php');
require('phpmailer/OAuth.php');

Si añadimos 2 salidas del Output del pdf, en el segundo parámetro ponemos ‘f’ e ‘i’ en dos líneas, vamos a poder visualizar el ticket y lo almacena en el servidor. Esto lo colocaremos al final del código del generador de tickets en PDF, vamos a añadir debajo lo siguiente:

$pdf->Output($doc,'f');
$pdf->Output($doc,'i');

Ahora, vamos a integrar PHPMailer en nuestro ticket:

// Inicializamos PHPMailer
$mail = new PHPMailer\PHPMailer\PHPMailer();

try {
//Configuración de PHPMailer
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->Host = '(HOST SERVIDOR DE CORREO)';
$mail->Username   = '(USUARIO DEL HOST DE CORREO)';  
$mail->Password = '(CONTRASEÑA)';
$mail->Port = 587;

//Configurar remitentes y destinatarios
$mail->setFrom('alfredo@lacodigoteca.com', 'Lacodigoteca.com');
$mail->addAddress('alfredo@lacodigoteca.com', 'Lacodigoteca.com');
$mail->addReplyTo('alfredo@lacodigoteca.com', 'Alfredo Lacodigoteca');
$mail->addBCC('buzon@lacodigoteca.com');

//Añadimos documentos adjuntos al correo
$mail->addAttachment($doc);

//Cuerpo del correo electrónico
$mail->isHTML(true);  
$mail->CharSet = "utf-8";
// Set email format to HTML
$mail->Subject = '[Lacodigoteca] - Factura simpl. XXXXX';
$mail->Body    = 'Hola <b>Alfredo</b><br>Te enviamos el ticket de compra.<br> Un saludo.';
$mail->AltBody = 'Hola Alfredo. Te enviamos el ticket de compra.Un saludo.'; // Si no tienen habilitado el correo HTML

//Enviamos el correo
$mail->send();

//Eliminamos el ticket que hemos almacenado temporalmente en el servidor.
unlink($doc);

}catch (Exception $e) {
    echo "No se ha podido enviar el mensaje. Mailer Error: {$mail->ErrorInfo}";
}

Si necesitas saber más información con profundidad, te invito a que pases al siguiente POST:

Cómo enviar correos con PHPMailer

Alfredo

Desarrollador web de profesión (.NET, jQuery, JavaScript y SQL Server). Amante del fútbol y los videojuegos. Escribo en este blog sobre temas de programación que me parecen interesantes y que quiero compartir con todo el mundo.

También te podría gustar...

5 Respuestas

  1. oliver Veliz dice:

    Con un afectuoso saludo, queria agradecer por este gran aporte en el uso de Fpdf para imprimir tickets, sin embargo queira saber que luego de hacer varios intentos por hacer los tickes para ser impresos en impresoras matriciales o termicas, los caracteres o letras me salen montados, me podria ayudar que me recomienda para esto!!!

    • Alfredo dice:

      Hola Oliver,

      Puede ser que el texto que quieres imprimir, sea más grande que las dimensiones de la Cell. Yo haría dos comprobaciones:
      1- Prueba con poner un texto más pequeño y comprobar que no se te monta los caracteres.
      2- Si es así del paso 1, tienes que utilizar Multicell.

      Un saludo.

  2. Oliver Veliz dice:

    Muchas gracias mi estimado Alfredo, voy a probar configurando nuevamente las dimensiones del cel o por ultimo utilizar los multiCell, muy amable gracias por su ayuda, cualquier cosa le indico por este medio…saludos

  3. Oliver Veliz dice:

    Mi estimado Alfredo como esta!!! le comento que probe lo que ud me sugirio en cuanto a modificar las dimensiones de los campos Cell, pero no consigo imprimir bien, me sigue saliendo los caracteres montados apesar de que he aumentado el espacio de los campos cell, ademas apesar de que tengo configurado el formato de impresion para A5 en ves de salir la impresión en este formato, me sale reducido el ancho de la impresion, adjunto el codigo haber si me puede ayudar a corregirlo, este mismo problema tengo en otros formatos, A6, A4, y tambien en formatos de 74mm X 210 mm y asi otros le comento que llevo tiempo haciendo este tipo de reportes pero no salen bien, la impresora que al momento estoy trabajando es una Epson LX-350 matricial.

    Codigo :

    IncludeJS($script);
    }
    }

    //ob_start();

    $id_cabecera=valida_datos($_GET[“id_cabecera”], “numero”, “si”);
    $accion=$_GET[“accion”];
    /*
    $cadena1=””;
    $cadena1.=””;
    $cadena1.= “”;

    $sql=”Select * from empresa, factura …. etc etc etc.”;

    $ins=ejecutar_sql($sql, $conexion);

    $campo=obtener_dato($ins);

    $cadena1.=”FECHA:“.$campo[‘fecha_emision’].”NUMERO:“.$campo[‘nro_comprovante’].””;

    $cadena1.=”CLIENTE:“.$campo[‘razon_social’].”TELÉFONO:“.$campo[‘telefono’].””;

    $cadena1.=”DIRECCIÓN:“.$campo[‘direccion’].””;

    $cadena1.=”RUC/CI:“.$campo[‘nro_documento’].”HORA:“.$campo[‘hora’].””;

    $cadena1.=””;

    $cadena2=””;

    $cadena2.=”ProductoP.U.Cant.Subtotal“;

    $sql=”Select * from productos, detalle_factura…etc etc”; “;

    $ins=ejecutar_sql($sql, $conexion);

    while($campo_cesta=obtener_datos($ins)){
    if($campo_cesta[‘porcentaje_impuesto’]==”0″){

    $cadena2.=””.cortar_cadena($campo_cesta[‘denominacion_comercial’],25).””.number_format($campo_cesta[‘precio’],2).””.$campo_cesta[‘cantidad’].””.$campo_cesta[‘subtotal’].””;

    }else{

    $cadena2.=”*”.cortar_cadena($campo_cesta[‘denominacion_comercial’],25).””.number_format($campo_cesta[‘precio’],2).””.$campo_cesta[‘cantidad’].””.$campo_cesta[‘subtotal’].””;

    }
    }

    $campo=traeregistro(“cabecera, persona, usuario, modo_pago”, “cabecera.id_tipo_movimiento=’2′ and cabecera.id_modo_pago=modo_pago.id_modo_pago and cabecera.id_usuario=usuario.id_usuario and cabecera.id_persona=persona.id_persona and cabecera.id_cabecera”, $id_cabecera);

    $nro_total_items=20;

    $items_restantes=($nro_total_items-$campo[‘nro_items’]);

    //genero las filas restantes para el espacio de los productos
    for($i=1; $i<=$items_restantes; $i++){

    $cadena2.="    “;

    }
    $cadena2.=”SUBTOTAL 12%“.$campo[‘subtotal_con_impuesto’].””;
    $cadena2.=”SUBTOTAL 0%“.$campo[‘subtotal_sin_impuesto’].””;
    $cadena2.=”IVA “.$campo[‘impuesto’].””;
    $cadena2.=”DESC.“.$campo[‘descuento’].””;
    $cadena2.=”TOTAL“.$campo[‘total’].””;
    $cadena2.=”FORMA DE PAGO: “.$campo[‘denominacion’].””;
    $cadena2.=”ATENTIDO POR: “.$campo[‘usuario’].””;
    $cadena2.=””;

    //ob_end_clean();

    $html = $cadena1 . $cadena2;
    */

    //POR DEFECTO
    //$pdf = new PDF_AutoPrint(‘P’,’mm’,’A4′);

    $pdf = new PDF_AutoPrint(‘P’,’mm’, ‘A5’);

    //izquierda, superior, derecha
    $pdf->SetMargins(10,45,10);
    $pdf->SetAutoPageBreak(true,5);

    //DIFERENTES TAMAÑOS DE IMPRESION DE MODOS TICKETS//

    //FORMATO 1 – TICKET
    //$pdf = new PDF_AutoPrint(‘P’,’mm’, array(74,85));
    //FORMATO 2 – MEDIA CARTA
    //$pdf = new PDF_AutoPrint(‘P’,’mm’, array(74,140));
    //FORMATO 3 CARTA
    //$pdf = new PDF_AutoPrint(‘P’,’mm’, array(74,210));
    //FORMATO OTRO TIPO
    //$pdf = new PDF_AutoPrint(‘P’,’mm’, array(74,280));

    ////////////////////////////////////////////////////

    $pdf->AddPage();
    $pdf->SetFont(‘Times’, ”, 8);

    $sql=”select * from factura, persona…etc etc etc “;
    $ins=ejecutar_sql($sql, $conexion);
    $campo=obtener_dato($ins);

    $fecha_emision=traer_fecha_nominal($campo[‘fecha_emision’]);
    //$pdf->Text(90, 50, $html);

    $pdf->Ln();
    $pdf->Ln();
    //$pdf->Ln();

    $pdf->Cell(15,6,’ ‘,0);
    $pdf->Cell(70,6,$fecha_emision,0);

    $pdf->Cell(15,6,’ ‘,0);
    $pdf->Cell(30,6,$campo[‘nro_documento’],0,1,’L’);

    $pdf->Cell(15,6,’ ‘,0);
    $pdf->Cell(70,6,$campo[‘razon_social’],0);

    $pdf->Cell(15,6,’ ‘,0);
    $pdf->Cell(30,6,$campo[‘telefono’],0,1,’L’);

    $pdf->Cell(15,6,’ ‘,0);
    $pdf->Cell(70,6,$campo[‘direccion’],0,1,’L’);

    //$pdf->Cell(15,3,”,0);
    //$pdf->Cell(10,3,$campo[‘hora’],0,1,’C’);

    //$pdf->Cell(10,3,’————————‘,0);
    //$pdf->Cell(80,3,’————————————————————————————————- ‘,0);
    //$pdf->Cell(20,3,’———————— ‘,0);
    //$pdf->Cell(20,3,’———————— ‘,0,1,’C’);

    //$pdf->Cell(10,3,’CANT ‘,0);
    //$pdf->Cell(80,3,’DESCRIPCION PRODUCTO ‘,0,”,’C’);
    //$pdf->Cell(20,3,’P.U. ‘,0);
    //$pdf->Cell(20,3,’P.TOTAL ‘,0,1,’C’);

    //$pdf->Cell(10,3,’———————— ‘,0);
    //$pdf->Cell(80,3,’————————————————————————————————- ‘,0);
    //$pdf->Cell(20,3,’———————— ‘,0);
    //$pdf->Cell(20,3,’———————— ‘,0,1,’C’);

    //CONSULTA DE LOS PRODUCTOS//

    $pdf->Ln();
    $pdf->Ln();
    //$pdf->Ln();

    $sql=”select * from cabecera, detalle_cabecera, producto, tipo_movimiento where cabecera.id_tipo_movimiento=’2′ and cabecera.id_tipo_movimiento=detalle_cabecera.id_tipo_movimiento and cabecera.id_tipo_movimiento=tipo_movimiento.id_tipo_movimiento and cabecera.id_cabecera=detalle_cabecera.id_cabecera and detalle_cabecera.id_producto=producto.id_producto and cabecera.id_cabecera=’$id_cabecera'”;

    $ins=ejecutar_sql($sql, $conexion);

    while($campo = obtener_datos($ins)){

    $denominacion_comercial=cortar_cadena2($campo[‘denominacion_comercial’],45);

    $precio=number_format($campo[precio_unitario_item],2,’.’,”);

    $pdf->Cell(15,6,$campo[‘cantidad’],0,”,’L’);
    $pdf->Cell(70,6,$denominacion_comercial,0,”,’L’);
    $pdf->Cell(25,6,$precio,0,”,’R’);
    $pdf->Cell(20,6,$campo[‘subtotal’],0,1,’R’);
    }

    $campo=traeregistro(“cabecera, persona, usuario, modo_pago”, “cabecera.id_tipo_movimiento=’2′ and cabecera.id_modo_pago=modo_pago.id_modo_pago and cabecera.id_usuario=usuario.id_usuario and cabecera.id_persona=persona.id_persona and cabecera.id_cabecera”, $id_cabecera);

    $nro_total_items=16;

    $items_restantes=($nro_total_items-$campo[‘nro_items’]);

    //genero las filas restantes para el espacio de los productos
    for($i=1; $iCell(10,6,’.’,0);
    //$pdf->Cell(80,6,”,0);
    //$pdf->Cell(20,6,”,0);
    //$pdf->Cell(20,6,”,0,1,’C’);
    $pdf->Ln();

    }

    if($campo[id_modo_pago]==”1″){

    $pago_efectivo=” X “;

    }elseif($campo[id_modo_pago]==”17″){

    $pago_dinero_electronico=” X “;

    }elseif($campo[id_modo_pago]==”16″ || $campo[id_modo_pago]==”19″){

    $pago_tarjeta_debito_credito=” X “;

    }else{

    $pago_otros=” X “;

    }

    $pdf->Cell(80,6,”,0);
    //$pdf->Cell(15,3,”,0);
    $pdf->Cell(30,6,’ ‘,0);//subtotal 12%
    $pdf->Cell(20,6,$campo[‘subtotal_con_impuesto’],0,1,’R’);

    $pdf->Cell(80,6,”,0);
    //$pdf->Cell(15,3,”,0);
    $pdf->Cell(30,6,$pago_efectivo,0);// subtotal 0%
    $pdf->Cell(20,6,$campo[‘subtotal_sin_impuesto’],0,1,’R’);

    $pdf->Cell(80,6,”,0);
    //$pdf->Cell(15,3,”,0);
    $pdf->Cell(30,6,$pago_dinero_electronico,0);// Descuento
    $pdf->Cell(20,6,$campo[‘descuento’],0,1,’R’);

    $pdf->Cell(80,6,”,0);
    //$pdf->Cell(15,3,”,0);
    $pdf->Cell(30,6,$pago_tarjeta_debito_credito,0);//Iva
    $pdf->Cell(20,6,$campo[‘impuesto’],0,1,’R’);

    $pdf->Cell(80,6,”,0);
    //$pdf->Cell(15,3,”,0);
    $pdf->Cell(30,6,$pago_otros,0);//Total
    $pdf->Cell(20,6,$campo[‘total’],0,1,’R’);

    //$pdf->Cell(25,5,’FORMA DE PAGO ‘,0);
    //$pdf->Cell(35,5,$campo[‘denominacion’],0,1,’L’);

    //$pdf->Cell(25,5,’ATENDIDO POR ‘,0);
    //$pdf->Cell(35,5,$campo[‘usuario’],0,0,’L’);

    //$pdf->WriteHTML(‘Hola men‘);
    $pdf->AutoPrint();
    $pdf->Output(‘Comprobante_Venta_’.$campo[nro_comprovante].”,’I’);

    ?>

    Por su atencion de antemano le gradezco mi estimado Aldredo…

    Saludos

    • Alfredo dice:

      Buenos días Oliver,

      Para comprobar que es correcto. Yo recogería el código de ejemplo y lo imprimiría. Yo no soy partidario de concatenar datos (que por ahí puede venir tu problema) ya que puede alterar las medidas de las celdas.

      Un saludo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies
A %d blogueros les gusta esto: