Simple Python bindings for the libcdr. The binding chain is:
Python (CDRParser) → Cython (.pyx) → C++ (parser.cxx) → libcdr / librevenge
First, the libcdr newer than v0.1.8 must be compiled.
E.g. on Debian:
apt-get install automake cmake libtool libboost-all-dev libicu-dev liblcms2-dev librevenge-dev libcppunit-dev zlib1g-dev
git clone https://git.libreoffice.org/libcdr
cd libcdr
./autogen.sh
./configure
make && sudo make install
Then: pip install git+https://github.com/mpds-io/pylibcdr
The build steps (orchestrated automatically):
- CMake configures using
pylibcdr/CMakeLists.txt. - CMake invokes Cython to transpile
libcdr_interface.pyxintolibcdr_interface.cpp(viaadd_custom_command). - CMake compiles the generated
.cppandcore/parser.cxxinto the Python extensionlibcdr_interface(viaPython_add_library), linking againstlibcdrandlibrevenge.
If CMake fails, delete any _skbuild/ or build/ temp directories before retrying.
import sys
from pylibcdr import CDRParser
parser = CDRParser(sys.argv[1])
print(parser.xml) # raw XHTML/SVG string
print(parser.dict) # parsed as a nested dict
| File | Role |
|---|---|
pylibcdr/__init__.py |
CDRParser class; converts XML string to dict via dictify() |
pylibcdr/libcdr_interface.pyx |
Cython bridge; calls svg(char*) from C++, raises CDRException on error strings |
pylibcdr/core/parser.cxx |
C++ core; uses libcdr/librevenge to parse CDR files, returns XHTML wrapping SVG pages |
pylibcdr/core/parser.h |
Header declaring std::string svg(char* file) |
pylibcdr/CMakeLists.txt |
CMake build: Cython transpilation + Python_add_library for the extension |
pylibcdr/cmake/ |
Custom Find*.cmake modules for libcdr and librevenge |
pyproject.toml |
Project metadata and scikit-build-core configuration |
The C++ svg() function returns an error string prefixed with "ERROR" on failure; the Cython layer detects this and raises CDRException.
The output of svg() is XHTML wrapping one or more SVG documents (one per page). CDRParser.xml exposes this raw string; CDRParser.dict parses it with xml.etree.ElementTree into a nested dict where repeated child tags become lists.
Inherited from the libcdr (MPL 2.0).