From 607bca80ef44a034f7b02f5c714f9fd6a35df1d7 Mon Sep 17 00:00:00 2001 From: lethanhdat <91755733+ldss13@users.noreply.github.com> Date: Sun, 12 Jan 2025 01:01:35 -0600 Subject: [PATCH] [add] print --- medical_invoice.pdf | Bin 29627 -> 29790 bytes .../PrintDialog/MedicalInvoiceWithGUI.java | 148 +++++++++++++----- 2 files changed, 112 insertions(+), 36 deletions(-) diff --git a/medical_invoice.pdf b/medical_invoice.pdf index fe5a60fc1e529f5043374760a1c9eab656476442..70fea24a6bc4708856d6e1ce5479b24801fcd19c 100644 GIT binary patch delta 13012 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 delta 12815 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 fMqGc2K+OES|Bs5;4^I3@AQm new MedicalInvoiceWithGUI().createGUI()); + SwingUtilities.invokeLater(() -> { + JButton openDialogButton = new JButton("Open Medical Invoice"); + openDialogButton.addActionListener(e -> new MedicalInvoiceWithGUI().createDialog(null)); + JFrame frame = new JFrame("Main Application"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setSize(400, 300); + frame.setLayout(new FlowLayout()); + frame.add(openDialogButton); + frame.setVisible(true); + }); } - private void createGUI() { - JFrame frame = new JFrame("Medical Invoice"); - frame.setSize(600, 600); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setLayout(new BorderLayout()); + private void createDialog(JFrame parent) { + dialog = new JDialog(parent, "Medical Invoice", true); + dialog.setSize(600, 600); + dialog.setResizable(false); + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + dialog.setLayout(new BorderLayout()); JPanel buttonPanel = new JPanel(new GridLayout(1, 2)); JButton saveButton = new JButton("Save PDF"); @@ -42,10 +57,10 @@ public class MedicalInvoiceWithGUI { buttonPanel.add(saveButton); buttonPanel.add(printButton); - JLabel pdfViewer = new JLabel(); + JPanel pdfViewer = new JPanel(); JScrollPane scrollPane = new JScrollPane(pdfViewer); - frame.add(scrollPane, BorderLayout.CENTER); - frame.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(scrollPane, BorderLayout.CENTER); + dialog.add(buttonPanel, BorderLayout.SOUTH); String pdfPath = "medical_invoice.pdf"; try { @@ -53,7 +68,7 @@ public class MedicalInvoiceWithGUI { displayPdfInLabel(pdfPath, pdfViewer); } catch (Exception e) { e.printStackTrace(); - JOptionPane.showMessageDialog(frame, "Error generating PDF: " + e.getMessage()); + JOptionPane.showMessageDialog(dialog, "Error generating PDF: " + e.getMessage()); } // Save PDF Action @@ -62,7 +77,7 @@ public class MedicalInvoiceWithGUI { JFileChooser fileChooser = new JFileChooser(); fileChooser.setDialogTitle("Save PDF As"); fileChooser.setSelectedFile(new File("medical_invoice.pdf")); - int userSelection = fileChooser.showSaveDialog(frame); + int userSelection = fileChooser.showSaveDialog(dialog); if (userSelection == JFileChooser.APPROVE_OPTION) { File fileToSave = fileChooser.getSelectedFile(); @@ -74,12 +89,12 @@ public class MedicalInvoiceWithGUI { while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } - JOptionPane.showMessageDialog(frame, "PDF saved: " + fileToSave.getAbsolutePath()); + JOptionPane.showMessageDialog(dialog, "PDF saved: " + fileToSave.getAbsolutePath()); } } } catch (Exception ex) { ex.printStackTrace(); - JOptionPane.showMessageDialog(frame, "Error saving PDF: " + ex.getMessage()); + JOptionPane.showMessageDialog(dialog, "Error saving PDF: " + ex.getMessage()); } }); @@ -88,14 +103,14 @@ public class MedicalInvoiceWithGUI { try { File pdfFile = new File(pdfPath); printPdf(pdfFile); - JOptionPane.showMessageDialog(frame, "Printing triggered."); } catch (Exception ex) { ex.printStackTrace(); - JOptionPane.showMessageDialog(frame, "Error printing PDF: " + ex.getMessage()); + JOptionPane.showMessageDialog(dialog, "Error printing PDF: " + ex.getMessage()); } }); - frame.setVisible(true); + dialog.setLocationRelativeTo(parent); + dialog.setVisible(true); } private void generatePdf(String pdfPath) throws Exception { @@ -118,7 +133,9 @@ public class MedicalInvoiceWithGUI { document.add(logo); // Add clinic information - String clinicInfo = "Phòng khám BSK\nĐức Hòa Long An\nPhone: (123) 456-7890\nNgày khám: 30 tháng 2 năm 2025\n"; + String clinicInfo = String.format("%s\n%s\nSố điện thoại: %s\nEmail: %s", + "Clinic Name", "123 Clinic Street", + "0123456789", "test@#mail.com"); Paragraph clinicInfoParagraph = new Paragraph(clinicInfo) .setTextAlignment(com.itextpdf.layout.property.TextAlignment.RIGHT) .setFont(font); @@ -206,33 +223,92 @@ public class MedicalInvoiceWithGUI { document.close(); } - private void displayPdfInLabel(String pdfPath, JLabel label) throws IOException { + private void displayPdfInLabel(String pdfPath, JPanel pdfPanel) throws Exception { PDDocument document = PDDocument.load(new File(pdfPath)); - PDFRenderer renderer = new PDFRenderer(document); + PDFRenderer pdfRenderer = new PDFRenderer(document); - // Render the first page - BufferedImage pageImage = renderer.renderImageWithDPI(0, 100); // 100 DPI for reasonable quality - ImageIcon icon = new ImageIcon(pageImage); - label.setIcon(icon); + // Create a panel to hold all pages + pdfPanel.setLayout(new BoxLayout(pdfPanel, BoxLayout.Y_AXIS)); // Stack pages vertically + // Render each page and add it to the pdfPanel + for (int i = 0; i < document.getNumberOfPages(); i++) { + BufferedImage image = pdfRenderer.renderImageWithDPI(i, 150); // Adjust DPI as needed + + // Scale the image to a smaller size (e.g., 50% of the original size) + int scaledWidth = image.getWidth() / 2; // Make it half of the original width + int scaledHeight = image.getHeight() / 2; // Make it half of the original height + + // Scale the image using getScaledInstance + java.awt.Image scaledImage = image.getScaledInstance(scaledWidth, scaledHeight, java.awt.Image.SCALE_SMOOTH); + + // Create an ImageIcon from the scaled image + ImageIcon icon = new ImageIcon(scaledImage); + + // Create a label for the image and add it to the panel + JLabel pageLabel = new JLabel(icon); + pdfPanel.add(pageLabel); + } document.close(); + // Put the panel inside a JScrollPane to make it scrollable + JScrollPane scrollPane = new JScrollPane(pdfPanel); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + + // Assuming `dialog` is the parent component + dialog.add(scrollPane, BorderLayout.CENTER); + dialog.validate(); + dialog.repaint(); } + public static void printPdf(File pdfFile) { - try { - PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); - if (printService != null) { - DocPrintJob printJob = printService.createPrintJob(); - Doc pdfDoc = new SimpleDoc(pdfFile.toURI().toURL().openStream(), - javax.print.DocFlavor.INPUT_STREAM.PDF, null); - PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); - printJob.print(pdfDoc, attributes); - System.out.println("PDF sent to the printer."); + try (PDDocument document = PDDocument.load(pdfFile)) { + PrinterJob printerJob = PrinterJob.getPrinterJob(); + printerJob.setJobName("Print Medical Invoice"); + + if (printerJob.printDialog()) { + printerJob.setPrintable(new Printable() { + @Override + public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { + if (pageIndex >= document.getNumberOfPages()) { + return NO_SUCH_PAGE; + } + + Graphics2D g2 = (Graphics2D) graphics; + g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); + + try { + PDFRenderer pdfRenderer = new PDFRenderer(document); + BufferedImage pageImage = pdfRenderer.renderImageWithDPI(pageIndex, 300); // Render at 300 DPI + + double pageWidth = pageImage.getWidth(); + double pageHeight = pageImage.getHeight(); + + double scaleX = pageFormat.getImageableWidth() / pageWidth; + double scaleY = pageFormat.getImageableHeight() / pageHeight; + double scale = Math.min(scaleX, scaleY); + + g2.scale(scale, scale); + g2.drawImage(pageImage, 0, 0, null); + + } catch (IOException e) { + e.printStackTrace(); + return NO_SUCH_PAGE; + } + + return PAGE_EXISTS; + } + }); + + + printerJob.print(); + System.out.println("Printing completed."); } else { - System.out.println("No default print service found."); + System.out.println("Print job canceled."); } } catch (Exception e) { e.printStackTrace(); + JOptionPane.showMessageDialog(null, "Error printing PDF: " + e.getMessage()); } } + }