doctra 0.3.2__py3-none-any.whl → 0.4.0__py3-none-any.whl

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.
Files changed (38) hide show
  1. doctra/__init__.py +4 -0
  2. doctra/cli/main.py +168 -0
  3. doctra/engines/image_restoration/__init__.py +10 -0
  4. doctra/engines/image_restoration/docres_engine.py +566 -0
  5. doctra/engines/vlm/service.py +0 -12
  6. doctra/parsers/enhanced_pdf_parser.py +370 -0
  7. doctra/parsers/structured_pdf_parser.py +11 -60
  8. doctra/parsers/table_chart_extractor.py +8 -44
  9. doctra/third_party/docres/data/MBD/MBD.py +110 -0
  10. doctra/third_party/docres/data/MBD/MBD_utils.py +291 -0
  11. doctra/third_party/docres/data/MBD/infer.py +151 -0
  12. doctra/third_party/docres/data/MBD/model/deep_lab_model/aspp.py +95 -0
  13. doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/__init__.py +13 -0
  14. doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/drn.py +402 -0
  15. doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/mobilenet.py +151 -0
  16. doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/resnet.py +170 -0
  17. doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/xception.py +288 -0
  18. doctra/third_party/docres/data/MBD/model/deep_lab_model/decoder.py +59 -0
  19. doctra/third_party/docres/data/MBD/model/deep_lab_model/deeplab.py +81 -0
  20. doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/__init__.py +12 -0
  21. doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/batchnorm.py +282 -0
  22. doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/comm.py +129 -0
  23. doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/replicate.py +88 -0
  24. doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/unittest.py +29 -0
  25. doctra/third_party/docres/data/preprocess/crop_merge_image.py +142 -0
  26. doctra/third_party/docres/inference.py +370 -0
  27. doctra/third_party/docres/models/restormer_arch.py +308 -0
  28. doctra/third_party/docres/utils.py +464 -0
  29. doctra/ui/app.py +5 -32
  30. doctra/utils/progress.py +13 -98
  31. doctra/utils/structured_utils.py +45 -49
  32. doctra/version.py +1 -1
  33. {doctra-0.3.2.dist-info → doctra-0.4.0.dist-info}/METADATA +1 -1
  34. doctra-0.4.0.dist-info/RECORD +67 -0
  35. doctra-0.3.2.dist-info/RECORD +0 -44
  36. {doctra-0.3.2.dist-info → doctra-0.4.0.dist-info}/WHEEL +0 -0
  37. {doctra-0.3.2.dist-info → doctra-0.4.0.dist-info}/licenses/LICENSE +0 -0
  38. {doctra-0.3.2.dist-info → doctra-0.4.0.dist-info}/top_level.txt +0 -0
doctra/utils/progress.py CHANGED
@@ -40,7 +40,6 @@ def _detect_environment() -> Tuple[bool, bool, bool]:
40
40
  Returns (is_notebook, is_tty, is_windows).
41
41
  """
42
42
  is_notebook = "ipykernel" in sys.modules or "jupyter" in sys.modules
43
- # Colab/Kaggle specifics
44
43
  if "google.colab" in sys.modules:
45
44
  is_notebook = True
46
45
  if "kaggle_secrets" in sys.modules or "kaggle_web_client" in sys.modules:
@@ -59,7 +58,6 @@ def _select_emoji(key: str) -> str:
59
58
  - ascii: ASCII text tokens
60
59
  - none: empty prefix
61
60
  """
62
- # Maps
63
61
  default_map = {
64
62
  "loading": "🔄",
65
63
  "charts": "📊",
@@ -70,14 +68,13 @@ def _select_emoji(key: str) -> str:
70
68
  "processing": "⚙️",
71
69
  }
72
70
  safe_map = {
73
- # Use BMP or geometric shapes likely to render everywhere
74
71
  "loading": "⏳",
75
72
  "charts": "▦",
76
73
  "tables": "▤",
77
74
  "figures": "▧",
78
75
  "ocr": "🔎",
79
76
  "vlm": "★",
80
- "processing": "⚙", # no variation selector
77
+ "processing": "⚙",
81
78
  }
82
79
  ascii_map = {
83
80
  "loading": "[loading]",
@@ -89,13 +86,11 @@ def _select_emoji(key: str) -> str:
89
86
  "processing": "[processing]",
90
87
  }
91
88
 
92
- # Determine effective mode
93
89
  mode = _PROGRESS_CONFIG.emoji_mode
94
90
  is_notebook, _, is_windows = _detect_environment()
95
91
  if not _PROGRESS_CONFIG.use_emoji:
96
92
  mode = "none"
97
93
  elif mode == "default":
98
- # Heuristics: prefer safe in Colab/Kaggle notebooks and Windows terminals
99
94
  if is_windows or "google.colab" in sys.modules or "kaggle_secrets" in sys.modules:
100
95
  mode = "safe"
101
96
 
@@ -105,7 +100,6 @@ def _select_emoji(key: str) -> str:
105
100
  return ascii_map.get(key, "")
106
101
  if mode == "safe":
107
102
  return safe_map.get(key, safe_map["processing"])
108
- # default
109
103
  return default_map.get(key, default_map["processing"])
110
104
 
111
105
 
@@ -119,17 +113,13 @@ def _supports_unicode_output() -> bool:
119
113
  except Exception:
120
114
  pass
121
115
 
122
- # Heuristics for common notebook environments that support emoji
123
116
  env = os.environ
124
117
  if any(k in env for k in ("COLAB_GPU", "GCE_METADATA_HOST", "KAGGLE_KERNEL_RUN_TYPE", "JPY_PARENT_PID")):
125
118
  return True
126
119
 
127
- # On modern Windows terminals with UTF-8 code page, assume yes
128
120
  if sys.platform.startswith("win"):
129
- # If user opted-in to force ASCII, respect it
130
121
  if _PROGRESS_CONFIG.force_ascii:
131
122
  return False
132
- # Try to detect WT/Terminal/VSCode which usually handle Unicode
133
123
  if any(k in env for k in ("WT_SESSION", "TERM_PROGRAM", "VSCODE_PID")):
134
124
  return True
135
125
 
@@ -161,19 +151,15 @@ def create_beautiful_progress_bar(
161
151
  :return: Configured tqdm progress bar instance
162
152
  """
163
153
 
164
- # Enhanced styling parameters - notebook-friendly format
165
154
  is_notebook, is_tty, is_windows = _detect_environment()
166
155
  if is_notebook:
167
- # Simpler format for notebooks to avoid display issues
168
156
  bar_format = "{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}]"
169
157
  else:
170
- # Full format for terminal
171
158
  bar_format = (
172
159
  "{l_bar}{bar:30}| {n_fmt}/{total_fmt} "
173
160
  "[{elapsed}<{remaining}, {rate_fmt}{postfix}]"
174
161
  )
175
162
 
176
- # Color schemes based on operation type
177
163
  color_schemes = {
178
164
  "loading": {"colour": "cyan", "ncols": 100},
179
165
  "charts": {"colour": "green", "ncols": 100},
@@ -184,7 +170,6 @@ def create_beautiful_progress_bar(
184
170
  "processing": {"colour": "white", "ncols": 100},
185
171
  }
186
172
 
187
- # Determine color scheme based on description
188
173
  desc_lower = desc.lower()
189
174
  if "loading" in desc_lower or "model" in desc_lower:
190
175
  color_scheme = color_schemes["loading"]
@@ -201,45 +186,37 @@ def create_beautiful_progress_bar(
201
186
  else:
202
187
  color_scheme = color_schemes["processing"]
203
188
 
204
- # Emoji categories
205
189
  emoji_categories = {"loading", "charts", "tables", "figures", "ocr", "vlm", "processing"}
206
190
 
207
- # Add appropriate emoji to description (can be disabled)
208
191
  if _PROGRESS_CONFIG.use_emoji:
209
192
  prefix_key = next((k for k in emoji_categories if k in desc_lower), "processing")
210
193
  prefix = _select_emoji(prefix_key)
211
194
  if prefix:
212
195
  desc = f"{prefix} {desc}"
213
196
 
214
- # Enhanced tqdm configuration
215
197
  tqdm_config = {
216
198
  "total": total,
217
199
  "desc": desc,
218
200
  "leave": leave,
219
201
  "bar_format": bar_format,
220
202
  "ncols": _PROGRESS_CONFIG.ncols_env or color_scheme["ncols"],
221
- # Prefer Unicode unless user forces ASCII or environment lacks Unicode support
222
203
  "ascii": _PROGRESS_CONFIG.force_ascii or not _supports_unicode_output(),
223
- "dynamic_ncols": True, # Responsive width
224
- "smoothing": 0.3, # Smooth progress updates
225
- "mininterval": 0.1, # Minimum update interval
226
- "maxinterval": 1.0, # Maximum update interval
204
+ "dynamic_ncols": True,
205
+ "smoothing": 0.3,
206
+ "mininterval": 0.1,
207
+ "maxinterval": 1.0,
227
208
  "position": position,
228
209
  **kwargs
229
210
  }
230
211
 
231
- # Enhanced environment detection
232
212
  is_notebook, is_terminal, is_windows = _detect_environment()
233
213
 
234
- # Add color only for terminal environments (not notebooks)
235
214
  if not is_notebook and is_terminal:
236
215
  tqdm_config["colour"] = color_scheme["colour"]
237
216
 
238
- # Respect global disable
239
217
  if _PROGRESS_CONFIG.disable:
240
218
  tqdm_config["disable"] = True
241
219
 
242
- # Try creating the progress bar with Unicode, fallback to ASCII on failure (e.g., Windows code page)
243
220
  if is_notebook:
244
221
  tqdm_config.pop("colour", None)
245
222
  try:
@@ -297,7 +274,6 @@ def update_progress_with_info(
297
274
  :param info: Optional dictionary of information to display
298
275
  """
299
276
  if info:
300
- # Format info as postfix
301
277
  postfix_parts = []
302
278
  for key, value in info.items():
303
279
  if isinstance(value, float):
@@ -354,83 +330,22 @@ def create_notebook_friendly_bar(
354
330
  **kwargs
355
331
  ) -> tqdm:
356
332
  """
357
- Create a notebook-friendly progress bar with consistent sizing and static display.
333
+ Create a notebook-friendly progress bar with consistent sizing.
358
334
 
359
- This function creates progress bars specifically optimized for Jupyter notebooks
360
- to avoid display issues and ANSI code problems while maintaining consistency
361
- with the main progress bar styling.
335
+ This function creates progress bars that match the main progress bar
336
+ styling and behavior in notebook environments.
362
337
 
363
338
  :param total: Total number of items to process
364
339
  :param desc: Description text for the progress bar
365
340
  :param kwargs: Additional tqdm parameters
366
341
  :return: Configured notebook-friendly progress bar
367
342
  """
368
- # Force notebook mode
369
- if _PROGRESS_CONFIG.disable:
370
- kwargs["disable"] = True
371
- else:
372
- kwargs["disable"] = False
373
- # Prefer Unicode in notebooks if supported
374
- if "ascii" not in kwargs:
375
- kwargs["ascii"] = _PROGRESS_CONFIG.force_ascii or not _supports_unicode_output()
376
-
377
- # Emoji categories
378
- emoji_categories = {"loading", "charts", "tables", "figures", "ocr", "vlm", "processing"}
379
-
380
- # Add appropriate emoji to description
381
- desc_lower = desc.lower()
382
- if _PROGRESS_CONFIG.use_emoji:
383
- prefix_key = next((k for k in emoji_categories if k in desc_lower), "processing")
384
- prefix = _select_emoji(prefix_key)
385
- if prefix:
386
- desc = f"{prefix} {desc}"
387
-
388
- # Use same format as main progress bar for consistency
389
- bar_format = "{desc}: {percentage:3.0f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}]"
390
-
391
- # Color schemes based on operation type (same as main progress bar)
392
- color_schemes = {
393
- "loading": {"colour": "cyan", "ncols": 100},
394
- "charts": {"colour": "green", "ncols": 100},
395
- "tables": {"colour": "blue", "ncols": 100},
396
- "figures": {"colour": "magenta", "ncols": 100},
397
- "ocr": {"colour": "yellow", "ncols": 100},
398
- "vlm": {"colour": "red", "ncols": 100},
399
- "processing": {"colour": "white", "ncols": 100},
400
- }
401
-
402
- # Determine color scheme based on description
403
- if "loading" in desc_lower or "model" in desc_lower:
404
- color_scheme = color_schemes["loading"]
405
- elif "chart" in desc_lower:
406
- color_scheme = color_schemes["charts"]
407
- elif "table" in desc_lower:
408
- color_scheme = color_schemes["tables"]
409
- elif "figure" in desc_lower:
410
- color_scheme = color_schemes["figures"]
411
- elif "ocr" in desc_lower:
412
- color_scheme = color_schemes["ocr"]
413
- elif "vlm" in desc_lower:
414
- color_scheme = color_schemes["vlm"]
415
- else:
416
- color_scheme = color_schemes["processing"]
417
-
418
- tqdm_config = {
419
- "total": total,
420
- "desc": desc,
421
- "leave": True,
422
- "bar_format": bar_format,
423
- "ncols": _PROGRESS_CONFIG.ncols_env or color_scheme["ncols"], # Use same width as main progress bar
424
- "ascii": kwargs.get("ascii", False),
425
- "dynamic_ncols": True, # Enable responsive width like main progress bar
426
- "smoothing": 0.3, # Use same smoothing as main progress bar
427
- "mininterval": 0.1, # Use same intervals as main progress bar
428
- "maxinterval": 1.0,
343
+ return create_beautiful_progress_bar(
344
+ total=total,
345
+ desc=desc,
346
+ leave=True,
429
347
  **kwargs
430
- }
431
-
432
- # Use regular tqdm instead of tqdm_auto to avoid interactive widgets
433
- return tqdm(**tqdm_config)
348
+ )
434
349
 
435
350
 
436
351
  def progress_for(iterable: Iterable[Any], desc: str, total: Optional[int] = None, leave: bool = True, **kwargs) -> Iterator[Any]:
@@ -1,49 +1,45 @@
1
- from __future__ import annotations
2
- from typing import Any, Dict, Optional
3
- import json
4
-
5
- try:
6
- from pydantic import BaseModel # type: ignore
7
- except Exception: # pydantic not strictly required for normalization
8
- class BaseModel: # fallback stub
9
- pass
10
-
11
- def to_structured_dict(obj: Any) -> Optional[Dict[str, Any]]:
12
- """
13
- Accepts a VLM result that might be:
14
- - JSON string
15
- - dict
16
- - Pydantic BaseModel (v1 .dict() or v2 .model_dump())
17
- Returns a normalized dict with keys: title, headers, rows — or None.
18
- """
19
- if obj is None:
20
- return None
21
-
22
- # JSON string from VLM
23
- if isinstance(obj, str):
24
- try:
25
- obj = json.loads(obj)
26
- except Exception:
27
- return None
28
-
29
- # Pydantic model
30
- if isinstance(obj, BaseModel):
31
- try:
32
- return obj.model_dump() # pydantic v2
33
- except Exception:
34
- try:
35
- return obj.dict() # pydantic v1
36
- except Exception:
37
- return None
38
-
39
- # Plain dict
40
- if isinstance(obj, dict):
41
- title = obj.get("title") or "Untitled"
42
- headers = obj.get("headers") or []
43
- rows = obj.get("rows") or []
44
- # Basic shape checks
45
- if not isinstance(headers, list) or not isinstance(rows, list):
46
- return None
47
- return {"title": title, "headers": headers, "rows": rows}
48
-
49
- return None
1
+ from __future__ import annotations
2
+ from typing import Any, Dict, Optional
3
+ import json
4
+
5
+ try:
6
+ from pydantic import BaseModel # type: ignore
7
+ except Exception:
8
+ class BaseModel:
9
+ pass
10
+
11
+ def to_structured_dict(obj: Any) -> Optional[Dict[str, Any]]:
12
+ """
13
+ Accepts a VLM result that might be:
14
+ - JSON string
15
+ - dict
16
+ - Pydantic BaseModel (v1 .dict() or v2 .model_dump())
17
+ Returns a normalized dict with keys: title, headers, rows — or None.
18
+ """
19
+ if obj is None:
20
+ return None
21
+
22
+ if isinstance(obj, str):
23
+ try:
24
+ obj = json.loads(obj)
25
+ except Exception:
26
+ return None
27
+
28
+ if isinstance(obj, BaseModel):
29
+ try:
30
+ return obj.model_dump()
31
+ except Exception:
32
+ try:
33
+ return obj.dict()
34
+ except Exception:
35
+ return None
36
+
37
+ if isinstance(obj, dict):
38
+ title = obj.get("title") or "Untitled"
39
+ headers = obj.get("headers") or []
40
+ rows = obj.get("rows") or []
41
+ if not isinstance(headers, list) or not isinstance(rows, list):
42
+ return None
43
+ return {"title": title, "headers": headers, "rows": rows}
44
+
45
+ return None
doctra/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  """Version information for Doctra."""
2
- __version__ = '0.3.2'
2
+ __version__ = '0.4.0'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: doctra
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: Parse, extract, and analyze documents with ease
5
5
  Home-page: https://github.com/AdemBoukhris457/Doctra
6
6
  Author: Adem Boukhris
@@ -0,0 +1,67 @@
1
+ doctra/__init__.py,sha256=rNLCyODOpaPb_TTP6qmQnuWZJW9JPXrxg1IfKnvb1No,773
2
+ doctra/version.py,sha256=PSDo-SLZhu8_cWgmtvzLjHyKr7C8D_F61M1tiywnuKY,62
3
+ doctra/cli/__init__.py,sha256=4PTujjYRShOOUlZ7PwuWckShPWLC4v4CYIhJpzgyv1k,911
4
+ doctra/cli/main.py,sha256=6b415qg-8gV4M2Uf0WvdU_nFx65DYFgRu5Q3Ys_LvAo,43756
5
+ doctra/cli/utils.py,sha256=IghiUZQCOmXODC5-5smHGz2KeV4xqbP4avmA1Mggln0,11800
6
+ doctra/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ doctra/engines/image_restoration/__init__.py,sha256=vzcN6Rw7_U-5jIK2pdo2NlgqdLdXDShigrOGM7QLNEE,263
8
+ doctra/engines/image_restoration/docres_engine.py,sha256=6j2LfoqirmEEmLTOsz8nkhqaHUQHjYbJr-2MR01i6Gc,21754
9
+ doctra/engines/layout/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
+ doctra/engines/layout/layout_models.py,sha256=vuTzjWd3FD-SkFPngktmUVhOJ6Xvff6ufwFEq796PQs,3162
11
+ doctra/engines/layout/paddle_layout.py,sha256=P2-Gk8wHpWoA5Jpmo_3OLI59zWq3HeAOBOUKKVdXu8I,6792
12
+ doctra/engines/ocr/__init__.py,sha256=h6bFiveGXdI59fsKzCqOXki3C74DCndEmvloOtMqnR0,133
13
+ doctra/engines/ocr/api.py,sha256=YOBKDLExXpvSiOsc_TDJasaMPxzdVx1llQCtYlsruWo,1280
14
+ doctra/engines/ocr/path_resolver.py,sha256=2_7Nsekt3dCDU3oVsgdr62iMrlAhbGNfYwgh4G7S3pA,1492
15
+ doctra/engines/ocr/pytesseract_engine.py,sha256=Imz2uwju6himkBiS8CH7DLxBRe-LtmMYZiOdb_6PoQw,2911
16
+ doctra/engines/vlm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ doctra/engines/vlm/outlines_types.py,sha256=qL-G6MNiA5mxp1qAPVEFhOANp4NqVt_MQKseJCr_xXE,970
18
+ doctra/engines/vlm/provider.py,sha256=aE8Eo1U-8XqAimakNlT0-T4etIyCV8rZ3DwxdqbFeTc,3131
19
+ doctra/engines/vlm/service.py,sha256=4ExDbLmyyC3ICXxr7OSIqvbOdrwbIJek-DE54vAUgDA,4151
20
+ doctra/exporters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ doctra/exporters/excel_writer.py,sha256=U5Eb5SF7_ll1QveUapSWSkCRt3OEoisKEVUQ_7X8Wjo,7762
22
+ doctra/exporters/html_writer.py,sha256=OlW24Eg5bZcjldRHtd3GDD7RrajuRXj43EJpXIJkYf8,38810
23
+ doctra/exporters/image_saver.py,sha256=zsPoQ0CwoE643ui4iZMdXk96kv5mU8L_zC2JfF22N1A,1639
24
+ doctra/exporters/markdown_table.py,sha256=4_OJIwG_WoIPYBzJx1njy_3tNVdkK6QKSP-P9r-b0zw,2030
25
+ doctra/exporters/markdown_writer.py,sha256=L7EjF2MB8jYX7XkZ3a3NeeEC8gnb0qzRPTzIN9tdfuw,1027
26
+ doctra/parsers/__init__.py,sha256=8M6LVzcWGpuTIK_1SMXML3ll7zK1CTHXGI5qXvqdm-A,206
27
+ doctra/parsers/enhanced_pdf_parser.py,sha256=7KfkQexXTxbi8Naen7HFlFaeoEGpfdbYbvRqkTXw22A,18095
28
+ doctra/parsers/layout_order.py,sha256=W6b-T11H907RZ2FaZwNvnYhmvH11rpUzxC5yLkdf28k,640
29
+ doctra/parsers/structured_pdf_parser.py,sha256=QIZIS5SAaIdGiT8o7G_a4D-Cht7nVLGeSuVzqSYLn14,19160
30
+ doctra/parsers/table_chart_extractor.py,sha256=kSubqX0n0kVu_3jzX6QUyKmEGs9sG3Bg9kzUzn2wPHo,13733
31
+ doctra/third_party/docres/inference.py,sha256=krD5EQDiqki-5uTMqqHYivhL38sfSOhYgaihI751070,13576
32
+ doctra/third_party/docres/utils.py,sha256=N0ZVmOTB3wsinFlYu5hT84C4_MhWGdc98T8LTG-S9dA,14566
33
+ doctra/third_party/docres/data/MBD/MBD.py,sha256=-d6cVQX1FVcGmQ_yJ5l-PQ3xKmkmveQQBytZ38pEGfY,4653
34
+ doctra/third_party/docres/data/MBD/MBD_utils.py,sha256=z8La4F-yglk6fh8KraBUom8QXJLseYden7OBmFtoO7g,11783
35
+ doctra/third_party/docres/data/MBD/infer.py,sha256=xm9ZCnLJLV5TxJjAH-ith7pSFI18J_8CEUpcYCFDLu8,6205
36
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/aspp.py,sha256=IdVcmhl88N6vFe2bnr-G4CEtbUxLSfhKa9T-Wy60otM,3708
37
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/decoder.py,sha256=5eQ9FT-J1Bd-CmA2dYXvVo_PjrpEy-RmSjESLpNReBA,2435
38
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/deeplab.py,sha256=u8pNRvuBzZoDhlr8IsxPzjN2-sMBN3ZnyBFydS9aGj8,3111
39
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/__init__.py,sha256=TsynqBTJgmodrSTDqlKlbYdnYkJJd19lsDrpR-3XMno,539
40
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/drn.py,sha256=M3kHjU4stdY7B-urpkmEmw-aTJ1dleOGXNOqGv2JrxU,15034
41
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/mobilenet.py,sha256=yBqu1LLs7M_5NIztnC8alB42E2xT59pvziIFhYNrMkY,5553
42
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/resnet.py,sha256=W53_VRAlrkY743s_Kpt9MLP3cFVJ0zYVW2J7EBhUQW4,6704
43
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/backbone/xception.py,sha256=HupHNVeeWNsiX8tWy8lQ0ZPUtrf_AaO7rwf_1xV_k0I,11854
44
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/__init__.py,sha256=LHo9Qoia89mwgGImciJALSiMjdzpFHWLwXEi52S6aRg,458
45
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/batchnorm.py,sha256=62Ku4DciMwETTxyjFFPxDB8-UJl53Vi3MCtb82lbfkA,13213
46
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/comm.py,sha256=bGjH2iEqQXOfXmuzm3zzGuB1Ocui6N79Nd8rVGgLqag,4569
47
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/replicate.py,sha256=idizPejwQvHo6W38VoBMcBF3kb7_zlrRvPBqg2Pi-Ko,3305
48
+ doctra/third_party/docres/data/MBD/model/deep_lab_model/sync_batchnorm/unittest.py,sha256=Ub3j1dz25V09d6wL5lpwR4NNQ4cktOe4mzzpOP-jLd4,863
49
+ doctra/third_party/docres/data/preprocess/crop_merge_image.py,sha256=f2NANY92s6IQ1hl1MAXfftFPIyIrj24O4TONjg7SXEc,4747
50
+ doctra/third_party/docres/models/restormer_arch.py,sha256=BSwv_odCcp4HUZj3gv21e4IzFRBiyk8FjKAO8kF4YS8,12510
51
+ doctra/ui/__init__.py,sha256=XzOOKeGSBnUREuDQiCIWds1asFSa2nypFQTJXwclROA,85
52
+ doctra/ui/app.py,sha256=WpXUWHSs7wSYNjY4iBOZJHsKGQ88jDytvOFIjuhqAGE,44031
53
+ doctra/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ doctra/utils/bbox.py,sha256=R2-95p0KiWvet3TH27TQVvCar7WJg6z0u3L21iEDF-A,674
55
+ doctra/utils/constants.py,sha256=ZWOvNDrvETbQ_pxHiX7vUW4J5Oj8_qnov0QacUOBizI,189
56
+ doctra/utils/file_ops.py,sha256=3IS0EQncs6Kaj27fcg2zxQX3xRSvtItIsyKGLYgeOgw,815
57
+ doctra/utils/io_utils.py,sha256=L1bWV4-ybs2j_3ZEN7GfQVgdC73JKVECVnpwKbP0dy0,219
58
+ doctra/utils/ocr_utils.py,sha256=Doa1uYBg3kRgRYd2aPq9fICHgHfrM_efdhZfI7jl6OM,780
59
+ doctra/utils/pdf_io.py,sha256=c8EY47Z1iqVtlLFHS_n0qGuXJ5ERFaMUd84ivXV0b9E,706
60
+ doctra/utils/progress.py,sha256=IKQ_YErWSEd4hddYMUiCORy0_kW4TOYJM891HUEq2_E,11901
61
+ doctra/utils/quiet.py,sha256=5XPS-1CtJ0sVk6qgSQctdhr_wR8mP1xoJLoUbmkXROA,387
62
+ doctra/utils/structured_utils.py,sha256=znC2zr80rZMfIV58lipZ8M4zPq6IF070pdwLBve1qiE,1251
63
+ doctra-0.4.0.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
64
+ doctra-0.4.0.dist-info/METADATA,sha256=nlIT-QfxcwWi97jbQIastNHty8if3CyUv0LaDGiK7tk,28298
65
+ doctra-0.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
66
+ doctra-0.4.0.dist-info/top_level.txt,sha256=jI7E8jHci2gP9y0GYaWxlg9jG0O5n3FjHJJPLXDXMds,7
67
+ doctra-0.4.0.dist-info/RECORD,,
@@ -1,44 +0,0 @@
1
- doctra/__init__.py,sha256=ST_c2GWBoB0y_wpL1qsOeK4bR1RyJhMMn6I5VjVRI6Y,613
2
- doctra/version.py,sha256=ioiNbDzSUf2zah2WhqG2TDJrYEKwp5tlGXIhVsPeCWE,62
3
- doctra/cli/__init__.py,sha256=4PTujjYRShOOUlZ7PwuWckShPWLC4v4CYIhJpzgyv1k,911
4
- doctra/cli/main.py,sha256=o_W1b5kx3xaTbWK6l4IYi0YLwffKBj5pQKflnlaG2Fw,35611
5
- doctra/cli/utils.py,sha256=IghiUZQCOmXODC5-5smHGz2KeV4xqbP4avmA1Mggln0,11800
6
- doctra/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- doctra/engines/layout/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- doctra/engines/layout/layout_models.py,sha256=vuTzjWd3FD-SkFPngktmUVhOJ6Xvff6ufwFEq796PQs,3162
9
- doctra/engines/layout/paddle_layout.py,sha256=P2-Gk8wHpWoA5Jpmo_3OLI59zWq3HeAOBOUKKVdXu8I,6792
10
- doctra/engines/ocr/__init__.py,sha256=h6bFiveGXdI59fsKzCqOXki3C74DCndEmvloOtMqnR0,133
11
- doctra/engines/ocr/api.py,sha256=YOBKDLExXpvSiOsc_TDJasaMPxzdVx1llQCtYlsruWo,1280
12
- doctra/engines/ocr/path_resolver.py,sha256=2_7Nsekt3dCDU3oVsgdr62iMrlAhbGNfYwgh4G7S3pA,1492
13
- doctra/engines/ocr/pytesseract_engine.py,sha256=Imz2uwju6himkBiS8CH7DLxBRe-LtmMYZiOdb_6PoQw,2911
14
- doctra/engines/vlm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- doctra/engines/vlm/outlines_types.py,sha256=qL-G6MNiA5mxp1qAPVEFhOANp4NqVt_MQKseJCr_xXE,970
16
- doctra/engines/vlm/provider.py,sha256=aE8Eo1U-8XqAimakNlT0-T4etIyCV8rZ3DwxdqbFeTc,3131
17
- doctra/engines/vlm/service.py,sha256=Jwws2Jw68-IdHyvEWks4UCoP7Olhqt8IpXfCv5Z7Ml4,4724
18
- doctra/exporters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- doctra/exporters/excel_writer.py,sha256=U5Eb5SF7_ll1QveUapSWSkCRt3OEoisKEVUQ_7X8Wjo,7762
20
- doctra/exporters/html_writer.py,sha256=OlW24Eg5bZcjldRHtd3GDD7RrajuRXj43EJpXIJkYf8,38810
21
- doctra/exporters/image_saver.py,sha256=zsPoQ0CwoE643ui4iZMdXk96kv5mU8L_zC2JfF22N1A,1639
22
- doctra/exporters/markdown_table.py,sha256=4_OJIwG_WoIPYBzJx1njy_3tNVdkK6QKSP-P9r-b0zw,2030
23
- doctra/exporters/markdown_writer.py,sha256=L7EjF2MB8jYX7XkZ3a3NeeEC8gnb0qzRPTzIN9tdfuw,1027
24
- doctra/parsers/__init__.py,sha256=8M6LVzcWGpuTIK_1SMXML3ll7zK1CTHXGI5qXvqdm-A,206
25
- doctra/parsers/layout_order.py,sha256=W6b-T11H907RZ2FaZwNvnYhmvH11rpUzxC5yLkdf28k,640
26
- doctra/parsers/structured_pdf_parser.py,sha256=fbDIQ6VFv1phFPC3lKgcjtCp0AdNA8Ny1dK0F726Pww,21357
27
- doctra/parsers/table_chart_extractor.py,sha256=JuoScqCQbPdQjy4ak77OcZHSPYKGHF4H39fEW6gF3eo,15323
28
- doctra/ui/__init__.py,sha256=XzOOKeGSBnUREuDQiCIWds1asFSa2nypFQTJXwclROA,85
29
- doctra/ui/app.py,sha256=FYDlEG_2pfp7SSHnA04NRNUhOcI-BJPh3qAf5dw5D6g,45903
30
- doctra/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- doctra/utils/bbox.py,sha256=R2-95p0KiWvet3TH27TQVvCar7WJg6z0u3L21iEDF-A,674
32
- doctra/utils/constants.py,sha256=ZWOvNDrvETbQ_pxHiX7vUW4J5Oj8_qnov0QacUOBizI,189
33
- doctra/utils/file_ops.py,sha256=3IS0EQncs6Kaj27fcg2zxQX3xRSvtItIsyKGLYgeOgw,815
34
- doctra/utils/io_utils.py,sha256=L1bWV4-ybs2j_3ZEN7GfQVgdC73JKVECVnpwKbP0dy0,219
35
- doctra/utils/ocr_utils.py,sha256=Doa1uYBg3kRgRYd2aPq9fICHgHfrM_efdhZfI7jl6OM,780
36
- doctra/utils/pdf_io.py,sha256=c8EY47Z1iqVtlLFHS_n0qGuXJ5ERFaMUd84ivXV0b9E,706
37
- doctra/utils/progress.py,sha256=Reo72IyKGTqUYu-956A2PD9hIVTDNrmmDbh4r_ie5Xo,15942
38
- doctra/utils/quiet.py,sha256=5XPS-1CtJ0sVk6qgSQctdhr_wR8mP1xoJLoUbmkXROA,387
39
- doctra/utils/structured_utils.py,sha256=J-qTqo8eCjm36FaRJ_I482LFgYCpm3eukZm-gbNnchw,1401
40
- doctra-0.3.2.dist-info/licenses/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
41
- doctra-0.3.2.dist-info/METADATA,sha256=hXB4Lhcs9nuBrnHv1fPkaJz9C3Qr0BDiZfmCQTxfXys,28298
42
- doctra-0.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
- doctra-0.3.2.dist-info/top_level.txt,sha256=jI7E8jHci2gP9y0GYaWxlg9jG0O5n3FjHJJPLXDXMds,7
44
- doctra-0.3.2.dist-info/RECORD,,
File without changes