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 |
- | - |
header |
content |
apply_to |
footer |
content |
apply_to |
🎨 Styling
Text Styling
{
"type": "text",
"text": "Styled text",
"style": {
"bold": True,
"italic": False,
"font_color": "FF0000", # Red
"align": "center", # "left", "center", "right", "justify"
"style": "Normal"
}
}
Alignment Options
All block types support four alignment options:
# Text alignment examples
{"type": "text", "text": "Left aligned", "style": {"align": "left"}}
{"type": "text", "text": "Centered text", "style": {"align": "center"}}
{"type": "text", "text": "Right aligned", "style": {"align": "right"}}
{"type": "text", "text": "Justified text that adjusts spacing for clean edges", "style": {"align": "justify"}}
# Works with all block types
{"type": "heading", "text": "Centered Heading", "level": 1, "style": {"align": "center"}}
{"type": "bullets", "items": ["Item 1", "Item 2"], "style": {"align": "right"}}
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"}}
}
}
Rich Content in Cells: Table cells can contain text, images, bullets, and headings. See STYLEGUIDE.md for examples.
Image Styling
{
"type": "image",
"path": "logo.png",
"style": {
"max_width": "4in",
"max_height": "300px",
"wrap_text": "square",
"horizontal_align": "left",
"vertical_align": "top",
"distance_from_text": "0.1in"
}
}
Text Wrapping Options: inline, square, tight, through, top_and_bottom, behind, in_front
Positioning: horizontal_align (left/center/right), vertical_align (top/middle/bottom), distance_from_text
See STYLEGUIDE.md for comprehensive styling examples.
📄 Headers and Footers
DocxBlocks supports customizable headers and footers that can contain any combination of supported block types.
Basic Usage
blocks = [
{
"type": "header",
"apply_to": "all",
"content": [
{
"type": "text",
"text": "Company Name\tDocument Title\tPage {{page}}",
"style": {"align": "center", "font_color": "666666"}
}
]
},
{
"type": "footer",
"apply_to": "all_except_first",
"content": [
{
"type": "text",
"text": "© 2024 Company. All rights reserved.",
"style": {"align": "center", "italic": True}
}
]
}
]
Apply To Options: "all", "all_except_first", "first", "odd", "even"
See STYLEGUIDE.md for advanced examples including images and tables in headers/footers.
🔧 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 stylingheader_footer_example.py- Headers and footers with various configurationsall_except_first_example.py- Cover page example with clean first page and headers on content pagesnewline_example.py- Newline handling and paragraph behaviorinline_text_example.py- Inline text groupingalignment_example.py- Text alignment with left, center, right, and justifycombined_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.6.4.tar.gz.
File metadata
- Download URL: docxblocks-1.6.4.tar.gz
- Upload date:
- Size: 33.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 |
ca37a78d8ad6d5eeea63ff7cb09187bdd4cf0ccf54d02402537723ff5e61763b
|
|
| MD5 |
c227519b9d50426d256ccb3d83d761a5
|
|
| BLAKE2b-256 |
c47356fc54cd56a3f5529aa7e213c72d9c7cba86d4ee6df9648a208fdb79c13b
|
Provenance
The following attestation bundles were made for docxblocks-1.6.4.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.6.4.tar.gz -
Subject digest:
ca37a78d8ad6d5eeea63ff7cb09187bdd4cf0ccf54d02402537723ff5e61763b - Sigstore transparency entry: 254492882
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@1d75116a59763befc837b65881a00b7f00b0ae35 -
Branch / Tag:
refs/tags/v1.6.4 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1d75116a59763befc837b65881a00b7f00b0ae35 -
Trigger Event:
push
-
Statement type:
File details
Details for the file docxblocks-1.6.4-py3-none-any.whl.
File metadata
- Download URL: docxblocks-1.6.4-py3-none-any.whl
- Upload date:
- Size: 28.5 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 |
f6563e010072923fb6d8f17b6f9c82b3e60594547a3fb0aae82101a8cf1b972f
|
|
| MD5 |
8e5ae153dc6349b399a029fedc971387
|
|
| BLAKE2b-256 |
84afd5f55734499dadb3211098a7f57253657bf8db624203bdc07194dc4eb946
|
Provenance
The following attestation bundles were made for docxblocks-1.6.4-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.6.4-py3-none-any.whl -
Subject digest:
f6563e010072923fb6d8f17b6f9c82b3e60594547a3fb0aae82101a8cf1b972f - Sigstore transparency entry: 254492883
- Sigstore integration time:
-
Permalink:
frank-895/docxblocks@1d75116a59763befc837b65881a00b7f00b0ae35 -
Branch / Tag:
refs/tags/v1.6.4 - Owner: https://github.com/frank-895
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1d75116a59763befc837b65881a00b7f00b0ae35 -
Trigger Event:
push
-
Statement type: