This release is a pre-release and may not be stable for production use.
AkvoFormPrint
AkvoFormPrint is a flexible Python-based rendering engine designed to convert structured digital forms into styled HTML, PDF, and DOCX documents. It provides a robust solution for:
- Converting digital form definitions into printable formats
- Supporting multiple form schemas (Akvo Flow, ARF, Webform, custom JSON)
- Handling complex form features like dependencies and validation
- Generating professional, print-ready documents
Table of Contents
Features
- Convert form definitions to PDF, HTML or DOCX with professional styling
- Support for multiple form formats:
- Default JSON format for custom implementations
- Akvo Flow forms (compatible with Flow's form structure)
- Akvo Webform format
- Akvo React Forms (ARF) with advanced validation
- WeasyPrint Styler for rendering PDF and HTML:
- Portrait/landscape orientation for different form needs
- Automatic section lettering (A, B, C) and question numbering
- Custom templates for branded outputs (only for HTML and PDF)
- Clean and modern form layout with responsive design
- DOCX Rendering:
- Generate Microsoft Word documents (DocxRenderer) with:
- Portrait/landscape orientation.
- Automatic section lettering (A, B, C) and question numbering.
- Multi-column layouts for option-based questions.
Installation
System Dependencies
AkvoFormPrint uses WeasyPrint for PDF generation, which requires system-level graphics and text rendering libraries. These must be installed before installing the Python package:
For Ubuntu/Debian:
sudo apt-get update
sudo apt-get install -y \
build-essential \
libpango-1.0-0 \
libpangocairo-1.0-0 \
libcairo2 \
libffi-dev \
libxml2 \
libxslt1.1 \
shared-mime-info \
fonts-liberation \
fonts-dejavu-core
For macOS:
brew install pango
brew install libffi
brew install cairo
brew install fontconfig
Python Package Installation
After installing the system dependencies above, you can install AkvoFormPrint:
pip install AkvoFormPrint
Troubleshooting
Common issues and solutions:
- System Dependencies Error:
OSError: cannot load library 'libgobject-2.0-0': libgobject-2.0-0: cannot open shared object file: No such file or directory
Solution: Install the required system dependencies as shown above.
- PDF Generation Issues: If you encounter problems with PDF generation, ensure all system dependencies are properly installed.
Quick Start
from AkvoFormPrint.stylers.weasyprint_styler import WeasyPrintStyler
from AkvoFormPrint.stylers.docx_renderer import DocxRenderer
# Your form data in the default format
form_json = {
"title": "Sample Form",
"sections": [
{
"title": "Personal Information",
"questions": [
{
"id": "q1",
"type": "input",
"label": "What is your name?",
"required": True
}
]
}
]
}
# Initialize styler with appropriate parser
styler = WeasyPrintStyler(
orientation="portrait",
add_section_numbering=True,
add_question_numbering=True,
parser_type="default", # Options: "flow", "arf", "default"
raw_json=form_json
)
# Generate HTML
html_content = styler.render_html()
with open("form.html", "w", encoding="utf-8") as f:
f.write(html_content)
# Generate PDF
pdf_content = styler.render_pdf()
with open("form.pdf", "wb") as f:
f.write(pdf_content)
# DOCX Renderer
renderer = DocxRenderer(
orientation="portrait", # or "landscape"
add_section_numbering=True, # Enable section letters (A, B, C)
add_question_numbering=True, # Enable question numbers
parser_type="default", # "flow", "arf", or "default"
raw_json=form_json, # Form JSON
output_path="form_output.docx" # Output file
)
renderer.render_docx()
Form Formats
AkvoFormPrint supports multiple form formats through different parsers:
Default Format
The simplest format, used for custom implementations:
{
"title": "Your Form Title",
"sections": [
{
"title": "Section Title",
"questions": [
{
"id": "q1",
"type": "input",
"label": "Question text",
"required": false,
"options": [],
"allowOther": false,
"optionSingleLine": false,
"minValue": null,
"maxValue": null,
"textRows": null,
"dependencies": [
{
"depends_on_question_id": "q2",
"expected_answer": "Yes"
}
]
}
]
}
]
}
Akvo Flow Format
Compatible with Akvo Flow's form structure. Use parser_type="flow":
{
"name": "Form Title",
"questionGroup": [
{
"heading": "Section Title",
"question": [
{
"id": "q1",
"text": "Question text",
"type": "free",
"mandatory": true,
"dependency": {
"answer-value": "Yes",
"question": "q2"
},
"variableName": null,
}
]
}
]
}
Akvo Webform Format
Similar to Flow format but with slightly different dependency structure. Uses the Flow parser:
{
"name": "Form Title",
"questionGroup": [
{
"heading": "Section Title",
"question": [
{
"id": "q1",
"text": "Question text",
"type": "free",
"mandatory": true,
"dependency": [
{
"answerValue": ["Yes"],
"question": "q2"
}
],
"variableName": null,
}
]
}
]
}
ARF Format
For Akvo React Forms. Use parser_type="arf":
{
"name": "Form Title",
"question_group": [
{
"name": "Section Title",
"question": [
{
"id": "q1",
"name": "Question text",
"type": "input",
"required": true
}
]
}
]
}
Supported Question Types
Each question type is designed to handle specific input needs:
input: Single-line text input for short answersnumber: Numeric input with optional min/max validationtext: Multi-line text input for longer responsesdate: Date input with format validationoption: Single choice from a list of optionsmultiple_option: Multiple choice selectionimage: Image upload and previewgeo: Geographic coordinates with map supportcascade: Hierarchical selection (e.g., Country > State > City)table: Grid-based data entryautofield: System-generated valuestree: Tree-structured selectionsignature: Digital signature captureinstruction: To print a question without an answer field (the question will marked and styled as an instruction). Currently only supported for flow & default form JSON format.
Development
Setup
- Clone the repository:
git clone https://github.com/akvo/akvo-form-print.git
cd akvo-form-print
- Using Docker:
# Run development server with auto-reload
docker compose up dev
# Run specific examples
docker compose up basic # Basic example
docker compose up flow # Flow form example
docker compose up arf # ARF form example
docker compose up webform # Akvo webform form example
docker compose up custom # Custom styling example
# Run all examples
docker compose up examples
# Run tests
docker compose up test
- Local Development:
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Install package in editable mode
pip install -e .
# Run tests
./run_tests.sh
Examples
The examples/ directory contains practical demonstrations:
basic_example.py: Shows basic usage with the default parserflow_example.py: Demonstrates Akvo Flow form renderingwebform_example.py: Demonstrates Akvo Webform form renderingarf_example.py: Shows ARF form rendering capabilitiescustom_example.py: Illustrates styling customization options
Each example is documented and shows different features. See examples/README.md for detailed explanations.
Release files for AkvoFormPrint 0.1.0b8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| akvoformprint-0.1.0b8.tar.gz | 84.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| akvoformprint-0.1.0b8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 119.4 kB
Release files / akvoformprint-0.1.0b8.tar.gz
| Download URL | akvoformprint-0.1.0b8.tar.gz |
|---|---|
| Size | 84.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
568d376148dd2da2ea3d41c45646b2145f0af4e4b1b20f93e881c8bdfa6567f7
|
|
BLAKE2b-256 checksum How to use checksums |
d17469110021695cbddb4bebb9651f8a7e1ee334407300d6dc8c67f2214fc44d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.18
|
Release files / akvoformprint-0.1.0b8-py3-none-any.whl
| Download URL | akvoformprint-0.1.0b8-py3-none-any.whl |
|---|---|
| Size | 34.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
02beedad059272dab3466613f203f54bbbaabb46601749351cce22c9fbffa64d
|
|
BLAKE2b-256 checksum How to use checksums |
2c74fc64ea6686e44e0b21e2542fbb5f3dc8fd8eb5227eb8e8538dbd29a61745
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.10.18
|