Block-based Word document builder with simple, predictable newline and inline text handling.
Project description
DocxBlocks
A Python library for building Word documents using a block-based API. Create complex documents with simple, readable code.
🚀 Quick Start
from docxblocks import DocxBuilder
# Create blocks
blocks = [
{"type": "heading", "text": "Report Title", "level": 1},
{"type": "text", "text": "This is the first paragraph."},
{"type": "text", "text": "This continues inline."},
{"type": "text", "text": "\nThis starts a new paragraph."},
{"type": "table", "content": {
"headers": ["Name", "Value"],
"rows": [["Item 1", "100"], ["Item 2", "200"]]
}}
]
# Build document
builder = DocxBuilder("template.docx")
builder.insert("{{content}}", blocks)
builder.save("output.docx")
📋 Features
- Block-based API: Each piece of content is a simple dictionary
- Smart text grouping: Consecutive text blocks are grouped inline
- Simple newlines: Every
\ncreates a new paragraph - Rich styling: Bold, italic, colors, alignment, and more
- Table support: Headers, rows, column widths, cell styling
- Image handling: Automatic sizing with DPI calculation
- Template support: Use existing Word templates as starting points
- Error handling: Graceful fallbacks for missing content
📖 Installation
pip install docxblocks
🎯 Basic Usage
Template Setup
Create a Word document with placeholders:
{{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"
}
}
Text Block Behavior
Text blocks have simple, predictable behavior:
- Every
\n: Always starts a new paragraph - Inline grouping: Consecutive text blocks without
\nare grouped together spacing: Adds extra blank paragraphs after the block
{"type": "text", "text": "Line 1\nLine 2\nLine 3"}
# Renders as three paragraphs: Line 1, Line 2, Line 3
{"type": "text", "text": "First paragraph\n\nSecond paragraph"}
# Renders as: First paragraph, [blank paragraph], Second paragraph
{"type": "text", "text": "First", "spacing": 1}
# Renders as a new paragraph, then one blank paragraph after
Table Cell Behavior
Table cells and headers follow the same rules:
- Every
\n: Always starts a new paragraph within the cell - Inline grouping: Consecutive cell blocks without
\nare grouped together
{
"type": "table",
"content": {
"headers": ["Name", "Description\nDetails"],
"rows": [
["Item 1", "First paragraph.\nSecond paragraph."],
["Item 2", "Line 1\n\nLine 2 with empty line above"]
]
}
}
# Each '\n' creates a new paragraph, each '\n\n' creates paragraph with empty line before
Block types:
| Type | Required Keys | Optional Keys |
|---|---|---|
text |
text |
style, spacing |
heading |
text, level |
style |
bullets |
items |
style |
table |
content |
style |
image |
path |
style |
page_break |
- | - |
🎨 Styling
Text Styling
{
"type": "text",
"text": "Styled text",
"style": {
"bold": True,
"italic": False,
"font_color": "FF0000", # Red
"align": "center",
"style": "Normal"
}
}
Table Styling
{
"type": "table",
"content": {"headers": ["A", "B"], "rows": [["1", "2"]]},
"style": {
"column_widths": [0.3, 0.7],
"header_styles": {"bold": True, "bg_color": "f2f2f2"},
"column_styles": {0: {"font_color": "FF0000"}}
}
}
Image Styling
{
"type": "image",
"path": "logo.png",
"style": {
"max_width": "4in",
"max_height": "300px"
}
}
🔧 Advanced Features
Mixed Content
blocks = [
{"type": "heading", "text": "Section 1", "level": 2},
{"type": "text", "text": "Introduction "},
{"type": "text", "text": "with ", "style": {"bold": True}},
{"type": "text", "text": "inline styling."},
{"type": "bullets", "items": ["Point 1", "Point 2"]},
{"type": "table", "content": {...}},
{"type": "page_break"},
{"type": "heading", "text": "Section 2", "level": 2}
]
Template Variables
# Template.docx contains: "Hello {{name}}, here is your {{report_type}} report."
builder = DocxBuilder("template.docx")
builder.insert("{{name}}", [{"type": "text", "text": "John"}])
builder.insert("{{report_type}}", [{"type": "text", "text": "monthly"}])
builder.save("output.docx")
📚 Examples
See the examples/ directory for complete working examples:
text_block_example.py- Basic text blocks and stylingtable_block_example.py- Table creation and stylingnewline_example.py- Newline handling and paragraph behaviorinline_text_example.py- Inline text groupingcombined_example.py- Mixed block types
🤝 Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
📄 License
MIT License - see LICENSE file for details.
🐛 Issues
Found a bug? Have a feature request? Please open an issue on GitHub.
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.3.6.tar.gz.
File metadata
- Download URL: docxblocks-1.3.6.tar.gz
- Upload date:
- Size: 20.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f334bc9388c8ade437ad5441acfe3e1b4fca66e5055372aa31cbaa7bf516fbe6
|
|
| MD5 |
a5d28c7c5d061b64376f5ea161eb97c0
|
|
| BLAKE2b-256 |
8f0fddf3505bfdc658446542cbc0b3dc365525ccea162d00583b7fd1d784eb34
|
Provenance
The following attestation bundles were made for docxblocks-1.3.6.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.3.6.tar.gz -
Subject digest:
f334bc9388c8ade437ad5441acfe3e1b4fca66e5055372aa31cbaa7bf516fbe6 - Sigstore transparency entry: 251785639
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@0c513c42336483b28292079bdb2999969bca93ea -
Branch / Tag:
refs/tags/v1.3.6 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0c513c42336483b28292079bdb2999969bca93ea -
Trigger Event:
push
-
Statement type:
File details
Details for the file docxblocks-1.3.6-py3-none-any.whl.
File metadata
- Download URL: docxblocks-1.3.6-py3-none-any.whl
- Upload date:
- Size: 19.8 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 |
27965bcf5aa9ef69e10a43f62f9744d550bb2669b3408790b6e570870cb0ba52
|
|
| MD5 |
6b7728765fe4a97149b334fa33297b66
|
|
| BLAKE2b-256 |
a4a9772630a891b291983ae450059a4e2e3fd7eeafb03f02ea42343f24148466
|
Provenance
The following attestation bundles were made for docxblocks-1.3.6-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.3.6-py3-none-any.whl -
Subject digest:
27965bcf5aa9ef69e10a43f62f9744d550bb2669b3408790b6e570870cb0ba52 - Sigstore transparency entry: 251785641
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@0c513c42336483b28292079bdb2999969bca93ea -
Branch / Tag:
refs/tags/v1.3.6 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@0c513c42336483b28292079bdb2999969bca93ea -
Trigger Event:
push
-
Statement type: