jbpy
jbpy is a library for reading and writing Joint BIIF Profile files. Including:
- National Imagery Transmission Format (NITF)
- North Atlantic Treaty Organisation (NATO) Secondary Imagery Format (NSIF)
The Joint BIIF Profile is available from the NSG Standards Registry. See: https://nsgreg.nga.mil/doc/view?i=5674
Install
jbpy can be installed using pip:
$ python -m pip install jbpy
jbpy can also be installed using conda and the conda-forge channel:
$ conda install --channel conda-forge jbpy
License
This repository is licensed under the MIT license.
Features
Jbp objects
jbpy.Jbp objects provide a dict-like interface to JBP files.
>>> from tempfile import TemporaryFile
>>> import jbpy
>>> ntf = jbpy.Jbp()
>>> ntf["FileHeader"]["OSTAID"].value = "README"
>>> ntf.finalize()
>>> file = TemporaryFile()
>>> _ = ntf.dump(file)
>>> ntf2 = jbpy.Jbp()
>>> _ = file.seek(0)
>>> _ = ntf2.load(file)
>>> ntf2["FileHeader"]["OSTAID"].print()
OSTAID 10 @ 15 b'README '
Utilities
jbpy command-line utilities make it easy to inspect JBP files.
$ jbpdump NITF_TXT_POS_04.ntf --text-segment 0
Text Only Segment.
Directly accessing URLs is possible when smart_open is installed.
$ jbpinfo https://capella-open-data.s3.amazonaws.com/data/2020/12/7/CAPELLA_C02_SM_SICD_HH_20201207083444_20201207083448/CAPELLA_C02_SM_SICD_HH_20201207083444_20201207083448.ntf | head -n 7
FHDR 4 @ 0 b'NITF'
FVER 5 @ 4 b'02.10'
CLEVEL 2 @ 9 b'06'
STYPE 4 @ 11 b'BF01'
OSTAID 10 @ 15 b'CAPELLA HQ'
FDT 14 @ 25 b'20230701003316'
FTITLE 80 @ 39 b'SICD: CAPELLA_C02_SM_SICD_HH_20201207083444_20201207083448.ntf '
Support Data Extensions
The JBP document provides extensibility through Support Data Extensions (SDEs) such as Tagged Record Extensions (TREs)
and Data Extension Segments (DES).
To mimic this extensibility, jbpy defines two entry point groups which are used to load SDE plugins:
jbpy.extensions.trejbpy.extensions.des_subheader
jbpy provides a number of built-in SDEs and will load additional SDEs from separately installed packages provided
they are declared under these entry point groups as described below.
[!WARNING] There is not currently a mechanism to arbitrate multiple SDEs that are registered under the same plugin name.
TREs
A TRE plugin is named using a 6-character (left-justified and space-padded) TRETAG.
The object reference must resolve to a function with no required arguments that instantiates a jbpy.core.Tre object.
pyproject.toml example:
[project.entry-points."jbpy.extensions.tre"]
"MYTRE " = "my_package.my_module:my_tre_func"
Once registered, a TRE object can be instantiated using jbpy.tre_factory:
>>> import jbpy
>>> tre = jbpy.tre_factory("MYTRE") # note: tag passed to factory must have trailing spaces stripped
DES Subheaders
A DES subheader plugin is named using a 27-character string formed by concatenating the 25-character DESID and 2-digit
DESVER.
The object reference must resolve to a function that accepts a string-valued name and instantiates a
jbpy.core.DataExtensionSubheader object.
pyproject.toml example:
[project.entry-points."jbpy.extensions.des_subheader"]
"MY DES SUBHEADER 24" = "my_des_subheader_func"
Once registered, a DES subheader object can be instantiated using jbpy.des_subheader_factory:
>>> import jbpy
>>> des_subhdr = jbpy.des_subheader_factory("MY DES SUBHEADER", 24)
Testing
Some tests rely on the JITC Quick Look Test Data.
If this data is available, it can be used by setting the JBPY_JITC_QUICKLOOK_DIR environment variable.
JBPY_JITC_QUICKLOOK_DIR=<path> pytest
Metadata
Release files for jbpy 0.6.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 | |
|---|---|---|---|
| jbpy-0.6.1.tar.gz | 59.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jbpy-0.6.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.3 kB
Release files / jbpy-0.6.1.tar.gz
| Download URL | jbpy-0.6.1.tar.gz |
|---|---|
| Size | 59.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23efac30cbbae33e4318eb71f073825b0b7a6578335479e34bb61451406dc523
|
|
BLAKE2b-256 checksum How to use checksums |
06d049258552145d01cdb46d7ab42747d827d786a1d8b57d074572e62be4b21f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency logRelease files / jbpy-0.6.1-py3-none-any.whl
| Download URL | jbpy-0.6.1-py3-none-any.whl |
|---|---|
| Size | 45.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8c046d48db9ddab218bf9a9ff4797c64ae567746eaf3fa9a27ebe4f8bc319885
|
|
BLAKE2b-256 checksum How to use checksums |
484b4e86304da39405734949770e4315d598016c891fdf2d28159c7a2503980b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2026.
Transparency log