High-level block-based abstraction over python-docx for building dynamic Word documents in code.
Project description
docxblocks
🧱 High-level, block-based abstraction for python-docx.
🚀 Why docxblocks?
Unlike templating libraries like docxtpl, docxblocks keeps all logic in Python, not in .docx files. Build dynamic Word reports from structured block objects inside your codebase.
✨ Key Features
- Block types:
text,heading,table,bullets,image,page_break - Inline text by default - consecutive text blocks stay on the same line
- Style control via consistent
styledictionaries - Graceful fallback for missing data
- Declarative, testable, version-controlled
- No logic inside Word templates
📦 Installation
pip install docxblocks
📘 See the Style Guide for all supported style keys, color formats, and alignment options.
📄 Creating Word Templates
Important: Placeholder Requirements
Each placeholder MUST be in its own paragraph. This is crucial for proper document generation.
✅ Correct Template Structure:
Paragraph 1: {{main}}
Paragraph 2: (empty or other content)
Paragraph 3: {{header}}
❌ Incorrect Template Structure:
Paragraph 1: Some text {{main}} more text
Paragraph 2: {{header}} and other content
How to Create Templates:
- Open Microsoft Word and create a new document
- Add placeholders by typing them in separate paragraphs:
- Type
{{main}}and press Enter - Type
{{header}}and press Enter - Each placeholder gets its own paragraph
- Type
- Save as
.docxformat - Use in your code with
DocxBuilder("template.docx")
Template Example:
Document Title
{{header}}
{{main}}
{{footer}}
🧱 Block-Based API (Core Concept)
Each piece of content is a block:
{
"type": "text",
"text": "All systems operational.",
"style": {
"bold": True,
"italic": False,
"font_color": "007700",
"align": "center",
"style": "Normal"
}
}
Block types:
| Type | Required Keys | Optional Keys |
|---|---|---|
text |
text |
new_paragraph |
heading |
text, level |
|
table |
content |
|
image |
path |
|
bullets |
items (list) |
|
page_break |
(none) |
🧪 Example
from docxblocks import DocxBuilder
builder = DocxBuilder("template.docx")
builder.insert("{{main}}", [
{"type": "heading", "text": "Summary", "level": 2},
{"type": "text", "text": "This report provides status."},
{
"type": "table",
"content": {
"headers": ["Service", "Status"],
"rows": [["API", "OK"], ["DB", "OK"]]
},
"style": {
"header_styles": {"bold": True, "bg_color": "f2f2f2"},
"column_widths": [0.5, 0.5]
}
},
{"type": "page_break"},
{"type": "image", "path": "chart.png", "style": {"max_width": "4in"}}
])
builder.save("output.docx")
🛠️ Philosophy
Keep the logic in your code — not in your Word template.
- Fully programmatic document generation
- No fragile embedded logic (
{{ if x }}) in.docx - Declarative, JSON-like format ideal for automation and templating
- Built for dynamic, testable, repeatable reports
🧪 Development
Setup
# Clone the repository
git clone https://github.com/frank-895/docxblocks.git
cd docxblocks
# Run the development setup script
./scripts/setup_dev.sh
Testing
# Run all tests
PYTHONPATH=. pytest tests
# Run tests with verbose output
PYTHONPATH=. pytest tests -v
# Run specific test file
PYTHONPATH=. pytest tests/test_text_block.py
Examples
# Run individual examples
cd examples
python text_block_example.py
python table_block_example.py
python image_block_example.py
python combined_example.py
python inline_text_example.py # New inline text example
python page_break_example.py # New page break example
Continuous Integration
GitHub Actions automatically runs tests on:
- Every push to
mainanddevelopbranches - Every pull request to
main - Multiple Python versions (3.9, 3.10, 3.11)
Note: Tests run automatically in CI, so you can push your changes and see the results on GitHub.
📄 License
MIT - LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docxblocks-1.2.0.tar.gz.
File metadata
- Download URL: docxblocks-1.2.0.tar.gz
- Upload date:
- Size: 17.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
00aa4eaf63e77dc4a6fae963d1b752253930c7768b224b526ba243f794ce26ab
|
|
| MD5 |
b3c2980f6d8399f7d38efca3761013ec
|
|
| BLAKE2b-256 |
9282f139fa1d0767ac6b7fbc4e46d4ea79e67ffc1635e120b21adf15f4ed8f5f
|
Provenance
The following attestation bundles were made for docxblocks-1.2.0.tar.gz:
Publisher:
release.yml on frank-895/docxblocks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
docxblocks-1.2.0.tar.gz -
Subject digest:
00aa4eaf63e77dc4a6fae963d1b752253930c7768b224b526ba243f794ce26ab - Sigstore transparency entry: 250264800
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@293fce55d542faccc2d89571fad05d31ecd20aa5 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@293fce55d542faccc2d89571fad05d31ecd20aa5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file docxblocks-1.2.0-py3-none-any.whl.
File metadata
- Download URL: docxblocks-1.2.0-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6867b2aad14e2b70f0f6dc75b8c98af3801ef41b303048c1d23b35c68f9fc6e1
|
|
| MD5 |
1f48eb6bf584de04d23e806e2a33206c
|
|
| BLAKE2b-256 |
04bc42ac8579c039ceb6299584093128cec05b0de87342e7087fa494930db8fc
|
Provenance
The following attestation bundles were made for docxblocks-1.2.0-py3-none-any.whl:
Publisher:
release.yml on frank-895/docxblocks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
docxblocks-1.2.0-py3-none-any.whl -
Subject digest:
6867b2aad14e2b70f0f6dc75b8c98af3801ef41b303048c1d23b35c68f9fc6e1 - Sigstore transparency entry: 250264806
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@293fce55d542faccc2d89571fad05d31ecd20aa5 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@293fce55d542faccc2d89571fad05d31ecd20aa5 -
Trigger Event:
push
-
Statement type: