# odfdo
[](https://img.shields.io/github/v/release/jdum/odfdo)
[](https://img.shields.io/github/actions/workflow/status/jdum/odfdo/main.yml?branch%3Adevel)
[](https://img.shields.io/github/license/jdum/odfdo)
[](https://pepy.tech/projects/odfdo)
OpenDocument Format (ODF, ISO/IEC 26300) library for Python

`odfdo` is a Python library for programmatically creating, parsing, and editing OpenDocument Format (ODF) files. It provides an interface for interacting with `.odt`, `.ods`, `.odp`, and other ODF file types. The library comes with a set of utilities and recipes for common actions to make it easier to use.
- Document Creation: Generate new ODF documents.
- Content Manipulation: Add, modify, or delete text, paragraphs or tables.
- Table Operations: Create, populate, and modify tables.
- Style Management: Control formatting through different ways.
- Drawing and Presentation: Less advanced features, but allow work with elements in `.odg` and `.odp` files.
- Metadata: Read and write document metadata.
Project:
[https://github.com/jdum/odfdo](https://github.com/jdum/odfdo)
Author:
jerome.dumonteil@gmail.com
License:
Apache License, Version 2.0
`odfdo` is a derivative work of the former `lpod-python` project.
# Installation
Installation from Pypi (recommended):
```bash
pip install odfdo
```
Installation from sources:
```bash
uv sync
```
After installation from sources, you can check everything is working. The tests should run for a few seconds and issue no error.
```bash
uv sync --dev
uv run pytest -n8
```
To generate the documentation in the `./docs` directory:
```bash
uv sync --group doc
uv run python doc_src/generate_doc.py
```
# Dependencies
The project is tested on Python 3.10 to 3.14 (Linux, Mac, Windows). See previous releases for earlier versions of Python.
A special effort has been made to limit the dependencies of this library: the only (non-development) dependency is `lxml`. The required versions of `lxml depend mainly on the version of Python used; see the `pyproject.toml` file for details. The project tries to keep up with `lxml` version updates regularly.
# Usage Overview
## Creating a "Hello world" Text Document
```python
from odfdo import Document, Paragraph
doc = Document('text')
doc.body.append(Paragraph("Hello world!"))
doc.save("hello.odt")
```
## Modifying a Spreadsheet
```python
from odfdo import Document
doc = Document('existing_spreadsheet.ods')
sheet = doc.body.get_sheet(0)
print(f"Value of A1: {sheet.get_cell('A1').value}")
sheet.set_value('B2', 'Updated Value')
doc.save('modified_spreadsheet.ods')
```
## Utilities
A few scripts are provided with `odfdo`:
- `odfdo-diff`: show a _diff_ between two .odt document.
- `odfdo-folder`: convert standard ODF file to folder and files, and reverse.
- `odfdo-headers`: print the headers of an ODF file.
- `odfdo-highlight`: highlight the text matching a pattern (regex) in an ODF file.
- `odfdo-markdown`: export text document in Markdown format to stdout.
- `odfdo-replace`: find a pattern (regex) in an ODF file and replace by some string.
- `odfdo-show`: dump text from an ODF file to the standard output, and optionally styles and meta informations.
- `odfdo-styles`: command line interface tool to manipulate styles of ODF files.
- `odfdo-table-shrink`: shrink tables to optimize width and height.
- `odfdo-userfield`: show or set the user-field content in an ODF file.
- `odfdo-from-csv`: import a CSV file into a .ods file.
- `odfdo-to-csv`: export a .ods table to a CSV file.
- `odfdo-meta-print`: print the metadata of an ODF file.
- `odfdo-meta-update`: update the metadata of an ODF file.
# tl;dr
'Intended Audience :: Developers'
# Documentation
- the `recipes` folder contains more than 60 working sample scripts,
- the auto-generated documentation exposes public APIs and recipes.
Online documentation: [https://jdum.github.io/odfdo](https://jdum.github.io/odfdo/)
# About styles
The best way to apply style is by merging styles from a template
document into your generated document (See `odfdo-styles` script).
Styles are a complex matter in ODF, so trying to generate styles programmatically is not recommended.
Several recipes provide an example of manipulating styles, including: `change_paragraph_styles_methods.py`,`create_basic_text_styles`, `add_text_span_styles`.
# Related project
If you work on `.ods` files (spreadsheet), you may be interested by these scripts using
this library to parse/generate `.ods` files:
[https://github.com/jdum/odsgenerator](https://github.com/jdum/odsgenerator) and [https://github.com/jdum/odsparsator](https://github.com/jdum/odsparsator)
# Former lpod-python library
`lpod-python` was written in 2009-2010 as a Python 2.x library,
see: `https://github.com/lpod/lpod-python`
`odfdo` is an adaptation of this former project to Python 3.x with several improvements.
Raw data
{
"_id": null,
"home_page": null,
"name": "odfdo",
"maintainer": null,
"docs_url": null,
"requires_python": "<4,>=3.9",
"maintainer_email": null,
"keywords": "python, library, ODF, OpenDocument",
"author": "J\u00e9r\u00f4me Dumonteil",
"author_email": "J\u00e9r\u00f4me Dumonteil <jerome.dumonteil@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/63/8a/8b94ed47aae72f33f63597b1249e5152b823a834a5165c5f121a0d813509/odfdo-3.17.2.tar.gz",
"platform": null,
"description": "# odfdo\n\n[](https://img.shields.io/github/v/release/jdum/odfdo)\n[](https://img.shields.io/github/actions/workflow/status/jdum/odfdo/main.yml?branch%3Adevel)\n[](https://img.shields.io/github/license/jdum/odfdo)\n[](https://pepy.tech/projects/odfdo)\n\nOpenDocument Format (ODF, ISO/IEC 26300) library for Python\n\n\n\n`odfdo` is a Python library for programmatically creating, parsing, and editing OpenDocument Format (ODF) files. It provides an interface for interacting with `.odt`, `.ods`, `.odp`, and other ODF file types. The library comes with a set of utilities and recipes for common actions to make it easier to use.\n\n- Document Creation: Generate new ODF documents.\n- Content Manipulation: Add, modify, or delete text, paragraphs or tables.\n- Table Operations: Create, populate, and modify tables.\n- Style Management: Control formatting through different ways.\n- Drawing and Presentation: Less advanced features, but allow work with elements in `.odg` and `.odp` files.\n- Metadata: Read and write document metadata.\n\n\n\nProject:\n[https://github.com/jdum/odfdo](https://github.com/jdum/odfdo)\n\nAuthor:\njerome.dumonteil@gmail.com\n\nLicense:\nApache License, Version 2.0\n\n`odfdo` is a derivative work of the former `lpod-python` project.\n\n# Installation\n\nInstallation from Pypi (recommended):\n\n```bash\npip install odfdo\n```\n\nInstallation from sources:\n\n```bash\nuv sync\n```\n\nAfter installation from sources, you can check everything is working. The tests should run for a few seconds and issue no error.\n\n```bash\nuv sync --dev\nuv run pytest -n8\n```\n\nTo generate the documentation in the `./docs` directory:\n\n```bash\nuv sync --group doc\nuv run python doc_src/generate_doc.py\n```\n\n# Dependencies\n\nThe project is tested on Python 3.10 to 3.14 (Linux, Mac, Windows). See previous releases for earlier versions of Python.\n\nA special effort has been made to limit the dependencies of this library: the only (non-development) dependency is `lxml`. The required versions of `lxml depend mainly on the version of Python used; see the `pyproject.toml` file for details. The project tries to keep up with `lxml` version updates regularly.\n\n# Usage Overview\n\n## Creating a \"Hello world\" Text Document\n\n```python\nfrom odfdo import Document, Paragraph\n\ndoc = Document('text')\ndoc.body.append(Paragraph(\"Hello world!\"))\n\ndoc.save(\"hello.odt\")\n```\n\n## Modifying a Spreadsheet\n\n```python\nfrom odfdo import Document\n\ndoc = Document('existing_spreadsheet.ods')\nsheet = doc.body.get_sheet(0)\n\nprint(f\"Value of A1: {sheet.get_cell('A1').value}\")\nsheet.set_value('B2', 'Updated Value')\n\ndoc.save('modified_spreadsheet.ods')\n```\n\n## Utilities\n\nA few scripts are provided with `odfdo`:\n\n- `odfdo-diff`: show a _diff_ between two .odt document.\n- `odfdo-folder`: convert standard ODF file to folder and files, and reverse.\n- `odfdo-headers`: print the headers of an ODF file.\n- `odfdo-highlight`: highlight the text matching a pattern (regex) in an ODF file.\n- `odfdo-markdown`: export text document in Markdown format to stdout.\n- `odfdo-replace`: find a pattern (regex) in an ODF file and replace by some string.\n- `odfdo-show`: dump text from an ODF file to the standard output, and optionally styles and meta informations.\n- `odfdo-styles`: command line interface tool to manipulate styles of ODF files.\n- `odfdo-table-shrink`: shrink tables to optimize width and height.\n- `odfdo-userfield`: show or set the user-field content in an ODF file.\n- `odfdo-from-csv`: import a CSV file into a .ods file.\n- `odfdo-to-csv`: export a .ods table to a CSV file.\n- `odfdo-meta-print`: print the metadata of an ODF file.\n- `odfdo-meta-update`: update the metadata of an ODF file.\n\n# tl;dr\n\n'Intended Audience :: Developers'\n\n# Documentation\n\n- the `recipes` folder contains more than 60 working sample scripts,\n- the auto-generated documentation exposes public APIs and recipes.\n\nOnline documentation: [https://jdum.github.io/odfdo](https://jdum.github.io/odfdo/)\n\n# About styles\n\nThe best way to apply style is by merging styles from a template\ndocument into your generated document (See `odfdo-styles` script).\nStyles are a complex matter in ODF, so trying to generate styles programmatically is not recommended.\nSeveral recipes provide an example of manipulating styles, including: `change_paragraph_styles_methods.py`,`create_basic_text_styles`, `add_text_span_styles`.\n\n\n# Related project\n\nIf you work on `.ods` files (spreadsheet), you may be interested by these scripts using\nthis library to parse/generate `.ods` files:\n[https://github.com/jdum/odsgenerator](https://github.com/jdum/odsgenerator) and [https://github.com/jdum/odsparsator](https://github.com/jdum/odsparsator)\n\n\n# Former lpod-python library\n\n`lpod-python` was written in 2009-2010 as a Python 2.x library,\nsee: `https://github.com/lpod/lpod-python`\n\n`odfdo` is an adaptation of this former project to Python 3.x with several improvements.\n",
"bugtrack_url": null,
"license": null,
"summary": "Python library for OpenDocument Format",
"version": "3.17.2",
"project_urls": {
"changelog": "https://github.com/jdum/odfdo/blob/master/CHANGES.md",
"documentation": "https://jdum.github.io/odfdo/",
"homepage": "https://github.com/jdum/odfdo",
"repository": "https://github.com/jdum/odfdo"
},
"split_keywords": [
"python",
" library",
" odf",
" opendocument"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f08ad41f095805f2eb3cc932b01bdb253334cca88d594663542578c4b9149bf2",
"md5": "7cc720dca1857f26e8540e50675ce5fb",
"sha256": "42c4e0b593c5f665441105bd93c029a71c11f2c8f34d331677b24a341cef67aa"
},
"downloads": -1,
"filename": "odfdo-3.17.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7cc720dca1857f26e8540e50675ce5fb",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4,>=3.9",
"size": 1177296,
"upload_time": "2025-10-25T11:07:33",
"upload_time_iso_8601": "2025-10-25T11:07:33.900957Z",
"url": "https://files.pythonhosted.org/packages/f0/8a/d41f095805f2eb3cc932b01bdb253334cca88d594663542578c4b9149bf2/odfdo-3.17.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "638a8b94ed47aae72f33f63597b1249e5152b823a834a5165c5f121a0d813509",
"md5": "aeaa1006e3eb5295f54eb111d5214e44",
"sha256": "1298e8ef18d8d3f6c17b0699fcb3cd7640a67830813c401b0c4b93de8d5dbef1"
},
"downloads": -1,
"filename": "odfdo-3.17.2.tar.gz",
"has_sig": false,
"md5_digest": "aeaa1006e3eb5295f54eb111d5214e44",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4,>=3.9",
"size": 839160,
"upload_time": "2025-10-25T11:07:36",
"upload_time_iso_8601": "2025-10-25T11:07:36.311727Z",
"url": "https://files.pythonhosted.org/packages/63/8a/8b94ed47aae72f33f63597b1249e5152b823a834a5165c5f121a0d813509/odfdo-3.17.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-25 11:07:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jdum",
"github_project": "odfdo",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "odfdo"
}