import type { NativeTemplateSchema } from '../native/core/types'; import { renderNativePrintHtml } from '../native/core/printRenderer'; import { buildPdfBase64FromHtmlFragment, extractBodyInnerHtmlFromFullDocument } from './printHtmlToPdfBase64'; import { fetchPrintDotPrinters, printDotSendPdf, resolvePrintDotPrinterName } from './printDotBridge'; /** 与模板列表页共用,便于设计器与列表选择同一台 PrintDot 打印机 */ export const PRINT_TEMPLATE_SELECTED_PRINTER_KEY = 'print_template_selected_printer'; /** * 原生模板:渲染 HTML → 转 PDF → 经 PrintDot 本地桥接器送打印机 */ export async function printNativeSchemaViaPrintDot(params: { schema: NativeTemplateSchema; data: Record; jobName?: string; /** 与模板列表一致:可为具体打印机名或 __system_default__;缺省读 localStorage */ printerSelection?: string; }): Promise { const fullHtml = await renderNativePrintHtml(params.schema, params.data); const inner = extractBodyInnerHtmlFromFullDocument(fullHtml); const pdfBase64 = await buildPdfBase64FromHtmlFragment(inner, params.schema.page.width, params.schema.page.height, { paginate: true, }); const printers = await fetchPrintDotPrinters(); const fromStore = params.printerSelection ?? localStorage.getItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY) ?? '__system_default__'; const resolved = resolvePrintDotPrinterName(fromStore, printers); if (!resolved) { throw new Error('未解析到可用打印机:请在模板列表选择打印机,或启动 PrintDot 后刷新打印机列表'); } const result = await printDotSendPdf({ printer: resolved, pdfBase64, jobName: params.jobName, timeoutMs: 180000, }); if (!result.ok) { throw new Error(result.message || 'PrintDot 打印失败'); } }