docvortex 0.4.5__tar.gz → 0.4.6__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.
- {docvortex-0.4.5/src/docvortex.egg-info → docvortex-0.4.6}/PKG-INFO +3 -3
- {docvortex-0.4.5 → docvortex-0.4.6}/README.md +2 -2
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_script_geometry.py +55 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +11 -3
- docvortex-0.4.6/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +135 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +4 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +15 -1
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/formulas.py +123 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/graphics.py +18 -5
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/detection.py +7 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/scripts.py +2 -2
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_merging.py +27 -2
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/models.py +1 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/pipeline.py +8 -1
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +11 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +16 -1
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/_document.py +0 -34
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_contracts.py +0 -12
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_objects.py +11 -1
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_text_geometry.py +4 -158
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/_contracts.py +4 -0
- docvortex-0.4.6/src/docvortex/document/pdf/text/dedup.py +475 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/extract.py +81 -48
- docvortex-0.4.6/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +410 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/version.py +1 -1
- {docvortex-0.4.5 → docvortex-0.4.6/src/docvortex.egg-info}/PKG-INFO +3 -3
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/SOURCES.txt +9 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_geometry_manifest.json +1 -1
- docvortex-0.4.6/tests/fixtures/pdf_char_dedup.json +2142 -0
- docvortex-0.4.6/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- docvortex-0.4.6/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- docvortex-0.4.6/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- docvortex-0.4.6/tests/unittest/test_flash_pdf_layout_repairs.py +279 -0
- docvortex-0.4.6/tests/unittest/test_pdf_text_dedup.py +309 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/LICENSE.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/MANIFEST.in +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/README.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/demo.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/METADATA.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/USAGE.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/pyproject.toml +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/setup.cfg +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/options.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/result.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_architecture.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/__init__.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/build_html_css.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.5 → docvortex-0.4.6}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.6
|
|
4
4
|
Summary: A fast, multi-format document parsing and conversion engine
|
|
5
5
|
License-Expression: MIT
|
|
6
6
|
Project-URL: Repository, https://github.com/myhloli/DocVortex
|
|
@@ -54,7 +54,7 @@ Dynamic: license-file
|
|
|
54
54
|
|
|
55
55
|
<div align="center">
|
|
56
56
|
|
|
57
|
-
<img src="https://
|
|
57
|
+
<img src="https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
|
|
58
58
|
|
|
59
59
|
# DocVortex
|
|
60
60
|
|
|
@@ -85,7 +85,7 @@ then exports the result in the formats your workflow needs.
|
|
|
85
85
|
Native parsing works without an OCR or VLM inference service. Use DocVortex
|
|
86
86
|
directly through its CLI or Python SDK, independently of MinerU.
|
|
87
87
|
|
|
88
|
-

|
|
89
89
|
|
|
90
90
|
## Quick start
|
|
91
91
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<img src="https://
|
|
3
|
+
<img src="https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
|
|
4
4
|
|
|
5
5
|
# DocVortex
|
|
6
6
|
|
|
@@ -31,7 +31,7 @@ then exports the result in the formats your workflow needs.
|
|
|
31
31
|
Native parsing works without an OCR or VLM inference service. Use DocVortex
|
|
32
32
|
directly through its CLI or Python SDK, independently of MinerU.
|
|
33
33
|
|
|
34
|
-

|
|
35
35
|
|
|
36
36
|
## Quick start
|
|
37
37
|
|
|
@@ -620,6 +620,61 @@ def _assign_component(
|
|
|
620
620
|
roles[index] = "body"
|
|
621
621
|
|
|
622
622
|
|
|
623
|
+
def paired_script_roles(
|
|
624
|
+
chars: list[Char],
|
|
625
|
+
roles: list[ScriptRole],
|
|
626
|
+
tight_bboxes: dict[int, BBox],
|
|
627
|
+
origins: dict[int, tuple[float, float]],
|
|
628
|
+
) -> dict[int, ScriptRole]:
|
|
629
|
+
"""确认同一基字符右侧横向叠放的上下标,排除分式和远距邻列。"""
|
|
630
|
+
|
|
631
|
+
features = build_script_features(chars, tight_bboxes, origins, set())
|
|
632
|
+
visible = [feature for feature in features if feature.text.isprintable() and not feature.text.isspace()]
|
|
633
|
+
paired: dict[int, ScriptRole] = {}
|
|
634
|
+
for position, (base, first, second) in enumerate(zip(visible, visible[1:], visible[2:])):
|
|
635
|
+
if (
|
|
636
|
+
not all(feature.is_valid and feature.text.isalnum() for feature in (base, first, second))
|
|
637
|
+
or roles[base.index] != "body"
|
|
638
|
+
or {roles[first.index], roles[second.index]} != {"sup", "sub"}
|
|
639
|
+
):
|
|
640
|
+
continue
|
|
641
|
+
assert base.tight_bbox is not None and base.origin is not None
|
|
642
|
+
assert first.tight_bbox is not None and first.origin is not None
|
|
643
|
+
assert second.tight_bbox is not None and second.origin is not None
|
|
644
|
+
scale = base.tight_height
|
|
645
|
+
if scale <= 0 or any(feature.tight_height > 0.8 * scale for feature in (first, second)):
|
|
646
|
+
continue
|
|
647
|
+
overlap = min(first.tight_bbox[2], second.tight_bbox[2]) - max(first.tight_bbox[0], second.tight_bbox[0])
|
|
648
|
+
minimum_width = min(first.tight_bbox[2] - first.tight_bbox[0], second.tight_bbox[2] - second.tight_bbox[0])
|
|
649
|
+
if overlap < 0.5 * minimum_width:
|
|
650
|
+
continue
|
|
651
|
+
if any(
|
|
652
|
+
not -0.15 * scale <= feature.tight_bbox[0] - base.tight_bbox[2] <= 0.5 * scale
|
|
653
|
+
or abs(feature.origin[1] - base.origin[1]) < 0.15 * scale
|
|
654
|
+
or abs(feature.origin[1] - base.origin[1]) > scale
|
|
655
|
+
for feature in (first, second)
|
|
656
|
+
):
|
|
657
|
+
continue
|
|
658
|
+
if (first.origin[1] - base.origin[1]) * (second.origin[1] - base.origin[1]) >= 0:
|
|
659
|
+
continue
|
|
660
|
+
# 本补证据只接纳完整单字符角标,不能只给 grid 等多字母角标的首字母加样式。
|
|
661
|
+
following = visible[position + 3] if position + 3 < len(visible) else None
|
|
662
|
+
if (
|
|
663
|
+
following is not None
|
|
664
|
+
and following.is_valid
|
|
665
|
+
and following.text.isalnum()
|
|
666
|
+
and following.tight_bbox is not None
|
|
667
|
+
and following.origin is not None
|
|
668
|
+
and following.tight_height <= 0.8 * scale
|
|
669
|
+
and abs(following.origin[1] - second.origin[1]) <= 0.15 * scale
|
|
670
|
+
and -0.15 * scale <= following.tight_bbox[0] - second.tight_bbox[2] <= 0.5 * scale
|
|
671
|
+
):
|
|
672
|
+
continue
|
|
673
|
+
paired[first.index] = roles[first.index]
|
|
674
|
+
paired[second.index] = roles[second.index]
|
|
675
|
+
return paired
|
|
676
|
+
|
|
677
|
+
|
|
623
678
|
def classify_char_script_roles(
|
|
624
679
|
chars: list[Char],
|
|
625
680
|
*,
|
{docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py
RENAMED
|
@@ -19,6 +19,7 @@ from .contracts import (
|
|
|
19
19
|
from .geometry import bbox_intersection, normalize_bbox
|
|
20
20
|
from .sparse_hybrid import build_sparse_hybrid_candidates, diagnose_sparse_hybrid_candidate_builds
|
|
21
21
|
from .sparse_multiline import build_sparse_multiline_candidates, diagnose_sparse_multiline_candidate_builds
|
|
22
|
+
from .rule_band import build_rule_band_candidates
|
|
22
23
|
from .text import build_native_table_text
|
|
23
24
|
from .text_grid import build_text_candidates, diagnose_text_candidate_builds
|
|
24
25
|
from .vector import MAX_PRIMITIVES_PER_TABLE, build_vector_candidates, diagnose_vector_candidate_builds
|
|
@@ -379,8 +380,11 @@ def _evaluate_native_pdf_table(
|
|
|
379
380
|
)
|
|
380
381
|
if _has_alias_affected_physical_blank_row(vector_attempts):
|
|
381
382
|
sparse_hybrid_allowed = False
|
|
382
|
-
|
|
383
|
-
|
|
383
|
+
rule_band_candidates = build_rule_band_candidates(table_input, text) if sparse_hybrid_allowed else []
|
|
384
|
+
sparse_hybrid_candidates = (
|
|
385
|
+
build_sparse_hybrid_candidates(table_input, text) if sparse_hybrid_allowed and not rule_band_candidates else []
|
|
386
|
+
)
|
|
387
|
+
sparse_hybrid_selection = _select_candidate([*rule_band_candidates, *sparse_hybrid_candidates])
|
|
384
388
|
text_candidates = (
|
|
385
389
|
build_text_candidates(table_input, text)
|
|
386
390
|
if len(text.rows) >= 2 and vector_selection is None and sparse_hybrid_selection is None
|
|
@@ -396,6 +400,7 @@ def _evaluate_native_pdf_table(
|
|
|
396
400
|
text_candidates = []
|
|
397
401
|
existing_generated_candidates = [
|
|
398
402
|
*vector_candidates,
|
|
403
|
+
*rule_band_candidates,
|
|
399
404
|
*sparse_hybrid_candidates,
|
|
400
405
|
*text_candidates,
|
|
401
406
|
]
|
|
@@ -466,7 +471,10 @@ def diagnose_native_pdf_table(table_input: NativeTableInput) -> dict[str, Any]:
|
|
|
466
471
|
if evaluation.text is not None
|
|
467
472
|
else ()
|
|
468
473
|
)
|
|
469
|
-
|
|
474
|
+
rule_band_attempts: list[dict[str, Any]] = []
|
|
475
|
+
if evaluation.text is not None:
|
|
476
|
+
build_rule_band_candidates(table_input, evaluation.text, diagnostics=rule_band_attempts)
|
|
477
|
+
sparse_multiline_attempts = tuple(rule_band_attempts) + (
|
|
470
478
|
diagnose_sparse_multiline_candidate_builds(
|
|
471
479
|
table_input,
|
|
472
480
|
evaluation.text,
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""以三线表物理表头边界恢复换行表头和同步重启的描述列。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from .candidate import GridCellSpec, build_candidate
|
|
8
|
+
from .contracts import NativeTableCandidate, NativeTableInput, NativeTableText
|
|
9
|
+
from .geometry import normalize_angle, table_local_size
|
|
10
|
+
from .sparse_common import _local_rules
|
|
11
|
+
from .sparse_multiline import (
|
|
12
|
+
_build_column_hypothesis,
|
|
13
|
+
_has_overlapping_formula_rows,
|
|
14
|
+
_local_rectangles,
|
|
15
|
+
_row_occupancy,
|
|
16
|
+
_stable_gutters,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def build_rule_band_candidates(
|
|
21
|
+
table_input: NativeTableInput,
|
|
22
|
+
text: NativeTableText,
|
|
23
|
+
diagnostics: list[dict[str, Any]] | None = None,
|
|
24
|
+
) -> list[NativeTableCandidate]:
|
|
25
|
+
"""只在三条完整横线及无歧义列占用共同成立时恢复特殊三线表。"""
|
|
26
|
+
|
|
27
|
+
width, height = table_local_size(table_input.table_bbox, normalize_angle(table_input.angle))
|
|
28
|
+
rules = _local_rules(table_input, width, height)
|
|
29
|
+
tolerance = max(1.0, 0.15 * text.median_glyph_height)
|
|
30
|
+
horizontal = sorted(
|
|
31
|
+
{rule.coordinate for rule in rules if rule.orientation == "horizontal" and rule.end - rule.start >= 0.9 * width}
|
|
32
|
+
)
|
|
33
|
+
if (
|
|
34
|
+
len(horizontal) != 3
|
|
35
|
+
or horizontal[0] > tolerance
|
|
36
|
+
or height - horizontal[-1] > tolerance
|
|
37
|
+
or any(rule.orientation == "vertical" and tolerance < rule.coordinate < width - tolerance for rule in rules)
|
|
38
|
+
):
|
|
39
|
+
return []
|
|
40
|
+
header_bottom = horizontal[1]
|
|
41
|
+
header = [row for row in text.rows if row.bbox[3] <= header_bottom + 0.5]
|
|
42
|
+
body = [row for row in text.rows if row.bbox[1] >= header_bottom - 0.5]
|
|
43
|
+
if not 1 <= len(header) <= 3 or len(body) < 3 or len(header) + len(body) != len(text.rows):
|
|
44
|
+
return []
|
|
45
|
+
if _has_overlapping_formula_rows(text, header_bottom):
|
|
46
|
+
return []
|
|
47
|
+
hypothesis = _build_column_hypothesis(text, width, rules, _local_rectangles(table_input, width, height), None)
|
|
48
|
+
if hypothesis is None:
|
|
49
|
+
return []
|
|
50
|
+
tracks = hypothesis.x_tracks
|
|
51
|
+
cols = len(tracks) - 1
|
|
52
|
+
glyphs = {glyph.glyph_id: glyph for glyph in text.glyphs}
|
|
53
|
+
occupancy = [_row_occupancy(row, glyphs, tracks) for row in body]
|
|
54
|
+
full = set(range(cols))
|
|
55
|
+
common = set.intersection(*occupancy)
|
|
56
|
+
prefix_cols = min(common) if common else 0
|
|
57
|
+
groups: list[tuple[int, int]] = []
|
|
58
|
+
if prefix_cols:
|
|
59
|
+
# 至少两个描述列同步重启,右侧逐行完整,才能区分 rowspan 与普通空格。
|
|
60
|
+
suffix = set(range(prefix_cols, cols))
|
|
61
|
+
starts = [index for index, occupied in enumerate(occupancy) if occupied == full]
|
|
62
|
+
ends = starts[1:] + [len(body)]
|
|
63
|
+
if (
|
|
64
|
+
prefix_cols < 2
|
|
65
|
+
or len(suffix) < 2
|
|
66
|
+
or common != suffix
|
|
67
|
+
or len(starts) < 3
|
|
68
|
+
or starts[0] != 0
|
|
69
|
+
or any(occupied not in (full, suffix) for occupied in occupancy)
|
|
70
|
+
or any(end - start < 2 for start, end in zip(starts, ends))
|
|
71
|
+
):
|
|
72
|
+
return []
|
|
73
|
+
groups = list(zip(starts, ends))
|
|
74
|
+
elif any(occupied != full for occupied in occupancy):
|
|
75
|
+
return []
|
|
76
|
+
if not groups and len(header) == 1:
|
|
77
|
+
# 普通单行表头三线表仍走既有策略,避免无关候选和金标漂移。
|
|
78
|
+
return []
|
|
79
|
+
header_occupancy = [_row_occupancy(row, glyphs, tracks) for row in header]
|
|
80
|
+
if set.union(*header_occupancy) != full:
|
|
81
|
+
return []
|
|
82
|
+
if len(header) > 1 and header_occupancy[-1] != full:
|
|
83
|
+
# 多级表头可能有仅出现在上层的 rowspan 标签,不能误折叠成普通换行表头。
|
|
84
|
+
return []
|
|
85
|
+
margin = max(0.25, 0.05 * text.median_glyph_width)
|
|
86
|
+
if any(
|
|
87
|
+
token.bbox[0] + margin < boundary < token.bbox[2] - margin
|
|
88
|
+
for row in header
|
|
89
|
+
for token in row.tokens
|
|
90
|
+
for boundary in tracks[1:-1]
|
|
91
|
+
):
|
|
92
|
+
return []
|
|
93
|
+
if not _stable_gutters(text, tracks, hypothesis.physical_boundaries, header_bottom, None):
|
|
94
|
+
return []
|
|
95
|
+
boundaries = [header_bottom]
|
|
96
|
+
for previous, current in zip(body, body[1:]):
|
|
97
|
+
if previous.bbox[3] > current.bbox[1] + 0.5:
|
|
98
|
+
return []
|
|
99
|
+
boundaries.append((previous.bbox[3] + current.bbox[1]) / 2.0)
|
|
100
|
+
boundaries.append(height)
|
|
101
|
+
specs = [GridCellSpec(0, col, 1, 1, (tracks[col], 0.0, tracks[col + 1], header_bottom)) for col in range(cols)]
|
|
102
|
+
spans = {start: end for start, end in groups}
|
|
103
|
+
for index in range(len(body)):
|
|
104
|
+
for col in range(cols):
|
|
105
|
+
if col < prefix_cols and index not in spans:
|
|
106
|
+
continue
|
|
107
|
+
end = spans[index] if col < prefix_cols else index + 1
|
|
108
|
+
specs.append(
|
|
109
|
+
GridCellSpec(index + 1, col, end - index, 1, (tracks[col], boundaries[index], tracks[col + 1], boundaries[end]))
|
|
110
|
+
)
|
|
111
|
+
record: dict[str, Any] = {}
|
|
112
|
+
candidate = build_candidate(
|
|
113
|
+
source="sparse_multiline",
|
|
114
|
+
rows=len(body) + 1,
|
|
115
|
+
cols=cols,
|
|
116
|
+
specs=tuple(specs),
|
|
117
|
+
text=text,
|
|
118
|
+
structure_support=1.0,
|
|
119
|
+
row_stability=1.0,
|
|
120
|
+
column_stability=1.0,
|
|
121
|
+
issues=("evidence=physical_header_band", f"wrapped_header_rows={len(header)}", f"descriptor_columns={prefix_cols}"),
|
|
122
|
+
use_grid_index=True,
|
|
123
|
+
diagnostics=record,
|
|
124
|
+
)
|
|
125
|
+
if diagnostics is not None:
|
|
126
|
+
diagnostics.append({"source": "sparse_multiline", "evidence": "physical_header_band", **record})
|
|
127
|
+
if (
|
|
128
|
+
candidate is None
|
|
129
|
+
or candidate.text_capture < 1.0
|
|
130
|
+
or candidate.order_consistency < 1.0
|
|
131
|
+
or candidate.score < 0.98
|
|
132
|
+
or record.get("ambiguous_glyph_ratio", 1.0) > 0.0
|
|
133
|
+
):
|
|
134
|
+
return []
|
|
135
|
+
return [candidate]
|
{docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py
RENAMED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import statistics
|
|
6
|
+
import re
|
|
6
7
|
import unicodedata
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
|
|
@@ -212,6 +213,9 @@ def _looks_like_compact_unit_or_identifier(
|
|
|
212
213
|
combined = previous_line.strip() + next_line.strip()
|
|
213
214
|
if not combined or any(char.isspace() for char in combined):
|
|
214
215
|
return False
|
|
216
|
+
# 带单位后缀的长英文标题仍有词界,不能仅因末尾 /% 就把相邻单词粘连。
|
|
217
|
+
if re.fullmatch(r"[A-Za-z]{4,}", previous_line.strip()) and re.match(r"[A-Za-z]{4,}(?:/|%)", next_line.strip()):
|
|
218
|
+
return False
|
|
215
219
|
return any(char.isdigit() or char in "/_^%°µμ" for char in combined)
|
|
216
220
|
|
|
217
221
|
|
|
@@ -336,11 +336,22 @@ def _classify_page_footnotes(
|
|
|
336
336
|
# 图形坐标轴和外框不能充当页面脚注分隔线。
|
|
337
337
|
continue
|
|
338
338
|
rule_source_indices: set[int] = set()
|
|
339
|
-
|
|
339
|
+
rule_lanes = list(lanes)
|
|
340
|
+
rule_width = axis_line.bbox[2] - axis_line.bbox[0]
|
|
341
|
+
# 通栏长线自身提供局部栏界;上方双栏布局不能拆散线下的整页脚注。
|
|
342
|
+
if rule_width >= 0.7 * local_page_width:
|
|
343
|
+
corridor = [
|
|
344
|
+
(line, bbox)
|
|
345
|
+
for line, bbox in line_geometry
|
|
346
|
+
if bbox[0] >= axis_line.bbox[0] - 0.25 * median_height and bbox[2] <= axis_line.bbox[2] + 0.25 * median_height
|
|
347
|
+
]
|
|
348
|
+
rule_lanes.append(_TextLane(axis_line.bbox[0], axis_line.bbox[2], corridor))
|
|
349
|
+
for lane in rule_lanes:
|
|
340
350
|
following_rule_tops = [
|
|
341
351
|
other.bbox[1]
|
|
342
352
|
for other in local_axis_lines
|
|
343
353
|
if other.orientation == "horizontal"
|
|
354
|
+
and other.bbox[2] - other.bbox[0] >= max(4.0 * median_height, 0.04 * local_page_width)
|
|
344
355
|
and other.bbox[1] - axis_line.bbox[3] > 0.5 * median_height
|
|
345
356
|
and _bbox_axis_overlap_ratio(
|
|
346
357
|
axis_line.bbox,
|
|
@@ -1652,6 +1663,9 @@ def _chinese_page_number_to_int(value: str) -> int | None:
|
|
|
1652
1663
|
def _marginal_text_matches(first_text: str, second_text: str) -> bool:
|
|
1653
1664
|
"""在屏蔽变化数字后比较边缘稳定文本,短文本只接受完全一致。"""
|
|
1654
1665
|
|
|
1666
|
+
# 公式编号在数字屏蔽后都会成为同一标记,不能作为重复页脚的文本证据。
|
|
1667
|
+
if any(re.fullmatch(r"[((﹙]\s*[A-Za-z]?\d+(?:[.\-]\d+)*\s*[))﹚]", text.strip()) for text in (first_text, second_text)):
|
|
1668
|
+
return False
|
|
1655
1669
|
first = _normalize_marginal_text(first_text)
|
|
1656
1670
|
second = _normalize_marginal_text(second_text)
|
|
1657
1671
|
if not first or not second:
|
|
@@ -9,6 +9,7 @@ from dataclasses import dataclass, replace
|
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
11
|
from ....document.pdf._document import PDFPathInfo
|
|
12
|
+
from ....document.pdf.text._contracts import Char
|
|
12
13
|
from ....foundation._text import build_tagged_formula_content
|
|
13
14
|
from ....schema import BBox
|
|
14
15
|
from .geometry import (
|
|
@@ -715,6 +716,13 @@ def _build_formula_like_blocks(
|
|
|
715
716
|
blocks.append(block)
|
|
716
717
|
claimed_source_indices.update(line.source_index for line, _bbox in members)
|
|
717
718
|
|
|
719
|
+
recovered, recovered_indices = _build_mixed_body_display_formulas(
|
|
720
|
+
[line for line in lines if line.source_index not in claimed_source_indices],
|
|
721
|
+
table_bboxes,
|
|
722
|
+
page_size,
|
|
723
|
+
)
|
|
724
|
+
blocks.extend(recovered)
|
|
725
|
+
claimed_source_indices.update(recovered_indices)
|
|
718
726
|
remaining_lines = [
|
|
719
727
|
line
|
|
720
728
|
for line in lines
|
|
@@ -724,6 +732,121 @@ def _build_formula_like_blocks(
|
|
|
724
732
|
return blocks, remaining_lines + paragraph_lines
|
|
725
733
|
|
|
726
734
|
|
|
735
|
+
def _build_mixed_body_display_formulas(
|
|
736
|
+
lines: list[_LineItem],
|
|
737
|
+
table_bboxes: list[BBox],
|
|
738
|
+
page_size: tuple[float, float],
|
|
739
|
+
) -> tuple[list[dict[str, Any]], set[int]]:
|
|
740
|
+
"""在混合字体正文的独立留白带内恢复无编号公式,避免把碎片窄栏当作正文栏。"""
|
|
741
|
+
|
|
742
|
+
blocks: list[dict[str, Any]] = []
|
|
743
|
+
claimed: set[int] = set()
|
|
744
|
+
for angle in sorted({line.angle for line in lines}):
|
|
745
|
+
geometry = [
|
|
746
|
+
(line, _rotate_bbox_to_upright(line.bbox, page_size, angle))
|
|
747
|
+
for line in lines
|
|
748
|
+
if line.angle == angle and line.semantic_type is None and not line.paragraph_formula_context
|
|
749
|
+
]
|
|
750
|
+
width = page_size[1] if angle in {90, 270} else page_size[0]
|
|
751
|
+
body = [
|
|
752
|
+
(line, bbox) for line, bbox in geometry if bbox[2] - bbox[0] >= 0.5 * width and _formula_prefix_has_prose(line.text)
|
|
753
|
+
]
|
|
754
|
+
# 该补充路径只处理既有 dominant-font 路径缺少稳定正文覆盖的混排页面。
|
|
755
|
+
if sum(line.font_coverage < 0.75 for line, _bbox in body) < 2:
|
|
756
|
+
continue
|
|
757
|
+
height = statistics.median(_line_effective_height(line, bbox) for line, bbox in body)
|
|
758
|
+
body_left = statistics.median(bbox[0] for _line, bbox in body)
|
|
759
|
+
body_right = statistics.median(bbox[2] for _line, bbox in body)
|
|
760
|
+
body_width = body_right - body_left
|
|
761
|
+
barriers = sorted(
|
|
762
|
+
[
|
|
763
|
+
(line, bbox)
|
|
764
|
+
for line, bbox in geometry
|
|
765
|
+
if _formula_prefix_has_prose(line.text)
|
|
766
|
+
and (bbox[2] - bbox[0] >= 0.5 * body_width or len(re.findall(r"[\u3400-\u9fff]", line.text)) >= 2)
|
|
767
|
+
],
|
|
768
|
+
key=lambda item: item[1][1],
|
|
769
|
+
)
|
|
770
|
+
for previous, following in zip(barriers, barriers[1:]):
|
|
771
|
+
top, bottom = previous[1][3], following[1][1]
|
|
772
|
+
if not 0.6 * height <= bottom - top <= 8.0 * height:
|
|
773
|
+
continue
|
|
774
|
+
members = [
|
|
775
|
+
(line, bbox)
|
|
776
|
+
for line, bbox in geometry
|
|
777
|
+
if line.source_index not in {previous[0].source_index, following[0].source_index}
|
|
778
|
+
and line.source_index not in claimed
|
|
779
|
+
and bbox[1] >= top - 0.2 * height
|
|
780
|
+
and bbox[3] <= bottom + 0.2 * height
|
|
781
|
+
and bbox[0] >= body_left
|
|
782
|
+
and bbox[2] <= body_right
|
|
783
|
+
]
|
|
784
|
+
if not members:
|
|
785
|
+
continue
|
|
786
|
+
bbox = _bbox_union_many([box for _line, box in members])
|
|
787
|
+
text = " ".join(line.text for line, _box in members)
|
|
788
|
+
if (
|
|
789
|
+
not any(char in "=∑∫√≤≥<>" for char in text)
|
|
790
|
+
or len(re.findall(r"[\u3400-\u9fff]", text)) >= 2
|
|
791
|
+
or len(re.findall(r"\b[A-Za-z]{4,}\b", text)) >= 2
|
|
792
|
+
or not 0.15 * body_width <= bbox[2] - bbox[0] <= 0.8 * body_width
|
|
793
|
+
or abs(_bbox_center_x(bbox) - 0.5 * (body_left + body_right)) > 0.1 * body_width
|
|
794
|
+
or any(
|
|
795
|
+
_bbox_overlap_in_smaller(line.bbox, table_bbox) > 0 for line, _box in members for table_bbox in table_bboxes
|
|
796
|
+
)
|
|
797
|
+
):
|
|
798
|
+
continue
|
|
799
|
+
block = _formula_members_to_block(members, page_size, angle, anchor_source_index=members[0][0].source_index)
|
|
800
|
+
if block is not None:
|
|
801
|
+
blocks.append(block)
|
|
802
|
+
claimed.update(line.source_index for line, _bbox in members)
|
|
803
|
+
return blocks, claimed
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
def _unmapped_formula_ink_bboxes(chars: list[Char]) -> list[BBox]:
|
|
807
|
+
"""保留实际绘制、但映射为空白或控制码的高字形几何,不改变公开文本。"""
|
|
808
|
+
|
|
809
|
+
output: list[BBox] = []
|
|
810
|
+
for char in chars:
|
|
811
|
+
value = str(char.get("char", ""))
|
|
812
|
+
if value.isprintable() and not value.isspace():
|
|
813
|
+
continue
|
|
814
|
+
bbox = _coerce_bbox(char.get("tight_bbox"))
|
|
815
|
+
font = char.get("font") or {}
|
|
816
|
+
size = float(font.get("size", 0) or 0)
|
|
817
|
+
if (
|
|
818
|
+
bbox is not None
|
|
819
|
+
and size > 0
|
|
820
|
+
and char.get("text_object_id") is not None
|
|
821
|
+
and char.get("text_render_mode") not in {3, 7}
|
|
822
|
+
and bbox[2] - bbox[0] > 0.05 * size
|
|
823
|
+
and bbox[3] - bbox[1] > 1.5 * size
|
|
824
|
+
):
|
|
825
|
+
output.append(bbox)
|
|
826
|
+
return output
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
def _attach_unmapped_formula_ink(blocks: list[dict[str, Any]], bboxes: list[BBox]) -> None:
|
|
830
|
+
"""将紧贴公式且纵向相容的未映射字形唯一认领到公式框。"""
|
|
831
|
+
|
|
832
|
+
for bbox in bboxes:
|
|
833
|
+
matches = [
|
|
834
|
+
block
|
|
835
|
+
for block in blocks
|
|
836
|
+
if block.get("type") == "equation"
|
|
837
|
+
and int(block.get("angle", 0)) in {0, 180}
|
|
838
|
+
and _bbox_axis_overlap_ratio(bbox, block["bbox"], axis="y") >= 0.8
|
|
839
|
+
and _bbox_distance(bbox, block["bbox"]) <= 0.25 * (bbox[3] - bbox[1])
|
|
840
|
+
and bbox[1] >= block["bbox"][1] - 2.0
|
|
841
|
+
and bbox[3] <= block["bbox"][3] + 2.0
|
|
842
|
+
]
|
|
843
|
+
if len(matches) == 1:
|
|
844
|
+
block = matches[0]
|
|
845
|
+
block["bbox"] = _bbox_union(block["bbox"], bbox)
|
|
846
|
+
if block.get("_tight_output_bbox") is not None:
|
|
847
|
+
block["_tight_output_bbox"] = _bbox_union(block["_tight_output_bbox"], bbox)
|
|
848
|
+
|
|
849
|
+
|
|
727
850
|
def _formula_line_has_math_operator(text: str) -> bool:
|
|
728
851
|
"""检查文本行是否具有独立公式常见的数学运算符。"""
|
|
729
852
|
|
|
@@ -60,6 +60,21 @@ def _form_supersedes_nested_bbox(form_bbox: BBox, nested_bbox: BBox) -> bool:
|
|
|
60
60
|
return form_area > 0 and nested_area < 0.5 * form_area and _bbox_overlap_in_first(nested_bbox, form_bbox) >= 0.9
|
|
61
61
|
|
|
62
62
|
|
|
63
|
+
def _form_member_bbox(line: _LineItem, form_bbox: BBox) -> BBox | None:
|
|
64
|
+
"""优先保持既有行框,仅在 Form 边缘用完整的可见字形证据补回成员。"""
|
|
65
|
+
|
|
66
|
+
if _bbox_overlap_in_first(line.bbox, form_bbox) >= 0.9:
|
|
67
|
+
return line.bbox
|
|
68
|
+
ink_bbox = line.ink_bbox
|
|
69
|
+
if ink_bbox is None:
|
|
70
|
+
visible_chars = [char for char in line.chars if str(char.get("char", "")).strip()]
|
|
71
|
+
tight = [_coerce_bbox(char.get("tight_bbox")) for char in visible_chars]
|
|
72
|
+
if not tight or any(bbox is None for bbox in tight):
|
|
73
|
+
return None
|
|
74
|
+
ink_bbox = _bbox_union_many([bbox for bbox in tight if bbox is not None])
|
|
75
|
+
return ink_bbox if _bbox_overlap_in_first(ink_bbox, form_bbox) >= 0.99 else None
|
|
76
|
+
|
|
77
|
+
|
|
63
78
|
def _tighten_form_image_bbox(
|
|
64
79
|
source: _PageSource,
|
|
65
80
|
form_bbox: BBox,
|
|
@@ -79,7 +94,7 @@ def _tighten_form_image_bbox(
|
|
|
79
94
|
# 至少两个嵌套 Path 和四个矢量元素,避免只凭普通边框或少量文本裁剪 Form。
|
|
80
95
|
if len(internal_paths) < 2 or len(internal_paths) + len(internal_drawing_lines) < 4:
|
|
81
96
|
return form_bbox
|
|
82
|
-
internal_text = [
|
|
97
|
+
internal_text = [bbox for line in source.lines if (bbox := _form_member_bbox(line, form_bbox)) is not None]
|
|
83
98
|
evidence_bbox = _clip_bbox(
|
|
84
99
|
_bbox_union_many(internal_paths + internal_drawing_lines + internal_text),
|
|
85
100
|
source.page_size,
|
|
@@ -125,7 +140,7 @@ def _select_form_image_bboxes(source: _PageSource) -> list[BBox]:
|
|
|
125
140
|
member_rows = {
|
|
126
141
|
line.visual_row_id if line.visual_row_id is not None else line.source_index
|
|
127
142
|
for line in source.lines
|
|
128
|
-
if
|
|
143
|
+
if _form_member_bbox(line, bbox) is not None
|
|
129
144
|
}
|
|
130
145
|
internal_drawing_count = sum(
|
|
131
146
|
_bbox_overlap_in_first(drawing_line.bbox, bbox) >= 0.9 for drawing_line in source.drawing_lines
|
|
@@ -151,9 +166,7 @@ def _build_form_image_blocks(
|
|
|
151
166
|
if line.source_index in claimed_line_indices:
|
|
152
167
|
continue
|
|
153
168
|
matching_indices = [
|
|
154
|
-
candidate_index
|
|
155
|
-
for candidate_index, bbox in enumerate(form_bboxes)
|
|
156
|
-
if _bbox_overlap_in_first(line.bbox, bbox) >= 0.9
|
|
169
|
+
candidate_index for candidate_index, bbox in enumerate(form_bboxes) if _form_member_bbox(line, bbox) is not None
|
|
157
170
|
]
|
|
158
171
|
if not matching_indices:
|
|
159
172
|
continue
|
|
@@ -225,6 +225,13 @@ def _drawing_match_for_line(
|
|
|
225
225
|
hit_chars = [char for char in line.visible_chars if drawing_bbox[0] <= (char.bbox[0] + char.bbox[2]) / 2 <= drawing_bbox[2]]
|
|
226
226
|
if not hit_chars:
|
|
227
227
|
return None
|
|
228
|
+
if style == "strikethrough":
|
|
229
|
+
# 分式横线可能穿过字体外框却完全位于字形上方,不应据此生成删除线。
|
|
230
|
+
ink_boxes = [_coerce_bbox(line.chars[char.source_index].get("tight_bbox")) for char in hit_chars]
|
|
231
|
+
if all(bbox is not None for bbox in ink_boxes) and not any(
|
|
232
|
+
bbox[1] <= drawing_center_y <= bbox[3] for bbox in ink_boxes if bbox is not None
|
|
233
|
+
):
|
|
234
|
+
return None
|
|
228
235
|
hit_left = min(char.bbox[0] for char in hit_chars)
|
|
229
236
|
hit_right = max(char.bbox[2] for char in hit_chars)
|
|
230
237
|
if (hit_right - hit_left) / drawing_length < TEXT_DECORATION_MIN_TEXT_COVERAGE_RATIO:
|
|
@@ -7,7 +7,7 @@ import unicodedata
|
|
|
7
7
|
from typing import Any, Literal, Sequence
|
|
8
8
|
|
|
9
9
|
from .....schema import BBox
|
|
10
|
-
from .._script_geometry import ScriptRole, classify_char_script_roles
|
|
10
|
+
from .._script_geometry import ScriptRole, classify_char_script_roles, paired_script_roles
|
|
11
11
|
from ..geometry import _rotate_bbox_to_upright
|
|
12
12
|
from .common import _coerce_bbox, _normalize_match_fragment, _ordered_line_chars
|
|
13
13
|
from .types import (
|
|
@@ -678,7 +678,7 @@ def _strong_structural_script_roles(
|
|
|
678
678
|
tight_bboxes=tight_bboxes,
|
|
679
679
|
origins=origins,
|
|
680
680
|
)
|
|
681
|
-
strong_roles: dict[int, ScriptRole] =
|
|
681
|
+
strong_roles: dict[int, ScriptRole] = paired_script_roles(chars, roles, tight_bboxes, origins)
|
|
682
682
|
for index in _citation_script_indices(chars, roles):
|
|
683
683
|
if roles[index] != "body":
|
|
684
684
|
strong_roles[index] = roles[index]
|
|
@@ -18,6 +18,7 @@ from .geometry import (
|
|
|
18
18
|
from .line_layout import _connection_crosses_table, _font_signatures_share_family, _infer_text_lanes, _line_effective_height
|
|
19
19
|
from .models import _LineItem, _TextLane
|
|
20
20
|
from .native_text import _fill_native_typography, _median_native_glyph_width
|
|
21
|
+
from ._script_geometry import classify_char_script_roles, paired_script_roles
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
def _merge_same_baseline_text_lines(
|
|
@@ -273,13 +274,35 @@ def _classify_overlapping_inline_cluster(
|
|
|
273
274
|
and line.font_coverage >= 0.75
|
|
274
275
|
for line, bbox in members
|
|
275
276
|
)
|
|
276
|
-
if has_body_host:
|
|
277
|
+
if has_body_host or _has_paired_script_body_host(members, median_height):
|
|
277
278
|
return "inline"
|
|
278
279
|
if len(members) >= 3 and len(visual_row_ids) >= 3 and union_bbox[2] - union_bbox[0] <= 0.6 * lane_width:
|
|
279
280
|
return "formula"
|
|
280
281
|
return None
|
|
281
282
|
|
|
282
283
|
|
|
284
|
+
def _has_paired_script_body_host(members: list[tuple[_LineItem, BBox]], median_height: float) -> bool:
|
|
285
|
+
"""用正文宿主和跨 run 的成对上下标补证据,不放宽普通同行重叠阈值。"""
|
|
286
|
+
|
|
287
|
+
if len(members) != 2 or any(line.angle != 0 or line.preserve_split_boundary or line.semantic_type for line, _ in members):
|
|
288
|
+
return False
|
|
289
|
+
host, bbox = max(members, key=lambda item: item[1][2] - item[1][0])
|
|
290
|
+
has_prose = len(re.findall(r"[\u3400-\u9fff]", host.text)) >= 2 or len(re.findall(r"\b[A-Za-z]{2,}\b", host.text)) >= 2
|
|
291
|
+
if not has_prose or bbox[2] - bbox[0] < 4.0 * median_height:
|
|
292
|
+
return False
|
|
293
|
+
owned_chars = [(char, line.source_index) for line, _ in members for char in line.chars]
|
|
294
|
+
if not owned_chars or any(not isinstance(char.get("char_idx"), int) for char, _ in owned_chars):
|
|
295
|
+
return False
|
|
296
|
+
owned_chars.sort(key=lambda item: item[0]["char_idx"])
|
|
297
|
+
chars = [char for char, _ in owned_chars]
|
|
298
|
+
tight = {char["char_idx"]: char["tight_bbox"] for char in chars if char.get("tight_bbox") is not None}
|
|
299
|
+
origins = {char["char_idx"]: char["origin"] for char in chars if char.get("origin") is not None}
|
|
300
|
+
roles = classify_char_script_roles(chars, tight_bboxes=tight, origins=origins)
|
|
301
|
+
paired = paired_script_roles(chars, roles, tight, origins)
|
|
302
|
+
# 上下标必须分属两个待合并 run,避免把一侧已有角标当作吞并邻块的依据。
|
|
303
|
+
return len(paired) == 2 and len({owned_chars[index][1] for index in paired}) == 2
|
|
304
|
+
|
|
305
|
+
|
|
283
306
|
def _select_overlapping_inline_cluster_host(
|
|
284
307
|
members: list[tuple[_LineItem, BBox]],
|
|
285
308
|
median_height: float,
|
|
@@ -335,8 +358,10 @@ def _merge_overlapping_inline_cluster(
|
|
|
335
358
|
if compact_formula_cluster
|
|
336
359
|
else [line.bbox for line in ordered_members if line is not host]
|
|
337
360
|
)
|
|
361
|
+
# 成对角标跨 run 只是 PDF 物理拆行,不应在上、下标之间补正文空格。
|
|
362
|
+
separator = "" if _has_paired_script_body_host(members, median_height) else " "
|
|
338
363
|
merged = _LineItem(
|
|
339
|
-
text=
|
|
364
|
+
text=separator.join(text for line in ordered_members if (text := line.text.strip())),
|
|
340
365
|
bbox=_bbox_union_many([line.bbox for line in ordered_members]),
|
|
341
366
|
angle=host.angle,
|
|
342
367
|
source_index=min(line.source_index for line in ordered_members),
|
|
@@ -189,6 +189,7 @@ class _PreparedPage:
|
|
|
189
189
|
page_footnote_groups: list[set[int]] = field(default_factory=list)
|
|
190
190
|
script_lines: list[PDFTextScriptLine] = field(default_factory=list)
|
|
191
191
|
formula_candidate_lines: list[_LineItem] = field(default_factory=list)
|
|
192
|
+
formula_ink_bboxes: list[BBox] = field(default_factory=list)
|
|
192
193
|
|
|
193
194
|
|
|
194
195
|
@dataclass(slots=True)
|
|
@@ -30,7 +30,12 @@ from .auxiliary_text import (
|
|
|
30
30
|
)
|
|
31
31
|
from .char_geometry import DocumentGeometryPlan, apply_line_geometry_repairs, build_document_geometry_plan
|
|
32
32
|
from .code_blocks import _build_code_blocks, _build_rule_delimited_code_blocks
|
|
33
|
-
from .formulas import
|
|
33
|
+
from .formulas import (
|
|
34
|
+
_attach_unmapped_formula_ink,
|
|
35
|
+
_build_formula_like_blocks,
|
|
36
|
+
_build_vector_formula_blocks,
|
|
37
|
+
_unmapped_formula_ink_bboxes,
|
|
38
|
+
)
|
|
34
39
|
from .geometry import (
|
|
35
40
|
_bbox_area,
|
|
36
41
|
_bbox_axis_overlap_ratio,
|
|
@@ -706,6 +711,7 @@ def _prepare_page_source(
|
|
|
706
711
|
canonical_formula_source_lines=canonical_formula_source_lines,
|
|
707
712
|
script_lines=script_lines,
|
|
708
713
|
formula_candidate_lines=formula_candidate_lines,
|
|
714
|
+
formula_ink_bboxes=_unmapped_formula_ink_bboxes(source.chars),
|
|
709
715
|
)
|
|
710
716
|
_classify_page_auxiliary_text(prepared)
|
|
711
717
|
return prepared
|
|
@@ -880,6 +886,7 @@ def _finalize_prepared_page(
|
|
|
880
886
|
) == _formula_block_inventory(formula_blocks):
|
|
881
887
|
formula_blocks = canonical_formula_blocks
|
|
882
888
|
prepared.canonical_formula_source_lines.clear()
|
|
889
|
+
_attach_unmapped_formula_ink(formula_blocks, prepared.formula_ink_bboxes)
|
|
883
890
|
if prepared.canonical_formula_geometry:
|
|
884
891
|
for line in remaining_lines:
|
|
885
892
|
line.style_scale_repaired = original_style_scale_state.get(
|