ezjww
ezjww reads Jw_cad drawings and converts them to DXF. Its Rust core is
available through Python and TypeScript/WebAssembly.
- Read JWW files and a limited binary JWC profile.
- Inspect source records, headers, layers, and parsing diagnostics.
- Query converted geometry, calculate bounds, and audit drawings.
- Export ASCII DXF (AC1015 or AC1024) and render PNG/PDF previews.
- Convert individual files or directories from the command line.
Installation
Python 3.9 or later:
pip install ezjww
For previews, install the optional Matplotlib dependency:
pip install "ezjww[plot]"
For Node.js, see the TypeScript package:
npm install ezjww
To build the Python package from source, install a Rust toolchain, then run:
git clone https://github.com/monozukuri-ai/ezjww.git
cd ezjww
pip install .
Python quick start
readfile detects JWW or JWC from the file contents. Replace drawing.jww
with your input path; the same API accepts supported .jwc files.
import ezjww
drawing = ezjww.readfile("drawing.jww")
print(drawing.source_format, drawing.header)
print(drawing.stats())
print(drawing.bbox())
lines = drawing.modelspace().query("LINE")
health = drawing.audit()
for diagnostic in health["diagnostics"]:
print(diagnostic["code"], diagnostic["details"])
drawing.saveas("drawing.dxf", target_version="AC1024")
Use read_cad_document when you need the original records. Its return value
identifies the format and contains the corresponding source document:
import ezjww
cad = ezjww.read_cad_document("drawing.jwc")
source = cad["document"]
print(cad["format"], source["entity_counts"])
# JWC DXF geometry defaults to paper millimeters. Select model millimeters
# to apply each entity's layer-group scale.
model = ezjww.readfile("drawing.jwc", jwc_coordinates="model_millimeters")
model.saveas("drawing-model.dxf")
print(model.report()["jwc_conversion_report"]["notices"])
The JWW-specific read_document and read_header keep their original meanings.
Use read_jwc_document and read_jwc_header for JWC-specific reads.
See the API reference for format detection, coordinate options,
errors, and conversion metadata.
Queries and previews
import ezjww
drawing = ezjww.readfile("drawing.jww")
entities = drawing.modelspace().query('LINE POINT[layer=="#lv4", color==5]')
flat = drawing.to_dxf(explode_inserts=True, max_block_nesting=32)
drawing.plot(save_path="drawing.png") # requires ezjww[plot]
drawing.plot(save_path="drawing.pdf")
DXF TEXT records include a width factor (group 41). For JWW, it is estimated from the stored endpoint span and half/full-width character cells. Actual glyph advances depend on the selected font; this is not an exact fit for every font substitution. JWC retains its existing width/height ratio.
Use text_em_scale when a target renderer draws a larger em box per unit of DXF
text height. It must be positive and finite; the default is 1.0. This divides
the exported text height (group 40). A value such as 1.364 is an example that
must be measured for the renderer and font, not a universal correction.
scaled = drawing.to_dxf(text_em_scale=1.364)
ezjww.write_dxf("drawing.jww", "drawing.dxf", text_em_scale=1.364)
drawing.plot(text_em_scale=1.364, save_path="drawing.png")
Previews apply the width factor to glyphs before rotation and recover the source
em height from text_em_scale. They use the locally available font, so they may
differ from an external DXF viewer. Audit, bounding-box and statistics queries
retain their existing defaults.
Block expansion supports nested JWW INSERTs; max_block_nesting must be at least
- Statistics and bounding boxes include hidden entities. TEXT bounds use the insertion point, so they are not bounds of the rendered glyphs.
Command line
The Python package installs the ezjww command. Each single-file command below
accepts JWW and supported JWC input.
ezjww info drawing.jww --json
ezjww audit drawing.jwc --json
ezjww bbox drawing.jwc --jwc-coordinates model_millimeters --json
ezjww stats drawing.jww --json
ezjww report drawing.jwc --json
ezjww to-dxf drawing.jwc -o drawing.dxf --report json
ezjww to-dxf drawing.jww -o drawing.dxf --text-em-scale 1.364
ezjww to-dxf-dir drawings -o dxf --recursive
ezjww plot drawing.jwc -o drawing.png
Use ezjww --help or ezjww <command> --help for options. Audit/report commands
support --fail-on-issues for automation. Rendering requires ezjww[plot].
Directory conversion finds .jww and .jwc case-insensitively and preserves
subdirectories. If inputs would share an output name (for example, a.jww and
a.jwc), it exits with code 2 before writing any converted files.
Compatibility
JWW parsing supports CP932 and Unicode strings, block definitions, and structured diagnostics. Some damaged JWW entity lists can be read partially; inspect diagnostics before relying on the result.
JWC support covers the fixed2421_basic_v1 and fixed2389_basic_v1 document
profiles (two header layouts sharing one record layout). It includes lines,
circles, circular and elliptical arcs, rotated ellipses, CP932 text, points, and
auxiliary points. Settings and attribute bits outside ezjww's reference corpus are
retained and reported as JWC_* diagnostics; structurally inconsistent or
malformed JWC files raise an error instead of returning a partial document.
Compatibility with every JWC generation is not established.
JWC output uses millimeters, with the sheet center as the origin and +Y pointing
up. Palette, dash lengths, and fonts use documented conversion defaults; exact
source fonts and character spacing are not reproduced. The source format version
is unknown and returned as None in Python or null in TypeScript.
Documentation
- Documentation index
- Python and TypeScript APIs for JWW/JWC
- JWC support, coordinates, and conversion limits
- Audit codes and error handling
- JWW signature
- Browser example
License
Metadata
Release files for ezjww 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ezjww-0.3.1.tar.gz | 967.2 kB | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ezjww-0.3.1-cp39-abi3-win_amd64.whl | CPython 3.9 | abi3 | Windows x86-64 | Details |
| ezjww-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| ezjww-0.3.1-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl | CPython 3.9 | abi3 | macOS 10.12+ universal2 (ARM64, x86-64), macOS 11.0+ ARM64, macOS 10.12+ x86-64 | Details |
Total release size: 3.4 MB
Release files / ezjww-0.3.1.tar.gz
| Download URL | ezjww-0.3.1.tar.gz |
|---|---|
| Size | 967.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9e9d07ceadd29519d2fb93b3eb326b3af7dc2fb0243ea9a336881277d55c7df1
|
|
BLAKE2b-256 checksum How to use checksums |
1b04ce38ac7eeb4f2fd6271f1e47e84779b1b2c1fa609e64e64c7fbc19a34634
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ezjww-0.3.1-cp39-abi3-win_amd64.whl
| Download URL | ezjww-0.3.1-cp39-abi3-win_amd64.whl |
|---|---|
| Size | 520.5 kB |
| Tags | CPython 3.9 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
fc19ca5abe674d02e74f2578aee8081e092687d18e0b3d166f731e4206fb30a0
|
|
BLAKE2b-256 checksum How to use checksums |
cca81b547ec4f4d8fb0f1cce2c2dd7282fbd363167d8ee7d6d6d35f3eac3eb5a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ezjww-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | ezjww-0.3.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 677.2 kB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
184a804e5f026418f79ecafbb44278b81d6c6a97dbe473d8f0369bf53eb6f43a
|
|
BLAKE2b-256 checksum How to use checksums |
6db349b028da9c43ee3a58bfec8a6ea49d8272fccaabf694f28ba81c379ae8f7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / ezjww-0.3.1-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
| Download URL | ezjww-0.3.1-cp39-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl |
|---|---|
| Size | 1.2 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ universal2 (ARM64, x86-64) macOS 10.12+ x86-64 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
fb900e6b6647a20597271ba05bbe0be2a274542c3843e0f858a32b8dbf39109f
|
|
BLAKE2b-256 checksum How to use checksums |
a875aca84d667c39d25cd6249214f3707a833ee8eaa3a1f67b0bf6d259a5316f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.12 {"installer":{"name":"uv","version":"0.12.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|