From ef770070a71c7f78c1822bdab503ca54e3aff4f1 Mon Sep 17 00:00:00 2001 From: JianMiau Date: Fri, 15 May 2026 14:37:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20.docx=20=E7=AF=84=E6=9C=AC?= =?UTF-8?q?=E6=94=AF=E6=8F=B4=EF=BC=9Ajszip=20=E8=B7=A8=20run=20=E4=BD=94?= =?UTF-8?q?=E4=BD=8D=E7=AC=A6=E6=9B=BF=E6=8F=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- package-lock.json | 112 +++++++++++++++++++++++++++- package.json | 4 +- src/contractService.js | 50 ++++++++++++- templates/租屋契約-內容_逢甲 A.docx | Bin 0 -> 17291 bytes 4 files changed, 160 insertions(+), 6 deletions(-) create mode 100644 templates/租屋契約-內容_逢甲 A.docx diff --git a/package-lock.json b/package-lock.json index 0762d2c..64fb85f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,9 @@ "name": "rental-contract-pdf", "version": "1.0.0", "dependencies": { - "express": "^4.21.2" + "adm-zip": "^0.5.17", + "express": "^4.21.2", + "jszip": "^3.10.1" }, "engines": { "node": ">=20" @@ -27,6 +29,15 @@ "node": ">= 0.6" } }, + "node_modules/adm-zip": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.17.tgz", + "integrity": "sha512-+Ut8d9LLqwEvHHJl1+PIHqoyDxFgVN847JTVM3Izi3xHDWPE4UtzzXysMZQs64DMcrJfBeS/uoEP4AD3HQHnQQ==", + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -131,6 +142,12 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -429,6 +446,12 @@ "node": ">=0.10.0" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -444,6 +467,33 @@ "node": ">= 0.10" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -552,6 +602,12 @@ "node": ">= 0.8" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -567,6 +623,12 @@ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -619,6 +681,27 @@ "node": ">= 0.8" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -690,6 +773,12 @@ "node": ">= 0.8.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -777,6 +866,21 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -808,6 +912,12 @@ "node": ">= 0.8" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", diff --git a/package.json b/package.json index 429a362..9845e9b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "dev": "node --watch server.js" }, "dependencies": { - "express": "^4.21.2" + "adm-zip": "^0.5.17", + "express": "^4.21.2", + "jszip": "^3.10.1" }, "engines": { "node": ">=20" diff --git a/src/contractService.js b/src/contractService.js index 09633d1..bbe86d1 100644 --- a/src/contractService.js +++ b/src/contractService.js @@ -4,11 +4,16 @@ const os = require('node:os'); const path = require('node:path'); const { spawn } = require('node:child_process'); const { pathToFileURL } = require('node:url'); +const JSZip = require('jszip'); const TEMPLATE_DIR = path.resolve(process.env.TEMPLATE_DIR || path.join(process.cwd(), 'templates')); const TEMP_DIR = path.resolve(process.env.TEMP_DIR || path.join(os.tmpdir(), 'rental-contracts')); -const SOFFICE_BIN = process.env.SOFFICE_BIN || 'soffice'; -const SUPPORTED_TEMPLATE_EXTENSIONS = new Set(['.doc']); +const SOFFICE_BIN = process.env.SOFFICE_BIN || ( + process.platform === 'win32' + ? 'C:\\Program Files\\LibreOffice\\program\\soffice.exe' + : 'soffice' +); +const SUPPORTED_TEMPLATE_EXTENSIONS = new Set(['.doc', '.docx']); const PLACEHOLDERS = [ ['{{每月租金}}', 'monthlyRent', '每月租金'], @@ -37,7 +42,10 @@ async function createContractPdf(input) { const copiedDocPath = path.join(workDir, `contract-${crypto.randomUUID()}${extension}`); await fs.copyFile(templatePath, copiedDocPath); - const replacementCounts = await applyPlaceholdersToDoc(copiedDocPath, values); + const ext = path.extname(copiedDocPath).toLowerCase(); + const replacementCounts = ext === '.docx' + ? await applyPlaceholdersToDocx(copiedDocPath, values) + : await applyPlaceholdersToDoc(copiedDocPath, values); assertAllPlaceholdersWereFound(replacementCounts); const pdfPath = await convertToPdf(copiedDocPath, workDir); @@ -93,7 +101,7 @@ async function resolveTemplatePath(templateName) { } if (!SUPPORTED_TEMPLATE_EXTENSIONS.has(path.extname(templatePath).toLowerCase())) { - throwClientError('目前僅支援 .doc 範本。'); + throwClientError('目前僅支援 .doc / .docx 範本。'); } try { @@ -121,6 +129,40 @@ async function removeWorkDir(workDir) { await fs.rm(workDir, { recursive: true, force: true }); } +// Word 會把佔位符拆成多個 run,用這個 pattern 允許相鄰字元之間出現 run 邊界 XML +const RUN_BOUNDARY = '(?:(?:|)*(?:[\\s\\S]*?)?]*>)?'; + +function buildPlaceholderPattern(placeholder) { + const chars = [...placeholder].map((c) => c.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); + return new RegExp(chars.join(RUN_BOUNDARY), 'g'); +} + +async function applyPlaceholdersToDocx(docPath, values) { + const data = await fs.readFile(docPath); + const zip = await JSZip.loadAsync(data); + const xmlFiles = ['word/document.xml', 'word/header1.xml', 'word/footer1.xml']; + const counts = new Map(PLACEHOLDERS.map(([p]) => [p, 0])); + + for (const xmlFile of xmlFiles) { + const entry = zip.file(xmlFile); + if (!entry) continue; + + let xml = await entry.async('string'); + for (const [placeholder, key] of PLACEHOLDERS) { + const pattern = buildPlaceholderPattern(placeholder); + xml = xml.replace(pattern, () => { + counts.set(placeholder, counts.get(placeholder) + 1); + return values[key]; + }); + } + zip.file(xmlFile, xml); + } + + const out = await zip.generateAsync({ type: 'nodebuffer', compression: 'DEFLATE' }); + await fs.writeFile(docPath, out); + return counts; +} + async function applyPlaceholdersToDoc(docPath, values) { const buffer = await fs.readFile(docPath); const counts = new Map(); diff --git a/templates/租屋契約-內容_逢甲 A.docx b/templates/租屋契約-內容_逢甲 A.docx new file mode 100644 index 0000000000000000000000000000000000000000..8326accf9ec68c44c044fdfdaa8803587e5712a0 GIT binary patch literal 17291 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 literal 0 HcmV?d00001