|
@@ -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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|