sohojpath 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,35 @@
1
+ # Changelog
2
+
3
+ All notable changes to Sohojpath will be documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and releases use
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.1] - 2026-08-23
10
+
11
+ ### Added
12
+
13
+ - Configuration validation and bounded Tesseract execution.
14
+ - Unit, CLI, PDF-rendering, and real-Tesseract integration coverage.
15
+ - Ruff, mypy, coverage, and expanded Python-version CI checks.
16
+ - Contributor support, conduct, and release documentation.
17
+
18
+ ### Changed
19
+
20
+ - Use the supported `pymupdf` import instead of the deprecated `fitz` API.
21
+ - Centralize version metadata and adopt the SPDX license-expression format.
22
+ - Document geometry, ordering, schema stability, and API failure behavior.
23
+
24
+ ## [0.1.0] - 2026-08-23
25
+
26
+ ### Added
27
+
28
+ - Geometry-preserving Bengali and bilingual PDF OCR.
29
+ - Plain-text and page-level JSON Lines commands.
30
+ - Word bounding boxes, line identifiers, and confidence scores.
31
+ - Python API, language diagnostics, typing marker, tests, and PyPI workflows.
32
+
33
+ [Unreleased]: https://github.com/Anindyakafka/sohojpath/compare/v0.1.1...HEAD
34
+ [0.1.1]: https://github.com/Anindyakafka/sohojpath/compare/v0.1.0...v0.1.1
35
+ [0.1.0]: https://github.com/Anindyakafka/sohojpath/releases/tag/v0.1.0
@@ -0,0 +1,12 @@
1
+ # Code of conduct
2
+
3
+ We are committed to a welcoming, harassment-free community regardless of background,
4
+ identity, experience, or viewpoint. Be respectful, assume good intent, accept constructive
5
+ feedback, and keep technical disagreement focused on the work.
6
+
7
+ Harassment, discrimination, threats, deliberate exposure of private information, and other
8
+ unprofessional conduct are unacceptable. Report conduct concerns privately to the repository
9
+ owner. Maintainers may edit or remove contributions and temporarily or permanently restrict
10
+ participation when necessary to protect the community.
11
+
12
+ This policy applies in project spaces and when representing the project elsewhere.
@@ -0,0 +1,14 @@
1
+ # Contributing
2
+
3
+ Thank you for improving Sohojpath.
4
+
5
+ 1. Open an issue for substantial features or behavioral changes.
6
+ 2. Create a focused branch from `main`.
7
+ 3. Install the project with `python -m pip install -e ".[dev]"`.
8
+ 4. Run Ruff, mypy, coverage, and package checks shown in the README before submitting a
9
+ pull request.
10
+ 5. Add tests for bug fixes and new behavior.
11
+ 6. Keep OCR changes auditable: do not discard low-confidence or invalid records silently.
12
+
13
+ Contributions are accepted under the repository's Apache-2.0 license.
14
+ Participation is governed by [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,7 @@
1
+ include CHANGELOG.md
2
+ include CODE_OF_CONDUCT.md
3
+ include CONTRIBUTING.md
4
+ include RELEASING.md
5
+ include SECURITY.md
6
+ include SUPPORT.md
7
+ recursive-include tests *.py
@@ -0,0 +1,176 @@
1
+ Metadata-Version: 2.4
2
+ Name: sohojpath
3
+ Version: 0.1.1
4
+ Summary: Geometry-preserving Bengali OCR for PDF documents
5
+ Author: Anindya
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/Anindyakafka/sohojpath
8
+ Project-URL: Documentation, https://github.com/Anindyakafka/sohojpath#readme
9
+ Project-URL: Repository, https://github.com/Anindyakafka/sohojpath
10
+ Project-URL: Issues, https://github.com/Anindyakafka/sohojpath/issues
11
+ Keywords: bangla,bengali,ocr,pdf,tesseract
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Natural Language :: Bengali
16
+ Classifier: Operating System :: OS Independent
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Topic :: Text Processing :: Linguistic
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: PyMuPDF>=1.24
24
+ Provides-Extra: dev
25
+ Requires-Dist: build>=1.2; extra == "dev"
26
+ Requires-Dist: coverage[toml]>=7.6; extra == "dev"
27
+ Requires-Dist: mypy>=1.13; extra == "dev"
28
+ Requires-Dist: ruff>=0.8; extra == "dev"
29
+ Requires-Dist: twine>=6.0; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ # Sohojpath
33
+
34
+ [![CI](https://github.com/Anindyakafka/sohojpath/actions/workflows/ci.yml/badge.svg)](https://github.com/Anindyakafka/sohojpath/actions/workflows/ci.yml)
35
+ [![PyPI](https://img.shields.io/pypi/v/sohojpath.svg)](https://pypi.org/project/sohojpath/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/sohojpath.svg)](https://pypi.org/project/sohojpath/)
37
+ [![License](https://img.shields.io/github/license/Anindyakafka/sohojpath)](LICENSE)
38
+
39
+ Sohojpath is a Python library and command-line tool for geometry-preserving Bengali PDF
40
+ OCR. It extracts normalized Unicode text while retaining each word's bounding box,
41
+ Tesseract line identifiers, and confidence score for table extraction, document analysis,
42
+ and human review.
43
+
44
+ > Sohojpath is currently alpha software. OCR output is not ground truth; validate critical
45
+ > fields and retain a manual-review path.
46
+
47
+ ## Features
48
+
49
+ - Bengali or bilingual OCR through Tesseract (`ben`, `ben+eng`, or another installed set)
50
+ - Normalized UTF-8 plain-text output
51
+ - Page-level JSON Lines with word coordinates and confidence
52
+ - One-based page selection such as `1,3-5`
53
+ - Python API and `sohojpath` CLI
54
+ - Explicit language-data diagnostics
55
+ - Type information through `py.typed`
56
+
57
+ ## Requirements and installation
58
+
59
+ Sohojpath requires Python 3.10 or newer and Tesseract OCR with Bengali language data.
60
+
61
+ ```powershell
62
+ # Windows
63
+ winget install UB-Mannheim.TesseractOCR
64
+ ```
65
+
66
+ ```bash
67
+ # Ubuntu/Debian
68
+ sudo apt install tesseract-ocr tesseract-ocr-ben
69
+
70
+ # macOS
71
+ brew install tesseract tesseract-lang
72
+ ```
73
+
74
+ Install Sohojpath:
75
+
76
+ ```bash
77
+ python -m pip install sohojpath
78
+ ```
79
+
80
+ For development from a clone:
81
+
82
+ ```bash
83
+ python -m pip install -e ".[dev]"
84
+ ```
85
+
86
+ ## Command line
87
+
88
+ ```bash
89
+ # Check Tesseract and language availability
90
+ sohojpath doctor
91
+
92
+ # Extract normalized text
93
+ sohojpath text document.pdf --pages 1-3 --output document.txt
94
+
95
+ # Extract page-level JSON Lines with word geometry
96
+ sohojpath ocr document.pdf --pages 1-3 --output document.jsonl
97
+ ```
98
+
99
+ Useful options:
100
+
101
+ ```text
102
+ --language ben+eng Tesseract languages
103
+ --dpi 300 Rendering resolution
104
+ --psm 6 Tesseract page-segmentation mode
105
+ --minimum-confidence 40 Exclude lower-confidence words
106
+ --tesseract PATH Explicit Tesseract executable
107
+ --tessdata PATH Explicit language-data directory
108
+ --timeout SECONDS Maximum time for each Tesseract invocation
109
+ ```
110
+
111
+ Run `sohojpath COMMAND --help` for the complete command reference.
112
+
113
+ ## Python API
114
+
115
+ ```python
116
+ from sohojpath import BanglaPdfParser, ParserConfig
117
+
118
+ parser = BanglaPdfParser(ParserConfig(language="ben+eng", dpi=300))
119
+
120
+ for page in parser.parse("document.pdf", pages=[1, 2]):
121
+ print(page.page, page.text)
122
+ for word in page.words:
123
+ print(word.text, word.confidence, word.left, word.top)
124
+ ```
125
+
126
+ If language files are outside Tesseract's default location, pass
127
+ `ParserConfig(tessdata=Path("path/to/tessdata"))`.
128
+
129
+ ## Structured output
130
+
131
+ The `ocr` command emits JSON Lines so large PDFs can be processed incrementally. Each page
132
+ contains its source, one-based page number, DPI, pixel dimensions, normalized text, and
133
+ words with confidence, bounding box, block, paragraph, and line identifiers.
134
+
135
+ Coordinates are integer pixels in the page image rendered at the requested DPI. Pages are
136
+ emitted in the requested order; words are emitted in Tesseract's TSV order. The synthesized
137
+ page text groups words by Tesseract block, paragraph, and line identifiers and orders them
138
+ top-to-bottom, then left-to-right.
139
+
140
+ The JSONL structure is considered provisional during the 0.x series. Incompatible schema
141
+ changes will be called out in the changelog.
142
+
143
+ ## Scope and accuracy
144
+
145
+ Version 0.1 provides a reusable OCR and geometry layer. Document-specific schemas—such as
146
+ electoral rolls, forms, registers, or fixed-column tables—should be implemented as opt-in
147
+ profiles on top of the word geometry API.
148
+
149
+ Applications handling names, identity numbers, legal records, or other sensitive fields
150
+ should preserve source documents, confidence values, validation results, and review
151
+ decisions.
152
+
153
+ ## Development
154
+
155
+ ```bash
156
+ python -m pip install -e ".[dev]"
157
+ python -m ruff format --check .
158
+ python -m ruff check .
159
+ python -m mypy
160
+ python -m coverage run -m unittest discover -s tests -v
161
+ python -m coverage report
162
+ python -m build
163
+ python -m twine check dist/*
164
+ ```
165
+
166
+ The Python API raises `ValueError` for invalid configuration or page selection,
167
+ `FileNotFoundError` for a missing input or Tesseract executable, and `RuntimeError` for PDF,
168
+ language-data, malformed OCR output, timeout, and Tesseract execution failures. The CLI
169
+ reports these failures on standard error and exits with status 2.
170
+
171
+ See [CONTRIBUTING.md](CONTRIBUTING.md), [SUPPORT.md](SUPPORT.md), and
172
+ [SECURITY.md](SECURITY.md).
173
+
174
+ ## License
175
+
176
+ Licensed under the [Apache License 2.0](LICENSE).
@@ -0,0 +1,145 @@
1
+ # Sohojpath
2
+
3
+ [![CI](https://github.com/Anindyakafka/sohojpath/actions/workflows/ci.yml/badge.svg)](https://github.com/Anindyakafka/sohojpath/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/sohojpath.svg)](https://pypi.org/project/sohojpath/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/sohojpath.svg)](https://pypi.org/project/sohojpath/)
6
+ [![License](https://img.shields.io/github/license/Anindyakafka/sohojpath)](LICENSE)
7
+
8
+ Sohojpath is a Python library and command-line tool for geometry-preserving Bengali PDF
9
+ OCR. It extracts normalized Unicode text while retaining each word's bounding box,
10
+ Tesseract line identifiers, and confidence score for table extraction, document analysis,
11
+ and human review.
12
+
13
+ > Sohojpath is currently alpha software. OCR output is not ground truth; validate critical
14
+ > fields and retain a manual-review path.
15
+
16
+ ## Features
17
+
18
+ - Bengali or bilingual OCR through Tesseract (`ben`, `ben+eng`, or another installed set)
19
+ - Normalized UTF-8 plain-text output
20
+ - Page-level JSON Lines with word coordinates and confidence
21
+ - One-based page selection such as `1,3-5`
22
+ - Python API and `sohojpath` CLI
23
+ - Explicit language-data diagnostics
24
+ - Type information through `py.typed`
25
+
26
+ ## Requirements and installation
27
+
28
+ Sohojpath requires Python 3.10 or newer and Tesseract OCR with Bengali language data.
29
+
30
+ ```powershell
31
+ # Windows
32
+ winget install UB-Mannheim.TesseractOCR
33
+ ```
34
+
35
+ ```bash
36
+ # Ubuntu/Debian
37
+ sudo apt install tesseract-ocr tesseract-ocr-ben
38
+
39
+ # macOS
40
+ brew install tesseract tesseract-lang
41
+ ```
42
+
43
+ Install Sohojpath:
44
+
45
+ ```bash
46
+ python -m pip install sohojpath
47
+ ```
48
+
49
+ For development from a clone:
50
+
51
+ ```bash
52
+ python -m pip install -e ".[dev]"
53
+ ```
54
+
55
+ ## Command line
56
+
57
+ ```bash
58
+ # Check Tesseract and language availability
59
+ sohojpath doctor
60
+
61
+ # Extract normalized text
62
+ sohojpath text document.pdf --pages 1-3 --output document.txt
63
+
64
+ # Extract page-level JSON Lines with word geometry
65
+ sohojpath ocr document.pdf --pages 1-3 --output document.jsonl
66
+ ```
67
+
68
+ Useful options:
69
+
70
+ ```text
71
+ --language ben+eng Tesseract languages
72
+ --dpi 300 Rendering resolution
73
+ --psm 6 Tesseract page-segmentation mode
74
+ --minimum-confidence 40 Exclude lower-confidence words
75
+ --tesseract PATH Explicit Tesseract executable
76
+ --tessdata PATH Explicit language-data directory
77
+ --timeout SECONDS Maximum time for each Tesseract invocation
78
+ ```
79
+
80
+ Run `sohojpath COMMAND --help` for the complete command reference.
81
+
82
+ ## Python API
83
+
84
+ ```python
85
+ from sohojpath import BanglaPdfParser, ParserConfig
86
+
87
+ parser = BanglaPdfParser(ParserConfig(language="ben+eng", dpi=300))
88
+
89
+ for page in parser.parse("document.pdf", pages=[1, 2]):
90
+ print(page.page, page.text)
91
+ for word in page.words:
92
+ print(word.text, word.confidence, word.left, word.top)
93
+ ```
94
+
95
+ If language files are outside Tesseract's default location, pass
96
+ `ParserConfig(tessdata=Path("path/to/tessdata"))`.
97
+
98
+ ## Structured output
99
+
100
+ The `ocr` command emits JSON Lines so large PDFs can be processed incrementally. Each page
101
+ contains its source, one-based page number, DPI, pixel dimensions, normalized text, and
102
+ words with confidence, bounding box, block, paragraph, and line identifiers.
103
+
104
+ Coordinates are integer pixels in the page image rendered at the requested DPI. Pages are
105
+ emitted in the requested order; words are emitted in Tesseract's TSV order. The synthesized
106
+ page text groups words by Tesseract block, paragraph, and line identifiers and orders them
107
+ top-to-bottom, then left-to-right.
108
+
109
+ The JSONL structure is considered provisional during the 0.x series. Incompatible schema
110
+ changes will be called out in the changelog.
111
+
112
+ ## Scope and accuracy
113
+
114
+ Version 0.1 provides a reusable OCR and geometry layer. Document-specific schemas—such as
115
+ electoral rolls, forms, registers, or fixed-column tables—should be implemented as opt-in
116
+ profiles on top of the word geometry API.
117
+
118
+ Applications handling names, identity numbers, legal records, or other sensitive fields
119
+ should preserve source documents, confidence values, validation results, and review
120
+ decisions.
121
+
122
+ ## Development
123
+
124
+ ```bash
125
+ python -m pip install -e ".[dev]"
126
+ python -m ruff format --check .
127
+ python -m ruff check .
128
+ python -m mypy
129
+ python -m coverage run -m unittest discover -s tests -v
130
+ python -m coverage report
131
+ python -m build
132
+ python -m twine check dist/*
133
+ ```
134
+
135
+ The Python API raises `ValueError` for invalid configuration or page selection,
136
+ `FileNotFoundError` for a missing input or Tesseract executable, and `RuntimeError` for PDF,
137
+ language-data, malformed OCR output, timeout, and Tesseract execution failures. The CLI
138
+ reports these failures on standard error and exits with status 2.
139
+
140
+ See [CONTRIBUTING.md](CONTRIBUTING.md), [SUPPORT.md](SUPPORT.md), and
141
+ [SECURITY.md](SECURITY.md).
142
+
143
+ ## License
144
+
145
+ Licensed under the [Apache License 2.0](LICENSE).
@@ -0,0 +1,17 @@
1
+ # Release process
2
+
3
+ 1. Confirm CI is green and the working tree is clean.
4
+ 2. Update the version in `src/sohojpath/_version.py` and move changelog entries out of
5
+ `Unreleased`.
6
+ 3. Run Ruff, mypy, coverage, unit tests, the real-Tesseract integration test, `python -m
7
+ build`, and `python -m twine check dist/*`.
8
+ 4. Upload the artifacts to TestPyPI and install the wheel in clean Windows and Linux virtual
9
+ environments.
10
+ 5. Exercise `doctor`, `text`, and `ocr` against a redistributable Bengali test document.
11
+ 6. Commit the release, create a signed `vX.Y.Z` tag, and draft matching GitHub release notes.
12
+ 7. Publish the GitHub release. The protected `pypi` environment then publishes through PyPI
13
+ trusted publishing.
14
+ 8. Verify the PyPI metadata and perform a clean `pip install sohojpath` smoke test.
15
+
16
+ Configure required reviewers on the GitHub `pypi` environment and register this repository's
17
+ publish workflow as a trusted publisher on PyPI before the first production release.
@@ -0,0 +1,8 @@
1
+ # Security policy
2
+
3
+ Until Sohojpath reaches 1.0, security fixes are applied to the latest released version.
4
+
5
+ Please use GitHub's private vulnerability reporting. Do not open a public issue containing
6
+ exploit details, sensitive documents, credentials, or personal data. Include the affected
7
+ version, reproduction steps, impact, and any proposed fix.
8
+
@@ -0,0 +1,9 @@
1
+ # Support
2
+
3
+ Use GitHub Discussions for usage questions and GitHub Issues for reproducible defects or
4
+ feature proposals. Include the Sohojpath, Python, PyMuPDF, and Tesseract versions; operating
5
+ system; installed OCR languages; command or minimal code; and sanitized error output.
6
+
7
+ Do not upload confidential or personally identifiable documents. Follow `SECURITY.md` for
8
+ vulnerabilities. Sohojpath is maintained on a best-effort basis and currently has no
9
+ guaranteed response time or commercial support commitment.