2026-04-17 19:00:30 +08:00
|
|
|
|
import type { NativeTemplateSchema } from '../native/core/types';
|
|
|
|
|
|
import { renderNativePrintHtml } from '../native/core/printRenderer';
|
|
|
|
|
|
import { buildPdfBase64FromHtmlFragment, extractBodyInnerHtmlFromFullDocument } from './printHtmlToPdfBase64';
|
|
|
|
|
|
import { fetchPrintDotPrinters, printDotSendPdf, resolvePrintDotPrinterName } from './printDotBridge';
|
|
|
|
|
|
|
2026-04-17 19:31:09 +08:00
|
|
|
|
/** 与模板列表页共用,便于设计器与列表选择同一台 PrintDot 打印机 */
|
|
|
|
|
|
export const PRINT_TEMPLATE_SELECTED_PRINTER_KEY = 'print_template_selected_printer';
|
2026-04-17 19:00:30 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 原生模板:渲染 HTML → 转 PDF → 经 PrintDot 本地桥接器送打印机
|
|
|
|
|
|
*/
|
|
|
|
|
|
export async function printNativeSchemaViaPrintDot(params: {
|
|
|
|
|
|
schema: NativeTemplateSchema;
|
|
|
|
|
|
data: Record<string, any>;
|
|
|
|
|
|
jobName?: string;
|
|
|
|
|
|
/** 与模板列表一致:可为具体打印机名或 __system_default__;缺省读 localStorage */
|
|
|
|
|
|
printerSelection?: string;
|
|
|
|
|
|
}): Promise<void> {
|
|
|
|
|
|
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();
|
2026-04-17 19:31:09 +08:00
|
|
|
|
const fromStore =
|
|
|
|
|
|
params.printerSelection ?? localStorage.getItem(PRINT_TEMPLATE_SELECTED_PRINTER_KEY) ?? '__system_default__';
|
2026-04-17 19:00:30 +08:00
|
|
|
|
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 打印失败');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|