English | δΈζζζ‘£ |Demo
A Rust library for processing DOCX files with Handlebars templates, supporting multiple platforms:
- π¦ Rust native
- π WebAssembly (WASM)
- π¦ npm package
- π’ Node.js
- π¦ Deno
- π Browser
- π JSR (JavaScript Registry)
- β Smart Merging: Automatically handles Handlebars syntax split by XML tags
- β DOCX Validation: Built-in file format validation to ensure valid input files
- β Handlebars Support: Full template engine with variables, conditionals, loops, and helper functions
- β Cross-platform: Rust native + WASM support for multiple runtimes
- β TypeScript: Complete type definitions and intelligent code completion
- β Zero Dependencies: WASM binary with no external dependencies
cargo add docx-handlebarsnpm install docx-handlebarsimport init, { render_template } from "jsr:@sail/docx-handlebars";use docx_handlebars::render_template;
use serde_json::json;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// Read DOCX template file
let template_bytes = std::fs::read("template.docx")?;
// Prepare data
let data = json!({
"name": "John Doe",
"company": "ABC Technology Ltd.",
"position": "Software Engineer",
"projects": [
{"name": "Project A", "status": "Completed"},
{"name": "Project B", "status": "In Progress"}
],
"has_bonus": true,
"bonus_amount": 5000
});
// Render template
let result = render_template(template_bytes, &data)?;
// Save result
std::fs::write("output.docx", result)?;
Ok(())
}import init, { render_template } from 'docx-handlebars';
import fs from 'fs';
async function processTemplate() {
// Initialize WASM module
await init();
// Read template file
const templateBytes = fs.readFileSync('template.docx');
// Prepare data
const data = {
name: "Jane Smith",
company: "XYZ Tech Ltd.",
position: "Senior Developer",
projects: [
{ name: "E-commerce Platform", status: "Completed" },
{ name: "Mobile App", status: "In Development" }
],
has_bonus: true,
bonus_amount: 8000
};
// Render template
const result = render_template(templateBytes, JSON.stringify(data));
// Save result
fs.writeFileSync('output.docx', new Uint8Array(result));
}
processTemplate().catch(console.error);import init, { render_template } from "https://deno.land/x/docx_handlebars/mod.ts";
async function processTemplate() {
// Initialize WASM module
await init();
// Read template file
const templateBytes = await Deno.readFile("template.docx");
// Prepare data
const data = {
name: "Alice Johnson",
department: "R&D Department",
projects: [
{ name: "AI Customer Service", status: "Live" },
{ name: "Data Visualization Platform", status: "In Development" }
]
};
// Render template
const result = render_template(templateBytes, JSON.stringify(data));
// Save result
await Deno.writeFile("output.docx", new Uint8Array(result));
}
if (import.meta.main) {
await processTemplate();
}<!DOCTYPE html>
<html>
<head>
<title>DOCX Handlebars Example</title>
</head>
<body>
<input type="file" id="fileInput" accept=".docx">
<button onclick="processFile()">Process Template</button>
<script type="module">
import init, { render_template } from './pkg/docx_handlebars.js';
// Initialize WASM
await init();
window.processFile = async function() {
const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];
if (!file) return;
const arrayBuffer = await file.arrayBuffer();
const templateBytes = new Uint8Array(arrayBuffer);
const data = {
name: "John Doe",
company: "Example Company"
};
try {
const result = render_template(templateBytes, JSON.stringify(data));
// Download result
const blob = new Blob([new Uint8Array(result)], {
type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'processed.docx';
a.click();
} catch (error) {
console.error('Processing failed:', error);
}
};
</script>
</body>
</html>Built-in helper functions:
# Build all targets
npm run build
# Or build separately
npm run build:web # Browser version
npm run build:npm # Node.js version
npm run build:jsr # Deno version# Rust example
cargo run --example rust_example
# Node.js example
node examples/node_example.js
# Deno example
deno run --allow-read --allow-write examples/deno_example.ts
# Browser example
cd tests/npm_test
node serve.js
# Then open http://localhost:8080 in your browser
# Select examples/template.docx file to testThe core innovation of this library is the intelligent merging of Handlebars syntax that has been split by XML tags. In DOCX files, when users input template syntax, Word may split it into multiple XML tags.
- Zero Copy: Efficient memory management between Rust and WASM
- Streaming Processing: Suitable for handling large DOCX files
- Cross-platform: Support for Windows, macOS, Linux, Web
- Modern Browsers: Support for all modern browsers that support WASM
This project is licensed under the MIT License - see the LICENSE-MIT file for details.
- π Documentation
- π Issue Tracker
- π¬ Discussions
docx-handlebars - Making DOCX template processing simple and efficient
β Star the project Β· π Report issues Β· π¬ Join discussions
