Skip to main content

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
  • Inline text by default - consecutive text blocks stay on the same line
  • Style control via consistent style dictionaries
  • 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:

  1. Open Microsoft Word and create a new document
  2. Add placeholders by typing them in separate paragraphs:
    • Type {{main}} and press Enter
    • Type {{header}} and press Enter
    • Each placeholder gets its own paragraph
  3. Save as .docx format
  4. 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)

📝 Inline Text

Text blocks are inline by default - they continue on the same line as previous text blocks:

blocks = [
    {"type": "text", "text": "Participant Name: "},
    {"type": "text", "text": "John Doe", "style": {"bold": True}},
    {"type": "text", "text": " (ID: "},
    {"type": "text", "text": "12345", "style": {"font_color": "007700"}},
    {"type": "text", "text": ")"},
    {"type": "text", "text": "New paragraph starts here", "new_paragraph": True},
]

Use "new_paragraph": true to force a new paragraph.

🧪 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": "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

Continuous Integration

GitHub Actions automatically runs tests on:

  • Every push to main and develop branches
  • 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docxblocks-1.1.0.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

docxblocks-1.1.0-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file docxblocks-1.1.0.tar.gz.

File metadata

  • Download URL: docxblocks-1.1.0.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for docxblocks-1.1.0.tar.gz
Algorithm Hash digest
SHA256 488fa71fb6601a28927ceae44e05d89b51bd7ddb88a18bb4d42eda9e51cd72d6
MD5 5ebd3848956f8213f0af78edd83b1702
BLAKE2b-256 15a6e1fff558c6515f5434f9891cca63304d04abb5ebd41723670b9e7344fdf3

See more details on using hashes here.

Provenance

The following attestation bundles were made for docxblocks-1.1.0.tar.gz:

Publisher: release.yml on frank-895/docxblocks

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docxblocks-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: docxblocks-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for docxblocks-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d854d6adb112fdf5f6e2056f930cb8a53b43c79f48c2bfa312ceba5a2d019b7a
MD5 2752136eecbbac9afeed28808a31fc22
BLAKE2b-256 a8ceeff1a0eec890635f94988703ee380b1b179de5da1af0cd387fa7f0ba4e08

See more details on using hashes here.

Provenance

The following attestation bundles were made for docxblocks-1.1.0-py3-none-any.whl:

Publisher: release.yml on frank-895/docxblocks

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page