diff --git a/web-admin/src/utils/crm/contract-html-to-docx.ts b/web-admin/src/utils/crm/contract-html-to-docx.ts
index 61337b082..35a73e7c1 100644
--- a/web-admin/src/utils/crm/contract-html-to-docx.ts
+++ b/web-admin/src/utils/crm/contract-html-to-docx.ts
@@ -1,5 +1,33 @@
/** 合同打印弹窗:HTML → DOCX 预处理与生成 */
+import HTMLtoDOCX from '@turbodocx/html-to-docx'
+
+const DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
+
+/**
+ * 将已预处理的合同 HTML 转为 DOCX Blob(浏览器下载用)。
+ * 调用方须先执行 prepareContractHtmlForDocx。
+ */
+export async function generateContractDocxBlob(
+ preparedHtml: string,
+ title?: string
+): Promise {
+ const fullHtml = `${preparedHtml}`
+ const result = await HTMLtoDOCX(fullHtml, null, {
+ orientation: 'portrait',
+ title: title || '合同',
+ margins: {
+ top: 720,
+ right: 720,
+ bottom: 720,
+ left: 720
+ }
+ })
+
+ if (result instanceof Blob) return result
+ return new Blob([result as ArrayBuffer], { type: DOCX_MIME })
+}
+
export function parseContractSupplierCode(contractNo?: string | null): string {
if (!contractNo) return 'SX'
const match = String(contractNo).match(/^([A-Z]+)\/X-JT/)