docling 2.45.0__py3-none-any.whl → 2.46.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.
- docling/backend/docling_parse_v4_backend.py +61 -27
- docling/backend/html_backend.py +8 -4
- docling/datamodel/pipeline_options.py +1 -3
- docling/models/code_formula_model.py +87 -76
- docling/models/tesseract_ocr_cli_model.py +4 -2
- docling/pipeline/base_pipeline.py +7 -1
- docling/pipeline/threaded_standard_pdf_pipeline.py +6 -4
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/METADATA +2 -2
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/RECORD +13 -13
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/WHEEL +0 -0
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/entry_points.txt +0 -0
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/licenses/LICENSE +0 -0
- {docling-2.45.0.dist-info → docling-2.46.0.dist-info}/top_level.txt +0 -0
@@ -22,15 +22,52 @@ _log = logging.getLogger(__name__)
|
|
22
22
|
|
23
23
|
|
24
24
|
class DoclingParseV4PageBackend(PdfPageBackend):
|
25
|
-
def __init__(
|
25
|
+
def __init__(
|
26
|
+
self,
|
27
|
+
*,
|
28
|
+
dp_doc: PdfDocument,
|
29
|
+
page_obj: PdfPage,
|
30
|
+
page_no: int,
|
31
|
+
create_words: bool = True,
|
32
|
+
create_textlines: bool = True,
|
33
|
+
):
|
26
34
|
self._ppage = page_obj
|
27
|
-
self.
|
28
|
-
self.
|
35
|
+
self._dp_doc = dp_doc
|
36
|
+
self._page_no = page_no
|
37
|
+
self._create_words = create_words
|
38
|
+
self._create_textlines = create_textlines
|
39
|
+
|
40
|
+
self._dpage: Optional[SegmentedPdfPage] = None
|
41
|
+
self._unloaded = False
|
42
|
+
self.valid = (self._ppage is not None) and (self._dp_doc is not None)
|
43
|
+
|
44
|
+
def _ensure_parsed(self) -> None:
|
45
|
+
if self._dpage is not None:
|
46
|
+
return
|
47
|
+
|
48
|
+
seg_page = self._dp_doc.get_page(
|
49
|
+
self._page_no + 1,
|
50
|
+
create_words=self._create_words,
|
51
|
+
create_textlines=self._create_textlines,
|
52
|
+
)
|
53
|
+
|
54
|
+
# In Docling, all TextCell instances are expected with top-left origin.
|
55
|
+
[
|
56
|
+
tc.to_top_left_origin(seg_page.dimension.height)
|
57
|
+
for tc in seg_page.textline_cells
|
58
|
+
]
|
59
|
+
[tc.to_top_left_origin(seg_page.dimension.height) for tc in seg_page.char_cells]
|
60
|
+
[tc.to_top_left_origin(seg_page.dimension.height) for tc in seg_page.word_cells]
|
61
|
+
|
62
|
+
self._dpage = seg_page
|
29
63
|
|
30
64
|
def is_valid(self) -> bool:
|
31
65
|
return self.valid
|
32
66
|
|
33
67
|
def get_text_in_rect(self, bbox: BoundingBox) -> str:
|
68
|
+
self._ensure_parsed()
|
69
|
+
assert self._dpage is not None
|
70
|
+
|
34
71
|
# Find intersecting cells on the page
|
35
72
|
text_piece = ""
|
36
73
|
page_size = self.get_size()
|
@@ -56,12 +93,19 @@ class DoclingParseV4PageBackend(PdfPageBackend):
|
|
56
93
|
return text_piece
|
57
94
|
|
58
95
|
def get_segmented_page(self) -> Optional[SegmentedPdfPage]:
|
96
|
+
self._ensure_parsed()
|
59
97
|
return self._dpage
|
60
98
|
|
61
99
|
def get_text_cells(self) -> Iterable[TextCell]:
|
100
|
+
self._ensure_parsed()
|
101
|
+
assert self._dpage is not None
|
102
|
+
|
62
103
|
return self._dpage.textline_cells
|
63
104
|
|
64
105
|
def get_bitmap_rects(self, scale: float = 1) -> Iterable[BoundingBox]:
|
106
|
+
self._ensure_parsed()
|
107
|
+
assert self._dpage is not None
|
108
|
+
|
65
109
|
AREA_THRESHOLD = 0 # 32 * 32
|
66
110
|
|
67
111
|
images = self._dpage.bitmap_resources
|
@@ -123,8 +167,13 @@ class DoclingParseV4PageBackend(PdfPageBackend):
|
|
123
167
|
# )
|
124
168
|
|
125
169
|
def unload(self):
|
170
|
+
if not self._unloaded and self._dp_doc is not None:
|
171
|
+
self._dp_doc.unload_pages((self._page_no + 1, self._page_no + 2))
|
172
|
+
self._unloaded = True
|
173
|
+
|
126
174
|
self._ppage = None
|
127
175
|
self._dpage = None
|
176
|
+
self._dp_doc = None
|
128
177
|
|
129
178
|
|
130
179
|
class DoclingParseV4DocumentBackend(PdfDocumentBackend):
|
@@ -157,30 +206,15 @@ class DoclingParseV4DocumentBackend(PdfDocumentBackend):
|
|
157
206
|
self, page_no: int, create_words: bool = True, create_textlines: bool = True
|
158
207
|
) -> DoclingParseV4PageBackend:
|
159
208
|
with pypdfium2_lock:
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
for tc in seg_page.textline_cells
|
170
|
-
]
|
171
|
-
[
|
172
|
-
tc.to_top_left_origin(seg_page.dimension.height)
|
173
|
-
for tc in seg_page.char_cells
|
174
|
-
]
|
175
|
-
[
|
176
|
-
tc.to_top_left_origin(seg_page.dimension.height)
|
177
|
-
for tc in seg_page.word_cells
|
178
|
-
]
|
179
|
-
|
180
|
-
return DoclingParseV4PageBackend(
|
181
|
-
seg_page,
|
182
|
-
self._pdoc[page_no],
|
183
|
-
)
|
209
|
+
ppage = self._pdoc[page_no]
|
210
|
+
|
211
|
+
return DoclingParseV4PageBackend(
|
212
|
+
dp_doc=self.dp_doc,
|
213
|
+
page_obj=ppage,
|
214
|
+
page_no=page_no,
|
215
|
+
create_words=create_words,
|
216
|
+
create_textlines=create_textlines,
|
217
|
+
)
|
184
218
|
|
185
219
|
def is_valid(self) -> bool:
|
186
220
|
return self.page_count() > 0
|
docling/backend/html_backend.py
CHANGED
@@ -38,6 +38,7 @@ _BLOCK_TAGS: Final = {
|
|
38
38
|
"address",
|
39
39
|
"details",
|
40
40
|
"figure",
|
41
|
+
"footer",
|
41
42
|
"h1",
|
42
43
|
"h2",
|
43
44
|
"h3",
|
@@ -639,10 +640,12 @@ class HTMLDocumentBackend(DeclarativeDocumentBackend):
|
|
639
640
|
hyperlink=annotated_text.hyperlink,
|
640
641
|
)
|
641
642
|
|
642
|
-
elif tag_name
|
643
|
-
|
643
|
+
elif tag_name in {"details", "footer"}:
|
644
|
+
if tag_name == "footer":
|
645
|
+
current_layer = self.content_layer
|
646
|
+
self.content_layer = ContentLayer.FURNITURE
|
644
647
|
self.parents[self.level + 1] = doc.add_group(
|
645
|
-
name=
|
648
|
+
name=tag_name,
|
646
649
|
label=GroupLabel.SECTION,
|
647
650
|
parent=self.parents[self.level],
|
648
651
|
content_layer=self.content_layer,
|
@@ -651,6 +654,8 @@ class HTMLDocumentBackend(DeclarativeDocumentBackend):
|
|
651
654
|
self._walk(tag, doc)
|
652
655
|
self.parents[self.level + 1] = None
|
653
656
|
self.level -= 1
|
657
|
+
if tag_name == "footer":
|
658
|
+
self.content_layer = current_layer
|
654
659
|
|
655
660
|
def _emit_image(self, img_tag: Tag, doc: DoclingDocument) -> None:
|
656
661
|
figure = img_tag.find_parent("figure")
|
@@ -686,7 +691,6 @@ class HTMLDocumentBackend(DeclarativeDocumentBackend):
|
|
686
691
|
text_clean = HTMLDocumentBackend._clean_unicode(
|
687
692
|
caption_anno_text.text.strip()
|
688
693
|
)
|
689
|
-
print(caption_anno_text)
|
690
694
|
caption_item = doc.add_text(
|
691
695
|
label=DocItemLabel.CAPTION,
|
692
696
|
text=text_clean,
|
@@ -323,9 +323,7 @@ class PdfPipelineOptions(PaginatedPipelineOptions):
|
|
323
323
|
),
|
324
324
|
)
|
325
325
|
|
326
|
-
generate_parsed_pages:
|
327
|
-
True # Always True since parsed_page is now mandatory
|
328
|
-
)
|
326
|
+
generate_parsed_pages: bool = False
|
329
327
|
|
330
328
|
|
331
329
|
class ProcessingPipeline(str, Enum):
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import re
|
2
|
-
from collections import Counter
|
3
2
|
from collections.abc import Iterable
|
4
3
|
from pathlib import Path
|
5
4
|
from typing import List, Literal, Optional, Tuple, Union
|
@@ -13,10 +12,11 @@ from docling_core.types.doc import (
|
|
13
12
|
TextItem,
|
14
13
|
)
|
15
14
|
from docling_core.types.doc.labels import CodeLanguageLabel
|
16
|
-
from PIL import Image
|
15
|
+
from PIL import Image
|
17
16
|
from pydantic import BaseModel
|
17
|
+
from transformers import AutoModelForImageTextToText, AutoProcessor
|
18
18
|
|
19
|
-
from docling.datamodel.accelerator_options import AcceleratorOptions
|
19
|
+
from docling.datamodel.accelerator_options import AcceleratorDevice, AcceleratorOptions
|
20
20
|
from docling.datamodel.base_models import ItemAndImageEnrichmentElement
|
21
21
|
from docling.models.base_model import BaseItemAndImageEnrichmentModel
|
22
22
|
from docling.models.utils.hf_model_download import download_hf_model
|
@@ -65,9 +65,9 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
65
65
|
Processes the given batch of elements and enriches them with predictions.
|
66
66
|
"""
|
67
67
|
|
68
|
-
_model_repo_folder = "ds4sd--
|
68
|
+
_model_repo_folder = "ds4sd--CodeFormulaV2"
|
69
69
|
elements_batch_size = 5
|
70
|
-
images_scale = 1.
|
70
|
+
images_scale = 1.67 # = 120 dpi, aligned with training data resolution
|
71
71
|
expansion_factor = 0.18
|
72
72
|
|
73
73
|
def __init__(
|
@@ -95,10 +95,9 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
95
95
|
self.options = options
|
96
96
|
|
97
97
|
if self.enabled:
|
98
|
-
device = decide_device(
|
99
|
-
|
100
|
-
|
101
|
-
CodeFormulaPredictor,
|
98
|
+
self.device = decide_device(
|
99
|
+
accelerator_options.device,
|
100
|
+
supported_devices=[AcceleratorDevice.CPU, AcceleratorDevice.CUDA],
|
102
101
|
)
|
103
102
|
|
104
103
|
if artifacts_path is None:
|
@@ -106,11 +105,14 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
106
105
|
else:
|
107
106
|
artifacts_path = artifacts_path / self._model_repo_folder
|
108
107
|
|
109
|
-
self.
|
110
|
-
artifacts_path
|
111
|
-
|
112
|
-
|
108
|
+
self._processor = AutoProcessor.from_pretrained(
|
109
|
+
artifacts_path,
|
110
|
+
)
|
111
|
+
self._model_max_length = self._processor.tokenizer.model_max_length
|
112
|
+
self._model = AutoModelForImageTextToText.from_pretrained(
|
113
|
+
artifacts_path, device_map=self.device
|
113
114
|
)
|
115
|
+
self._model.eval()
|
114
116
|
|
115
117
|
@staticmethod
|
116
118
|
def download_models(
|
@@ -119,8 +121,8 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
119
121
|
progress: bool = False,
|
120
122
|
) -> Path:
|
121
123
|
return download_hf_model(
|
122
|
-
repo_id="ds4sd/
|
123
|
-
revision="
|
124
|
+
repo_id="ds4sd/CodeFormulaV2",
|
125
|
+
revision="main",
|
124
126
|
local_dir=local_dir,
|
125
127
|
force=force,
|
126
128
|
progress=progress,
|
@@ -172,7 +174,7 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
172
174
|
- The second element is the extracted language if a match is found;
|
173
175
|
otherwise, `None`.
|
174
176
|
"""
|
175
|
-
pattern = r"^<_([^_>]+)_>\s(.*)"
|
177
|
+
pattern = r"^<_([^_>]+)_>\s*(.*)"
|
176
178
|
match = re.match(pattern, input_string, flags=re.DOTALL)
|
177
179
|
if match:
|
178
180
|
language = str(match.group(1)) # the captured programming language
|
@@ -203,81 +205,74 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
203
205
|
except ValueError:
|
204
206
|
return CodeLanguageLabel.UNKNOWN
|
205
207
|
|
206
|
-
def
|
208
|
+
def _get_prompt(self, label: str) -> str:
|
207
209
|
"""
|
208
|
-
|
210
|
+
Constructs the prompt for the model based on the input label.
|
209
211
|
|
210
212
|
Parameters
|
211
213
|
----------
|
212
|
-
|
213
|
-
|
214
|
+
label : str
|
215
|
+
The type of input, either 'code' or 'formula'.
|
214
216
|
|
215
217
|
Returns
|
216
218
|
-------
|
217
|
-
|
218
|
-
|
219
|
+
str
|
220
|
+
The constructed prompt including necessary tokens and query.
|
221
|
+
|
222
|
+
Raises
|
223
|
+
------
|
224
|
+
NotImplementedError
|
225
|
+
If the label is not 'code' or 'formula'.
|
219
226
|
"""
|
220
|
-
|
221
|
-
|
227
|
+
if label == "code":
|
228
|
+
query = "<code>"
|
229
|
+
elif label == "formula":
|
230
|
+
query = "<formula>"
|
231
|
+
else:
|
232
|
+
raise NotImplementedError("Label must be either code or formula")
|
222
233
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
right = img_np[:, -1] # shape (H,)
|
234
|
+
messages = [
|
235
|
+
{
|
236
|
+
"role": "user",
|
237
|
+
"content": [{"type": "image"}, {"type": "text", "text": query}],
|
238
|
+
},
|
239
|
+
]
|
230
240
|
|
231
|
-
|
232
|
-
|
241
|
+
prompt = self._processor.apply_chat_template(
|
242
|
+
messages, add_generation_prompt=True
|
243
|
+
)
|
233
244
|
|
234
|
-
|
235
|
-
freq = Counter(edges.tolist())
|
236
|
-
most_common_value, _ = freq.most_common(1)[0]
|
237
|
-
return int(most_common_value) # single channel color
|
245
|
+
return prompt
|
238
246
|
|
239
|
-
|
240
|
-
# Color image: shape (H, W, C)
|
241
|
-
top = img_np[0, :, :] # shape (W, C)
|
242
|
-
bottom = img_np[-1, :, :] # shape (W, C)
|
243
|
-
left = img_np[:, 0, :] # shape (H, C)
|
244
|
-
right = img_np[:, -1, :] # shape (H, C)
|
245
|
-
|
246
|
-
# Concatenate edges along first axis
|
247
|
-
edges = np.concatenate([top, bottom, left, right], axis=0)
|
248
|
-
|
249
|
-
# Convert each color to a tuple for counting
|
250
|
-
edges_as_tuples = [tuple(pixel) for pixel in edges]
|
251
|
-
freq = Counter(edges_as_tuples)
|
252
|
-
most_common_value, _ = freq.most_common(1)[0]
|
253
|
-
return most_common_value # e.g. (R, G, B) or (R, G, B, A)
|
254
|
-
|
255
|
-
def _pad_with_most_frequent_edge_color(
|
256
|
-
self, img: Union[Image.Image, np.ndarray], padding: Tuple[int, int, int, int]
|
257
|
-
):
|
247
|
+
def _post_process(self, texts: list[str]) -> list[str]:
|
258
248
|
"""
|
259
|
-
|
249
|
+
Processes a list of text strings by truncating at '<end_of_utterance>' and
|
250
|
+
removing a predefined set of unwanted substrings.
|
260
251
|
|
261
252
|
Parameters
|
262
253
|
----------
|
263
|
-
|
264
|
-
|
265
|
-
padding : tuple
|
266
|
-
Padding (left, top, right, bottom) in pixels.
|
254
|
+
texts : list[str]
|
255
|
+
A list of strings to be post-processed.
|
267
256
|
|
268
257
|
Returns
|
269
258
|
-------
|
270
|
-
|
259
|
+
list[str]
|
260
|
+
A list of cleaned strings with specified substrings removed and truncated at
|
261
|
+
'<end_of_utterance>' if present.
|
271
262
|
"""
|
272
|
-
|
273
|
-
pil_img = Image.fromarray(img)
|
274
|
-
else:
|
275
|
-
pil_img = img
|
263
|
+
to_remove = ["</code>", "</formula>", "<loc_0><loc_0><loc_500><loc_500>"]
|
276
264
|
|
277
|
-
|
265
|
+
def clean_text(text: str) -> str:
|
266
|
+
idx = text.find("<end_of_utterance>")
|
267
|
+
if idx != -1:
|
268
|
+
text = text[:idx]
|
278
269
|
|
279
|
-
|
280
|
-
|
270
|
+
for token in to_remove:
|
271
|
+
if token in text:
|
272
|
+
text = text.replace(token, "")
|
273
|
+
return text.lstrip()
|
274
|
+
|
275
|
+
return [clean_text(t) for t in texts]
|
281
276
|
|
282
277
|
def __call__(
|
283
278
|
self,
|
@@ -308,14 +303,30 @@ class CodeFormulaModel(BaseItemAndImageEnrichmentModel):
|
|
308
303
|
images: List[Union[Image.Image, np.ndarray]] = []
|
309
304
|
elements: List[TextItem] = []
|
310
305
|
for el in element_batch:
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
306
|
+
elements.append(el.item) # type: ignore[arg-type]
|
307
|
+
labels.append(el.item.label) # type: ignore[attr-defined]
|
308
|
+
images.append(el.image)
|
309
|
+
|
310
|
+
prompts = [self._get_prompt(label) for label in labels]
|
311
|
+
inputs = self._processor(
|
312
|
+
text=prompts,
|
313
|
+
images=images,
|
314
|
+
return_tensors="pt",
|
315
|
+
)
|
316
|
+
inputs = inputs.to(self.device)
|
317
317
|
|
318
|
-
|
318
|
+
gen_kwargs = dict(
|
319
|
+
max_new_tokens=self._model_max_length - inputs.input_ids.shape[1],
|
320
|
+
use_cache=True,
|
321
|
+
do_sample=False,
|
322
|
+
)
|
323
|
+
|
324
|
+
generated_ids = self._model.generate(**inputs, **gen_kwargs)
|
325
|
+
|
326
|
+
outputs = self._processor.batch_decode(
|
327
|
+
generated_ids[:, inputs.input_ids.shape[1] :], skip_special_tokens=False
|
328
|
+
)
|
329
|
+
outputs = self._post_process(outputs)
|
319
330
|
|
320
331
|
for item, output in zip(elements, outputs):
|
321
332
|
if isinstance(item, CodeItem):
|
@@ -320,6 +320,8 @@ class TesseractOcrCliModel(BaseOcrModel):
|
|
320
320
|
|
321
321
|
|
322
322
|
def _parse_orientation(df_osd: pd.DataFrame) -> int:
|
323
|
-
|
324
|
-
|
323
|
+
# For strictly optimal performance with invariant dataframe format:
|
324
|
+
mask = df_osd["key"].to_numpy() == "Orientation in degrees"
|
325
|
+
orientation_val = df_osd["value"].to_numpy()[mask][0]
|
326
|
+
orientation = parse_tesseract_orientation(orientation_val.strip())
|
325
327
|
return orientation
|
@@ -20,7 +20,7 @@ from docling.datamodel.base_models import (
|
|
20
20
|
Page,
|
21
21
|
)
|
22
22
|
from docling.datamodel.document import ConversionResult, InputDocument
|
23
|
-
from docling.datamodel.pipeline_options import PipelineOptions
|
23
|
+
from docling.datamodel.pipeline_options import PdfPipelineOptions, PipelineOptions
|
24
24
|
from docling.datamodel.settings import settings
|
25
25
|
from docling.models.base_model import GenericEnrichmentModel
|
26
26
|
from docling.utils.profiling import ProfilingScope, TimeRecorder
|
@@ -168,6 +168,12 @@ class PaginatedPipeline(BasePipeline): # TODO this is a bad name.
|
|
168
168
|
# Cleanup page backends
|
169
169
|
if not self.keep_backend and p._backend is not None:
|
170
170
|
p._backend.unload()
|
171
|
+
if (
|
172
|
+
isinstance(self.pipeline_options, PdfPipelineOptions)
|
173
|
+
and not self.pipeline_options.generate_parsed_pages
|
174
|
+
):
|
175
|
+
del p.parsed_page
|
176
|
+
p.parsed_page = None
|
171
177
|
|
172
178
|
end_batch_time = time.monotonic()
|
173
179
|
total_elapsed_time += end_batch_time - start_batch_time
|
@@ -565,10 +565,12 @@ class ThreadedStandardPdfPipeline(BasePipeline):
|
|
565
565
|
if not self.keep_images:
|
566
566
|
for p in conv_res.pages:
|
567
567
|
p._image_cache = {}
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
568
|
+
for p in conv_res.pages:
|
569
|
+
if not self.keep_backend and p._backend is not None:
|
570
|
+
p._backend.unload()
|
571
|
+
if not self.pipeline_options.generate_parsed_pages:
|
572
|
+
del p.parsed_page
|
573
|
+
p.parsed_page = None
|
572
574
|
|
573
575
|
# ---------------------------------------------------------------- assemble
|
574
576
|
def _assemble_document(self, conv_res: ConversionResult) -> ConversionResult:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: docling
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.46.0
|
4
4
|
Summary: SDK and CLI for parsing PDF, DOCX, HTML, and more, to a unified document representation for powering downstream workflows such as gen AI applications.
|
5
5
|
Author-email: Christoph Auer <cau@zurich.ibm.com>, Michele Dolfi <dol@zurich.ibm.com>, Maxim Lysak <mly@zurich.ibm.com>, Nikos Livathinos <nli@zurich.ibm.com>, Ahmed Nassar <ahn@zurich.ibm.com>, Panos Vagenas <pva@zurich.ibm.com>, Peter Staar <taa@zurich.ibm.com>
|
6
6
|
License-Expression: MIT
|
@@ -27,7 +27,7 @@ Description-Content-Type: text/markdown
|
|
27
27
|
License-File: LICENSE
|
28
28
|
Requires-Dist: pydantic<3.0.0,>=2.0.0
|
29
29
|
Requires-Dist: docling-core[chunking]<3.0.0,>=2.42.0
|
30
|
-
Requires-Dist: docling-parse<5.0.0,>=4.
|
30
|
+
Requires-Dist: docling-parse<5.0.0,>=4.2.2
|
31
31
|
Requires-Dist: docling-ibm-models<4,>=3.9.0
|
32
32
|
Requires-Dist: filetype<2.0.0,>=1.2.0
|
33
33
|
Requires-Dist: pypdfium2!=4.30.1,<5.0.0,>=4.30.0
|
@@ -8,8 +8,8 @@ docling/backend/asciidoc_backend.py,sha256=RDNLrPJHxROiM7-NQdZn3DdvAyiPAndbSWcZo
|
|
8
8
|
docling/backend/csv_backend.py,sha256=2g9famYG2W-ID9jEdZPxc6O8QGv1vWQfjN8pL-QMBE0,4536
|
9
9
|
docling/backend/docling_parse_backend.py,sha256=9rUo1vPxX6QLzGqF-2B2iEYglZg6YQ3Uea00XrLluTg,7918
|
10
10
|
docling/backend/docling_parse_v2_backend.py,sha256=3ckTfke8IICjaImlIzc3TRhG7KDuxDDba0AuCEcjA-M,9500
|
11
|
-
docling/backend/docling_parse_v4_backend.py,sha256=
|
12
|
-
docling/backend/html_backend.py,sha256=
|
11
|
+
docling/backend/docling_parse_v4_backend.py,sha256=MbCMxNGmoW4iuev9tX1Vt4jtIeak2kC9Uac3xQSRxeo,7509
|
12
|
+
docling/backend/html_backend.py,sha256=zJH4wkcyftvoA-ixC4MH-xjwl-TGTN9BvZT7Hhla2mc,34701
|
13
13
|
docling/backend/md_backend.py,sha256=qCI7SD9hnWWGrkG_drpzQv2Z7DVBG4Tsq3hhTsYV790,22562
|
14
14
|
docling/backend/mets_gbs_backend.py,sha256=EA8sY6tbmGiysKGYPPZiNlK-i7Adn8bLTo-7Ym15hTU,12774
|
15
15
|
docling/backend/msexcel_backend.py,sha256=cq8MQ2RSh6pqCiVrldjOerSww7dOPTWmCQoCBI57i6w,18579
|
@@ -38,7 +38,7 @@ docling/datamodel/asr_model_specs.py,sha256=Wg7z3zm_wXIWu122iPVy0RMECsA_JCFHrlFF
|
|
38
38
|
docling/datamodel/base_models.py,sha256=Ifd8PPHs4sW7ScwSqpa-y3rwgPbde_iw13Y2NUCPfU8,11944
|
39
39
|
docling/datamodel/document.py,sha256=zsxFYXvo6GtwGNogSDoBB1TFvkm7IOrP_VnqXNqBhJs,17329
|
40
40
|
docling/datamodel/layout_model_specs.py,sha256=GSkJ-Z_0PVgwWGi7C7TsxbzRjlrWS9ZrHJjHumv-Z5U,2339
|
41
|
-
docling/datamodel/pipeline_options.py,sha256=
|
41
|
+
docling/datamodel/pipeline_options.py,sha256=vOLpuVF-d4nmr-L16EmmhGFn25SDsgExCfX5kPiyISg,10470
|
42
42
|
docling/datamodel/pipeline_options_asr_model.py,sha256=7X068xl-qpbyPxC7-TwX7Q6tLyZXGT5h1osZ_xLNLM0,1454
|
43
43
|
docling/datamodel/pipeline_options_vlm_model.py,sha256=eH-Cj_8aic9FdX4xGlBcf5_R9e152JAL2LhtY8d0rhw,2498
|
44
44
|
docling/datamodel/settings.py,sha256=c0MTw6pO5be_BKxHKYl4SaBJAw_qL-aapxp-g5HHj1A,2084
|
@@ -47,7 +47,7 @@ docling/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
docling/models/api_vlm_model.py,sha256=-zisU32pgDRbychyG6-neB0qweNbPaYnLXwiGT7SEdI,2859
|
48
48
|
docling/models/base_model.py,sha256=NNjIapqCruAEAWR-CCdsNgXc2QkwiPYAcaQ_ZYe1W28,2978
|
49
49
|
docling/models/base_ocr_model.py,sha256=kT8TylASOpPlY60rIG6VL6_eLVsfg5KvEVnZHzDWtR0,8193
|
50
|
-
docling/models/code_formula_model.py,sha256=
|
50
|
+
docling/models/code_formula_model.py,sha256=XRugm4EwifLRc-TrAk-glKlktJP-nAPneKh2EOovkJU,11308
|
51
51
|
docling/models/document_picture_classifier.py,sha256=9JvoWeH5uQBC7levjM8zptk7UT-b8EQnD-2EnxTjTT4,6202
|
52
52
|
docling/models/easyocr_model.py,sha256=ECPBd-48cCw5s935NsPJO_C_1QuK_yAUGloMM77WqIM,7387
|
53
53
|
docling/models/layout_model.py,sha256=Nfbo6keMB4vVjGoZdFMqD9CmZcWh-0bE3LkRjJTDJQ0,9146
|
@@ -60,7 +60,7 @@ docling/models/picture_description_vlm_model.py,sha256=yfyAFOy8RjxQJrafPMSAMrrpa
|
|
60
60
|
docling/models/rapid_ocr_model.py,sha256=AMdc66s_iWO4p6nQ0LNjQMUYVxrDSxMyLNPpjPYt6N8,5916
|
61
61
|
docling/models/readingorder_model.py,sha256=bZoXHaSwUsa8niSmJrbCuy784ixCeBXT-RQBUfgHJ4A,14925
|
62
62
|
docling/models/table_structure_model.py,sha256=RFXo73f2q4XuKyaSqbxpznh7JVtlLcT0FsOWl9oZbSg,12518
|
63
|
-
docling/models/tesseract_ocr_cli_model.py,sha256=
|
63
|
+
docling/models/tesseract_ocr_cli_model.py,sha256=I3Gn28Y-LD8OfvyCElN9fLiNgpo2sT0uMkVt258253s,12881
|
64
64
|
docling/models/tesseract_ocr_model.py,sha256=GdI5Cjfi87qcehVbM3wdKRvKkl_F9A4bwTUbjXZCJYA,10745
|
65
65
|
docling/models/factories/__init__.py,sha256=x_EM5dDg_A3HBcBYzOoqwmA2AFLtJ1IzYDPX-R1A-Sg,868
|
66
66
|
docling/models/factories/base_factory.py,sha256=MfWIljMETi5aaVR-6qLTelW8u1gwDAQsOwg3fu7O4Qc,4028
|
@@ -75,10 +75,10 @@ docling/models/vlm_models_inline/hf_transformers_model.py,sha256=Rwdr7neDpn5ehtr
|
|
75
75
|
docling/models/vlm_models_inline/mlx_model.py,sha256=YYYmopsITlX17JVS5KhLlb1IQSEVoSECNx_fXLHNpAc,5880
|
76
76
|
docling/pipeline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
77
|
docling/pipeline/asr_pipeline.py,sha256=tQkhu9fXdkSuYIL22xzV2YRUlQh-9qktHBbs2qeXhJI,9070
|
78
|
-
docling/pipeline/base_pipeline.py,sha256=
|
78
|
+
docling/pipeline/base_pipeline.py,sha256=VYVYndifTPSD2GWHKjfi4Y76M5qgt1DiygO-jowKsqM,9919
|
79
79
|
docling/pipeline/simple_pipeline.py,sha256=TXZOwR7hZRji462ZTIpte0VJjzbxvNVE8dbLFANDhSU,2253
|
80
80
|
docling/pipeline/standard_pdf_pipeline.py,sha256=yFishq4Cu01BiBGHk3Irr7ogcTQKeSC0QZImQVAhIaY,12740
|
81
|
-
docling/pipeline/threaded_standard_pdf_pipeline.py,sha256=
|
81
|
+
docling/pipeline/threaded_standard_pdf_pipeline.py,sha256=miPIyprtzPFYG94n6PmUgK4Nh7rqACYEGkWrlTbrZAc,26133
|
82
82
|
docling/pipeline/vlm_pipeline.py,sha256=0lj8tbXNpYF8OLBoLqP2BZfFpTHi40RoHVfvO_Nah4Q,15349
|
83
83
|
docling/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
84
84
|
docling/utils/accelerator_utils.py,sha256=DSajLxVx1JEVT0zt5de26llciLNlVfIDfSa2zYCFJzQ,2909
|
@@ -93,9 +93,9 @@ docling/utils/orientation.py,sha256=jTyLxyT31FlOodZoBMlADHNQK2lAWKYVs5z7pXd_6Cg,
|
|
93
93
|
docling/utils/profiling.py,sha256=YaMGoB9MMZpagF9mb5ndoHj8Lpb9aIdb7El-Pl7IcFs,1753
|
94
94
|
docling/utils/utils.py,sha256=kJtIYuzXeOyJHYlxmLAo7dGM5rEsDa1i84qEsUj1nio,1908
|
95
95
|
docling/utils/visualization.py,sha256=tY2ylE2aiQKkmzlSLnFW-HTfFyqUUMguW18ldd1PLfo,2868
|
96
|
-
docling-2.
|
97
|
-
docling-2.
|
98
|
-
docling-2.
|
99
|
-
docling-2.
|
100
|
-
docling-2.
|
101
|
-
docling-2.
|
96
|
+
docling-2.46.0.dist-info/licenses/LICENSE,sha256=mBb7ErEcM8VS9OhiGHnQ2kk75HwPhr54W1Oiz3965MY,1088
|
97
|
+
docling-2.46.0.dist-info/METADATA,sha256=fm7KVaUwGryyuRk7R_AkNSHo1BogY8-ra9gpCWXbnCA,10459
|
98
|
+
docling-2.46.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
99
|
+
docling-2.46.0.dist-info/entry_points.txt,sha256=hzVlbeE0aMSTQ9S0-NTYN0Hmgsn6qL_EA2qX4UbkAuY,149
|
100
|
+
docling-2.46.0.dist-info/top_level.txt,sha256=vkIywP-USjFyYo1AIRQbWQQaL3xB5jf8vkCYdTIfNic,8
|
101
|
+
docling-2.46.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|