47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { BrowserWindow } from 'electron';
|
|
|
|
/**
|
|
* 生成 PDF 的服务
|
|
* @param htmlContent 完整的 HTML 字符串
|
|
* @returns PDF 文件的二进制数据
|
|
*/
|
|
export async function generatePdf(htmlContent: string): Promise<Uint8Array> {
|
|
const printWin = new BrowserWindow({
|
|
show: false,
|
|
webPreferences: {
|
|
nodeIntegration: false,
|
|
contextIsolation: true,
|
|
sandbox: false, // 与 main.ts 保持一致,确保脚本执行权限
|
|
}
|
|
});
|
|
|
|
try {
|
|
await printWin.loadURL(`data:text/html;charset=utf-8,${encodeURIComponent(htmlContent)}`);
|
|
|
|
// 等待资源加载完成 (由 generatePrintHtml 注入的脚本控制)
|
|
await printWin.webContents.executeJavaScript(`
|
|
new Promise(resolve => {
|
|
const check = () => {
|
|
if (window.__PRINT_READY__) {
|
|
resolve();
|
|
} else {
|
|
setTimeout(check, 100);
|
|
}
|
|
}
|
|
check();
|
|
})
|
|
`);
|
|
|
|
const pdfData = await printWin.webContents.printToPDF({
|
|
printBackground: true,
|
|
pageSize: 'A4',
|
|
margins: { top: 0, bottom: 0, left: 0, right: 0 }
|
|
});
|
|
|
|
return pdfData;
|
|
} finally {
|
|
// 确保窗口被关闭,防止内存泄漏
|
|
printWin.close();
|
|
}
|
|
}
|