diff --git a/lib/debugger-app-3.0.4.jar b/lib/debugger-app-3.0.4.jar new file mode 100644 index 0000000..aa99e1e Binary files /dev/null and b/lib/debugger-app-3.0.4.jar differ diff --git a/lib/fontbox-3.0.4.jar b/lib/fontbox-3.0.4.jar new file mode 100644 index 0000000..d814425 Binary files /dev/null and b/lib/fontbox-3.0.4.jar differ diff --git a/lib/pdfbox-3.0.4.jar b/lib/pdfbox-3.0.4.jar new file mode 100644 index 0000000..bf0a91e Binary files /dev/null and b/lib/pdfbox-3.0.4.jar differ diff --git a/lib/pdfbox-app-3.0.4.jar b/lib/pdfbox-app-3.0.4.jar new file mode 100644 index 0000000..52d64ef Binary files /dev/null and b/lib/pdfbox-app-3.0.4.jar differ diff --git a/lib/pdfbox-tools-3.0.4.jar b/lib/pdfbox-tools-3.0.4.jar new file mode 100644 index 0000000..c6d59e0 Binary files /dev/null and b/lib/pdfbox-tools-3.0.4.jar differ diff --git a/lib/preflight-app-3.0.4.jar b/lib/preflight-app-3.0.4.jar new file mode 100644 index 0000000..27e6a7b Binary files /dev/null and b/lib/preflight-app-3.0.4.jar differ diff --git a/pom.xml b/pom.xml index a3f416f..f06dbef 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> - <version>2.0.24</version> + <version>3.0.3</version> </dependency> </dependencies> diff --git a/src/main/java/org/example/saladeconciertos/EscogerEvento.java b/src/main/java/org/example/saladeconciertos/EscogerEvento.java index ac44f13..1e2e964 100644 --- a/src/main/java/org/example/saladeconciertos/EscogerEvento.java +++ b/src/main/java/org/example/saladeconciertos/EscogerEvento.java @@ -13,6 +13,7 @@ import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.scene.control.ButtonType; +import java.io.InputStream; import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; @@ -184,10 +185,10 @@ public class EscogerEvento { alert.showAndWait().ifPresent(response -> { if (response == buttonTypePDF) { // Generar el PDF del reporte usando la clase PDFGenerator - String qrImagePath = "src/main/resources/qrcode.png"; // Cambia esto por la ruta de tu imagen QR + InputStream qrImageStream = getClass().getResourceAsStream("/qrcode.png"); // Cambia esto por la ruta de tu imagen QR String timestamp = new java.text.SimpleDateFormat("yyyy-MM-dd HH_mm").format(new java.util.Date()); String pdfFileName = "Reporte_"+eventName.replace(" ", "_")+"_" + timestamp + ".pdf"; - PDFGenerator.generarPDF(eventName, "", "", 0.0, qrImagePath, String.join("\n", seatDetails), pdfFileName); + PDFGenerator.generarPDF(eventName, "", "", 0.0, qrImageStream, String.join("\n", seatDetails), pdfFileName); } }); } diff --git a/src/main/java/org/example/saladeconciertos/PDFGenerator.java b/src/main/java/org/example/saladeconciertos/PDFGenerator.java index ac29bdc..832b560 100644 --- a/src/main/java/org/example/saladeconciertos/PDFGenerator.java +++ b/src/main/java/org/example/saladeconciertos/PDFGenerator.java @@ -4,14 +4,16 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import java.io.IOException; +import java.io.InputStream; public class PDFGenerator { // Método para generar un PDF con los detalles del reporte de ventas - public static void generarPDF(String eventName, String eventDate, String clientName, double totalPrice, String qrImagePath, String ticketDetails, String pdfFileName) { + public static void generarPDF(String eventName, String eventDate, String clientName, double totalPrice, InputStream qrImageStream, String ticketDetails, String pdfFileName) { // Ruta donde se guardará el PDF String downloadsPath = System.getProperty("user.home") + "/Downloads/"; String pdfPath = downloadsPath + pdfFileName; @@ -24,36 +26,48 @@ public class PDFGenerator { // Crear un flujo de contenido para la página try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) { // Configurar la fuente y el tamaño para el título del evento - contentStream.setFont(PDType1Font.HELVETICA_BOLD, 24); + PDType1Font fontBold = new PDType1Font(Standard14Fonts.FontName.HELVETICA_BOLD); + contentStream.setFont(fontBold, 24); contentStream.beginText(); contentStream.newLineAtOffset(50, 750); contentStream.showText(eventName); contentStream.endText(); // Configurar la fuente y el tamaño para la fecha del evento - contentStream.setFont(PDType1Font.HELVETICA_BOLD, 18); + contentStream.setFont(fontBold, 18); contentStream.beginText(); contentStream.newLineAtOffset(50, 720); + contentStream.showText(eventDate); contentStream.endText(); // Configurar la fuente y el tamaño para el contenido del reporte - contentStream.setFont(PDType1Font.HELVETICA, 12); + PDType1Font fontRegular = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + contentStream.setFont(fontRegular, 12); contentStream.beginText(); - contentStream.newLineAtOffset(50, 680); + float textY = 680; // Posición Y inicial del contenido + contentStream.newLineAtOffset(50, textY); // Dividir el texto en líneas y escribir cada línea por separado String[] lines = ticketDetails.split("\n"); for (String line : lines) { contentStream.showText(line); - contentStream.newLineAtOffset(0, -15); // Mover hacia abajo para la siguiente línea + textY -= 15; // Mover hacia abajo para la siguiente línea + contentStream.newLineAtOffset(0, -15); } - contentStream.endText(); + // Calcular la posición Y de la imagen (teniendo en cuenta su altura) + float imageHeight = 150; // Altura de la imagen + float imageY = textY - 50 - imageHeight; // 50 unidades de margen + altura de la imagen + // Agregar la imagen del código QR (si existe) - if (qrImagePath != null && !qrImagePath.isEmpty()) { - PDImageXObject qrImage = PDImageXObject.createFromFile(qrImagePath, document); - contentStream.drawImage(qrImage, 50, 50, 150, 150); // Ajusta la posición y el tamaño de la imagen + if (qrImageStream != null) { + try { + PDImageXObject qrImage = PDImageXObject.createFromByteArray(document, qrImageStream.readAllBytes(), "qrcode"); + contentStream.drawImage(qrImage, 50, imageY, 150, 150); // Ajusta la posición y el tamaño + } catch (IOException e) { + System.out.println("Error al cargar la imagen QR: " + e.getMessage()); + } } } @@ -67,7 +81,7 @@ public class PDFGenerator { } // Método para generar un PDF con los detalles del ticket de compra - public static void generarTicketPDF(String eventName, String eventDate, String clientName, double totalPrice, String qrImagePath, String ticketDetails, String pdfFileName) { + public static void generarTicketPDF(String eventName, String eventDate, String clientName, double totalPrice, InputStream qrImageStream, String ticketDetails, String pdfFileName) { // Ruta donde se guardará el PDF String downloadsPath = System.getProperty("user.home") + "/Downloads/"; String pdfPath = downloadsPath + pdfFileName; @@ -80,30 +94,41 @@ public class PDFGenerator { // Crear un flujo de contenido para la página try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) { // Configurar la fuente y el tamaño para el título - contentStream.setFont(PDType1Font.HELVETICA_BOLD, 20); + PDType1Font fontBold = new PDType1Font(Standard14Fonts.FontName.HELVETICA_BOLD); + contentStream.setFont(fontBold, 20); contentStream.beginText(); contentStream.newLineAtOffset(50, 750); contentStream.showText("Ticket de Compra"); contentStream.endText(); // Configurar la fuente y el tamaño para el contenido - contentStream.setFont(PDType1Font.HELVETICA, 12); + PDType1Font fontRegular = new PDType1Font(Standard14Fonts.FontName.HELVETICA); + contentStream.setFont(fontRegular, 12); contentStream.beginText(); - contentStream.newLineAtOffset(50, 700); + float textY = 700; // Posición Y inicial del contenido + contentStream.newLineAtOffset(50, textY); // Dividir el texto en líneas y escribir cada línea por separado String[] lines = ticketDetails.split("\n"); for (String line : lines) { contentStream.showText(line); - contentStream.newLineAtOffset(0, -15); // Mover hacia abajo para la siguiente línea + textY -= 15; // Mover hacia abajo para la siguiente línea + contentStream.newLineAtOffset(0, -15); } - contentStream.endText(); + // Calcular la posición Y de la imagen (teniendo en cuenta su altura) + float imageHeight = 150; // Altura de la imagen + float imageY = textY - 50 - imageHeight; // 50 unidades de margen + altura de la imagen + // Agregar la imagen del código QR - if (qrImagePath != null && !qrImagePath.isEmpty()) { - PDImageXObject qrImage = PDImageXObject.createFromFile(qrImagePath, document); - contentStream.drawImage(qrImage, 50, 50, 150, 150); // Ajusta la posición y el tamaño de la imagen + if (qrImageStream != null) { + try { + PDImageXObject qrImage = PDImageXObject.createFromByteArray(document, qrImageStream.readAllBytes(), "qrcode"); + contentStream.drawImage(qrImage, 50, imageY, 150, 150); // Ajusta la posición y el tamaño + } catch (IOException e) { + System.out.println("Error al cargar la imagen QR: " + e.getMessage()); + } } } diff --git a/src/main/java/org/example/saladeconciertos/VentaBoletos.java b/src/main/java/org/example/saladeconciertos/VentaBoletos.java index bcd0ea5..651f410 100644 --- a/src/main/java/org/example/saladeconciertos/VentaBoletos.java +++ b/src/main/java/org/example/saladeconciertos/VentaBoletos.java @@ -97,8 +97,8 @@ public class VentaBoletos extends Application { titleLabel.getStyleClass().add("title"); // Agregar el logo de la aplicación - ImageView logo = new ImageView(new Image(getClass().getResourceAsStream("/logo.png"))); - logo.setFitWidth(100); + ImageView logo = new ImageView(new Image(getClass().getResourceAsStream("/escenario.png"))); + logo.setFitWidth(500); logo.setFitHeight(100); // Crear y configurar el label de bienvenida @@ -278,7 +278,9 @@ public class VentaBoletos extends Application { } } - public static void main(String[] args) { - launch(args); + public static void main(String[] args) {launch(args); + System.setProperty("org.apache.pdfbox.rendering.UsePureJavaCMYK", "true"); + System.setProperty("org.apache.pdfbox.rendering.UsePureJavaRendering", "true"); + System.setProperty("org.apache.pdfbox.base.disableFontCache", "true"); } } \ 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 f30ca1b..30a6d2a 100644 --- a/src/main/java/org/example/saladeconciertos/VentanaPago.java +++ b/src/main/java/org/example/saladeconciertos/VentanaPago.java @@ -6,6 +6,8 @@ import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.geometry.Insets; import javafx.geometry.Pos; + +import java.io.InputStream; import java.sql.*; import java.text.SimpleDateFormat; import java.util.Date; @@ -251,9 +253,9 @@ public class VentanaPago { actualizarEstadoBoletos(selectedSeats, ventaBoletos.getEventId()); // Cambia el idevento según corresponda // Generar el PDF del ticket usando la clase PDFGenerator - String qrImagePath = "src/main/resources/qrcode.png"; // Ruta de tu imagen QR + InputStream qrImageStream = getClass().getResourceAsStream("/qrcode.png"); // Ruta de tu imagen QR String pdfFileName = "ticket_" + System.currentTimeMillis() + ".pdf"; - PDFGenerator.generarTicketPDF(eventName, eventDate, clientName, totalPrice, qrImagePath, ticketDetails.toString(), pdfFileName); + PDFGenerator.generarTicketPDF(eventName, eventDate, clientName, totalPrice, qrImageStream, ticketDetails.toString(), pdfFileName); // Mostrar alerta de que el ticket fue guardado mostrarAlertaTicketGuardado(pdfFileName, paymentLayout); @@ -261,7 +263,7 @@ public class VentanaPago { private void generarPDF(String clientName, List<Integer> selectedSeats, Map<Integer, Double> seatPrices, String eventName, String eventDate, double totalPrice, String paymentMethod) { // Generar el PDF del ticket usando la clase PDFGenerator - String qrImagePath = "src/main/resources/qrcode.png"; // Ruta de tu imagen QR + InputStream qrImageStream = getClass().getResourceAsStream("/qrcode.png"); // Ruta de tu imagen QR StringBuilder ticketDetails = new StringBuilder(); ticketDetails.append("Evento: ").append(eventName).append("\n"); ticketDetails.append("Fecha: ").append(new SimpleDateFormat("dd-MM-yyyy").format(new Date())).append("\n"); @@ -275,7 +277,7 @@ public class VentanaPago { ticketDetails.append("\nTotal: $").append(String.format("%.2f", totalPrice)); String pdfFileName = "ticket_" + System.currentTimeMillis() + ".pdf"; - PDFGenerator.generarTicketPDF(eventName, eventDate, clientName, totalPrice, qrImagePath, ticketDetails.toString(), pdfFileName); + PDFGenerator.generarTicketPDF(eventName, eventDate, clientName, totalPrice, qrImageStream, ticketDetails.toString(), pdfFileName); } private void actualizarEstadoBoletos(List<Integer> selectedSeats, int idevento) { diff --git a/src/main/resources/escenario.png b/src/main/resources/escenario.png new file mode 100644 index 0000000..41d2f31 Binary files /dev/null and b/src/main/resources/escenario.png differ