wangxichen 2 giorni fa
parent
commit
2e44f83968

+ 5 - 0
src/com/mes/print/Printer.java

@@ -37,6 +37,11 @@ public class Printer {
 		PrinterFactory.get().printFlowCard(data);
 	}
 
+	/** 预览流转卡(生成临时 PDF 并用系统默认程序打开) */
+	public static void previewFlowCard(FlowCardData data) {
+		com.mes.print.template.FlowCardRenderer.preview(data);
+	}
+
 	/** 打印标签(小尺寸,走 TSC 类打印机) */
 	public static void printLabel(LabelData data) {
 		PrinterFactory.get().printLabel(data);

+ 71 - 0
src/com/mes/print/template/FlowCardRenderer.java

@@ -216,4 +216,75 @@ public class FlowCardRenderer {
                 }
         }
 
+        /**
+         * 预览流转卡:生成临时 PDF 并用系统默认程序打开
+         * @param data 流转卡数据
+         */
+        public static void preview(FlowCardData data) {
+                try {
+                        // 1. 准备渲染数据
+                        BufferedImage bgImage = getTemplateImage();
+                        BufferedImage qr = generateQrCode(data.getSn(), 600);
+
+                        // 2. 创建预览图片(和打印逻辑一致,使用 Graphics2D)
+                        int previewW = (int) Math.ceil(PDF_PAGE_W_PT * 2); // 2倍分辨率用于预览
+                        int previewH = (int) Math.ceil(PDF_PAGE_H_PT * 2);
+                        BufferedImage previewImage = new BufferedImage(previewW, previewH, BufferedImage.TYPE_INT_RGB);
+                        Graphics2D g2 = previewImage.createGraphics();
+
+                        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+                        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+                        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+
+                        // 白色背景
+                        g2.setColor(Color.WHITE);
+                        g2.fillRect(0, 0, previewW, previewH);
+
+                        // 缩放到预览尺寸
+                        double scale = 2.0;
+                        g2.scale(scale, scale);
+
+                        // 绘制底图
+                        g2.drawImage(bgImage, 0, 0, (int) PDF_PAGE_W_PT, (int) PDF_PAGE_H_PT, null);
+
+                        // 绘制动态内容(复用打印逻辑)
+                        drawDynamic(g2, qr, data);
+                        g2.dispose();
+
+                        // 3. 创建 PDF
+                        Path tempPdf = Files.createTempFile("flowcard_preview_", ".pdf");
+                        tempPdf.toFile().deleteOnExit();
+
+                        PDDocument previewDoc = new PDDocument();
+                        org.apache.pdfbox.pdmodel.PDPage page = new org.apache.pdfbox.pdmodel.PDPage(
+                                new org.apache.pdfbox.pdmodel.common.PDRectangle(PDF_PAGE_W_PT, PDF_PAGE_H_PT));
+                        previewDoc.addPage(page);
+
+                        // 4. 将预览图片写入 PDF
+                        org.apache.pdfbox.pdmodel.PDPageContentStream cs =
+                                new org.apache.pdfbox.pdmodel.PDPageContentStream(previewDoc, page);
+                        org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject pdImage =
+                                org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory.createFromImage(previewDoc, previewImage);
+                        cs.drawImage(pdImage, 0, 0, PDF_PAGE_W_PT, PDF_PAGE_H_PT);
+                        cs.close();
+
+                        // 5. 保存并打开
+                        previewDoc.save(tempPdf.toFile());
+                        previewDoc.close();
+
+                        System.out.println("[流转卡预览] 已生成: " + tempPdf.toAbsolutePath());
+
+                        if (java.awt.Desktop.isDesktopSupported()) {
+                                java.awt.Desktop.getDesktop().open(tempPdf.toFile());
+                        } else {
+                                System.err.println("[流转卡预览] 系统不支持 Desktop.open()");
+                        }
+
+                } catch (Exception e) {
+                        System.err.println("[流转卡预览] 失败: " + e.getMessage());
+                        e.printStackTrace();
+                        throw new RuntimeException("预览失败: " + e.getMessage(), e);
+                }
+        }
+
 }