diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index e005d0b..bec50b9 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -2,6 +2,7 @@ module org.example.saladeconciertos {
     requires javafx.controls;
     requires javafx.fxml;
     requires java.sql;
+    requires org.apache.pdfbox;
 
 
     opens org.example.saladeconciertos to javafx.fxml;
diff --git a/src/main/java/org/example/saladeconciertos/PDFGenerator.java b/src/main/java/org/example/saladeconciertos/PDFGenerator.java
new file mode 100644
index 0000000..dba32d8
--- /dev/null
+++ b/src/main/java/org/example/saladeconciertos/PDFGenerator.java
@@ -0,0 +1,59 @@
+package org.example.saladeconciertos;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
+import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
+
+import java.io.File;
+import java.io.IOException;
+
+public class PDFGenerator {
+
+    public static void generarPDF(String eventName, String eventDate, String clientName, double totalPrice, String qrImagePath) {
+        // Ruta donde se guardará el PDF
+        String downloadsPath = System.getProperty("user.home") + "/Downloads/";
+        String fileName = "Ticket_" + eventName.replace(" ", "_") + ".pdf";
+        String pdfPath = downloadsPath + fileName;
+
+        try (PDDocument document = new PDDocument()) {
+            // Crear una nueva página
+            PDPage page = new PDPage();
+            document.addPage(page);
+
+            // Crear un flujo de contenido para la página
+            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
+                // Configurar la fuente y el tamaño (usando Standard14Fonts)
+                PDType1Font font = new PDType1Font(Standard14Fonts.FontName.HELVETICA_BOLD);
+                contentStream.setFont(font, 12);
+
+                // Escribir los detalles del ticket
+                contentStream.beginText();
+                contentStream.newLineAtOffset(50, 700);
+                contentStream.showText("Evento: " + eventName);
+                contentStream.newLineAtOffset(0, -20);
+                contentStream.showText("Fecha: " + eventDate);
+                contentStream.newLineAtOffset(0, -20);
+                contentStream.showText("Cliente: " + clientName);
+                contentStream.newLineAtOffset(0, -20);
+                contentStream.showText("Total: $" + String.format("%.2f", totalPrice));
+                contentStream.endText();
+
+                // Agregar la imagen del código QR (si existe)
+                if (qrImagePath != null && !qrImagePath.isEmpty()) {
+                    PDImageXObject qrImage = PDImageXObject.createFromFile(qrImagePath, document);
+                    contentStream.drawImage(qrImage, 50, 500, 150, 150); // Ajusta la posición y el tamaño de la imagen
+                }
+            }
+
+            // Guardar el PDF en la carpeta de descargas
+            document.save(pdfPath);
+            System.out.println("Ticket generado y guardado en: " + pdfPath);
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.out.println("Error al generar el PDF del ticket.");
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/example/saladeconciertos/VentanaPago.java b/src/main/java/org/example/saladeconciertos/VentanaPago.java
index c7a2741..e407ea9 100644
--- a/src/main/java/org/example/saladeconciertos/VentanaPago.java
+++ b/src/main/java/org/example/saladeconciertos/VentanaPago.java
@@ -8,11 +8,9 @@ import javafx.geometry.Insets;
 import javafx.geometry.Pos;
 import javafx.scene.layout.Priority;
 import javafx.scene.layout.Region;
-
 import java.sql.*;
 import java.util.List;
 import java.util.Map;
-import java.util.regex.Pattern;
 
 public class VentanaPago {
     private static final String DB_URL = "jdbc:mysql://sql10.freesqldatabase.com:3306/sql10766655";
@@ -156,8 +154,8 @@ public class VentanaPago {
 
         // Envolver el layout en un ScrollPane
         ScrollPane scrollPane = new ScrollPane(paymentLayout);
-        scrollPane.setFitToWidth(true);
-        scrollPane.setFitToHeight(true);
+        scrollPane.setFitToWidth(true); // Ajustar el ancho del contenido al ScrollPane
+        scrollPane.setFitToHeight(true); // Ajustar la altura del contenido al ScrollPane
 
         // Configurar la escena y mostrar la ventana
         Scene paymentScene = new Scene(scrollPane, 400, 450);
@@ -166,19 +164,18 @@ public class VentanaPago {
         paymentStage.show();
     }
 
-    // Método para validar tarjeta
     private boolean validarTarjeta(String cardNumber, String expiryDate, String cvv) {
         return cardNumber.matches("\\d{13}") && // 13 dígitos
                 expiryDate.matches("(0[1-9]|1[0-2])/[0-9]{2}") && // MM/YY
                 cvv.matches("\\d{3}"); // 3 dígitos
     }
 
-    // Método para validar email
     private boolean validarEmail(String email) {
-        return Pattern.compile("^[A-Za-z0-9+_.-]+@(.+)$").matcher(email).matches();
+        return email.matches("^[A-Za-z0-9+_.-]+@(.+)$"); // Validación básica de correo
     }
 
     private void generarTicket(String clientName, List<Integer> selectedSeats, Map<Integer, Double> seatPrices, String eventName, String eventDate, double totalPrice) {
+        // Mostrar el ticket en una ventana (como antes)
         StringBuilder ticketDetails = new StringBuilder();
         ticketDetails.append("Evento: ").append(eventName).append("\n");
         ticketDetails.append("Fecha: ").append(eventDate).append("\n");
@@ -191,6 +188,10 @@ public class VentanaPago {
 
         mostrarAlerta("Ticket Generado", "Detalles del Ticket", ticketDetails.toString());
 
+        // Generar el PDF del ticket usando la clase PDFGenerator
+        String qrImagePath = "src/main/resources/qrcode.png"; // Cambia esto por la ruta de tu imagen QR
+        PDFGenerator.generarPDF(eventName, eventDate, clientName, totalPrice, qrImagePath);
+
         // Actualizar el estado de los boletos comprados en la base de datos
         actualizarEstadoBoletos(selectedSeats, 1); // Cambia el idevento según corresponda
     }
diff --git a/src/main/resources/qrcode.png b/src/main/resources/qrcode.png
new file mode 100644
index 0000000..f795880
Binary files /dev/null and b/src/main/resources/qrcode.png differ