From b954b927dbe949e485404cdc2c36ebbf23977700 Mon Sep 17 00:00:00 2001 From: xianyi Date: Fri, 21 Nov 2025 10:36:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main.js | 97 ++++++++++++++++++++++++++++++++----------- src/pages/UI8/UI8.tsx | 8 +++- 2 files changed, 79 insertions(+), 26 deletions(-) diff --git a/electron/main.js b/electron/main.js index 345f3f8..053d8d3 100644 --- a/electron/main.js +++ b/electron/main.js @@ -2,6 +2,8 @@ const { app, BrowserWindow, ipcMain } = require("electron"); const path = require("path"); const https = require("https"); const http = require("http"); +const fs = require("fs"); +const os = require("os"); let mainWindow = null; const { Worker } = require("worker_threads"); @@ -127,47 +129,92 @@ ipcMain.handle("fetch-pdf", async (event, pdfUrl) => { }); // 处理PDF打印请求 -ipcMain.handle("print-pdf", async (event, pdfUrl) => { +ipcMain.handle("print-pdf", async (event, pdfDataOrUrl) => { + let printWindow = null; + let tempFilePath = null; + try { + // 如果是 base64 data URI,转换为临时文件 + let pdfPath = pdfDataOrUrl; + if (pdfDataOrUrl.startsWith("data:application/pdf;base64,")) { + const base64Data = pdfDataOrUrl.replace("data:application/pdf;base64,", ""); + const buffer = Buffer.from(base64Data, "base64"); + + // 创建临时文件 + tempFilePath = path.join(os.tmpdir(), `print_${Date.now()}.pdf`); + fs.writeFileSync(tempFilePath, buffer); + pdfPath = `file://${tempFilePath}`; + log.info("PDF written to temp file:", tempFilePath); + } + // 创建一个隐藏的窗口用于加载PDF - const printWindow = new BrowserWindow({ + printWindow = new BrowserWindow({ width: 800, height: 600, show: false, webPreferences: { - nodeIntegration: false, - contextIsolation: true, + plugins: true, // 启用插件以支持 PDF 查看 }, }); // 加载PDF - await printWindow.loadURL(pdfUrl); + await printWindow.loadURL(pdfPath); + log.info("PDF loaded for printing"); - // 等待页面加载完成 - await new Promise((resolve) => { - printWindow.webContents.on("did-finish-load", resolve); - }); + // 等待更长时间确保 PDF 完全渲染 + await new Promise(resolve => setTimeout(resolve, 2000)); // 静默打印(直接调用系统打印对话框) - printWindow.webContents.print( - { - silent: false, // 显示打印对话框 - printBackground: true, - margins: { - marginType: "none", + return new Promise((resolve) => { + printWindow.webContents.print( + { + silent: false, // 显示打印对话框 + printBackground: true, + margins: { + marginType: "none", + }, }, - }, - (success, errorType) => { - printWindow.close(); - if (!success) { - console.error("Print failed:", errorType); - } - } - ); + (success, errorType) => { + // 清理临时文件 + if (tempFilePath && fs.existsSync(tempFilePath)) { + try { + fs.unlinkSync(tempFilePath); + log.info("Temp file deleted"); + } catch (err) { + log.error("Failed to delete temp file:", err); + } + } - return { success: true }; + // 关闭窗口 + if (printWindow && !printWindow.isDestroyed()) { + printWindow.close(); + } + + if (!success) { + log.error("Print failed:", errorType); + resolve({ success: false, error: errorType }); + } else { + log.info("Print completed"); + resolve({ success: true }); + } + } + ); + }); } catch (error) { - console.error("Print error:", error); + log.error("Print error:", error); + + // 清理临时文件 + if (tempFilePath && fs.existsSync(tempFilePath)) { + try { + fs.unlinkSync(tempFilePath); + } catch (err) { + log.error("Failed to delete temp file:", err); + } + } + + if (printWindow && !printWindow.isDestroyed()) { + printWindow.close(); + } return { success: false, error: error.message }; } }); diff --git a/src/pages/UI8/UI8.tsx b/src/pages/UI8/UI8.tsx index 09e3327..9c7cf46 100644 --- a/src/pages/UI8/UI8.tsx +++ b/src/pages/UI8/UI8.tsx @@ -66,9 +66,15 @@ const UI8: React.FC = () => { return; } + if (!pdfData) { + alert("PDF 尚未加载完成,请稍候"); + return; + } + setIsPrinting(true); try { - const result = await window.electronAPI.printPdf(PDF_URL); + // 使用已加载的 PDF 数据(base64),避免重复下载 + const result = await window.electronAPI.printPdf(pdfData); if (!result.success) { alert(`打印失败: ${result.error || "未知错误"}`); }