docvortex 0.4.4__tar.gz → 0.4.5__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.4/src/docvortex.egg-info → docvortex-0.4.5}/PKG-INFO +3 -3
- {docvortex-0.4.4 → docvortex-0.4.5}/README.md +1 -1
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/JSON_PROTOCOL.md +3 -2
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/USAGE.md +19 -4
- {docvortex-0.4.4 → docvortex-0.4.5}/pyproject.toml +1 -1
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_script_geometry.py +37 -24
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +8 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +21 -14
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +121 -38
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_geometry.py +8 -2
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_text_styles.py +5 -1
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -1
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/formula.py +128 -30
- docvortex-0.4.5/src/docvortex/render/_internal/pdf/formula_layout.py +98 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/inline.py +18 -1
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/original.py +105 -5
- docvortex-0.4.5/src/docvortex/render/_internal/pdf/paragraph.py +123 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/renderer.py +41 -7
- docvortex-0.4.5/src/docvortex/render/_internal/pdf/table.py +485 -0
- docvortex-0.4.5/src/docvortex/render/_internal/pdf/table_content.py +251 -0
- docvortex-0.4.5/src/docvortex/render/_internal/pdf/table_layout.py +319 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/version.py +1 -1
- {docvortex-0.4.4 → docvortex-0.4.5/src/docvortex.egg-info}/PKG-INFO +3 -3
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex.egg-info/SOURCES.txt +13 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex.egg-info/requires.txt +1 -1
- docvortex-0.4.5/tests/benchmarks/native_pdf_table.py +155 -0
- docvortex-0.4.5/tests/benchmarks/pdf_render.py +280 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_benchmark_entrypoint.py +28 -0
- docvortex-0.4.5/tests/unittest/test_native_table_performance_equivalence.py +211 -0
- docvortex-0.4.5/tests/unittest/test_pdf_cjk_style.py +178 -0
- docvortex-0.4.5/tests/unittest/test_pdf_formula_layout.py +272 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_original_layout.py +7 -6
- docvortex-0.4.5/tests/unittest/test_pdf_paragraph_cache.py +107 -0
- docvortex-0.4.5/tests/unittest/test_pdf_structured_tables.py +367 -0
- docvortex-0.4.5/tests/unittest/test_pdf_table_cache.py +77 -0
- docvortex-0.4.5/tests/unittest/test_pdf_table_round2.py +305 -0
- docvortex-0.4.4/src/docvortex/render/_internal/pdf/table.py +0 -293
- {docvortex-0.4.4 → docvortex-0.4.5}/LICENSE.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/MANIFEST.in +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/README.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/demo.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/METADATA.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/setup.cfg +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/options.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/result.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_architecture.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/build_html_css.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.5}/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.5
|
|
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
|
|
@@ -36,7 +36,7 @@ Requires-Dist: pylatexenc<3,>=2.10
|
|
|
36
36
|
Requires-Dist: latex2mathml<4,>=3.81.0
|
|
37
37
|
Requires-Dist: mathml2omml==0.0.2
|
|
38
38
|
Requires-Dist: resvg_py<0.6,>=0.5.0
|
|
39
|
-
Requires-Dist: reportlab
|
|
39
|
+
Requires-Dist: reportlab[accel]
|
|
40
40
|
Requires-Dist: ziamath<0.14,>=0.13
|
|
41
41
|
Requires-Dist: magika<1.1.0,>=0.6.2
|
|
42
42
|
Requires-Dist: opencv-python>=4.11.0.86
|
|
@@ -183,7 +183,7 @@ reads metadata without parsing the document body.
|
|
|
183
183
|
|
|
184
184
|
- **Text PDFs:** native parsing uses the document's existing text and structure. Scanned pages requiring OCR need an external OCR or inference service.
|
|
185
185
|
- **PDF classification:** `docvortex classify report.pdf` returns `txt` or `ocr`. Classification is explicit and does not start inference; parsing does not automatically switch backends.
|
|
186
|
-
- **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and region images
|
|
186
|
+
- **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and HTML-based tables; charts retain region images. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
|
|
187
187
|
|
|
188
188
|
## Documentation
|
|
189
189
|
|
|
@@ -129,7 +129,7 @@ reads metadata without parsing the document body.
|
|
|
129
129
|
|
|
130
130
|
- **Text PDFs:** native parsing uses the document's existing text and structure. Scanned pages requiring OCR need an external OCR or inference service.
|
|
131
131
|
- **PDF classification:** `docvortex classify report.pdf` returns `txt` or `ocr`. Classification is explicit and does not start inference; parsing does not automatically switch backends.
|
|
132
|
-
- **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and region images
|
|
132
|
+
- **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and HTML-based tables; charts retain region images. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
|
|
133
133
|
|
|
134
134
|
## Documentation
|
|
135
135
|
|
|
@@ -113,8 +113,9 @@ when selecting a subset of an existing result.
|
|
|
113
113
|
Pages may also contain `image_rotations`, such as `{"3":270}`: keys are source
|
|
114
114
|
block indices encoded as strings, and values are the 0/90/180/270-degree angles
|
|
115
115
|
used to turn region crops upright. The original-layout renderer reverses this
|
|
116
|
-
crop transform when placing the image.
|
|
117
|
-
|
|
116
|
+
crop transform when placing the image. Structured HTML tables use the same angle
|
|
117
|
+
to restore the source orientation after layout in upright coordinates. No extra
|
|
118
|
+
image data or schema fields are required.
|
|
118
119
|
|
|
119
120
|
This uses the existing JSON extension mechanism; Model/Middle/bundle schema
|
|
120
121
|
versions remain 2.0. Older documents without this extension remain readable.
|
|
@@ -99,8 +99,22 @@ document and the original source file.
|
|
|
99
99
|
PDF output defaults to `PdfLayout.AUTO`. Newly parsed PDF sources preserve their
|
|
100
100
|
page dimensions, page boundaries, headers, footers, and block positions. Text is
|
|
101
101
|
selectable and reflows inside each source block; original fonts and line breaks
|
|
102
|
-
are approximate. Tables
|
|
103
|
-
prefer vector rendering. Content absent
|
|
102
|
+
are approximate. Tables prefer parsed HTML with selectable text and vector borders;
|
|
103
|
+
charts retain region images, and equations prefer vector rendering. Content absent
|
|
104
|
+
from the parsed result cannot be restored.
|
|
105
|
+
|
|
106
|
+
Original-layout tables use content-based column widths and compact cell padding.
|
|
107
|
+
They first fit their source box, then may use safe space in the same column while
|
|
108
|
+
preserving page margins and a 2 pt gap from other blocks. Existing spanning tables
|
|
109
|
+
retain their span. Rotation is restored after layout in upright coordinates;
|
|
110
|
+
tables do not move to another page. Captions and notes remain separate when their
|
|
111
|
+
own coordinates are available, or share the parent box when child coordinates
|
|
112
|
+
are missing. If 6 pt text still cannot fit, the table is scaled further and
|
|
113
|
+
`pdf_layout_small_text` is reported. Small text alone never triggers an image
|
|
114
|
+
fallback. Missing, invalid, or unrenderable HTML falls back to the region image,
|
|
115
|
+
then text or a placeholder, with `pdf_table_fallback` and `pdf_table_source`
|
|
116
|
+
diagnostics. `pdf_table_layout` records the source, rotation, effective font size,
|
|
117
|
+
and original/drawing bounds. Reflow table layout is unchanged.
|
|
104
118
|
|
|
105
119
|
```python
|
|
106
120
|
import docvortex
|
|
@@ -160,8 +174,9 @@ adjacent titles divide their gap at its midpoint. The original top edge is
|
|
|
160
174
|
preferred, shifting upward when needed. Only a title that cannot fit its safe
|
|
161
175
|
area shrinks, in 0.1 pt steps before the existing below-6-pt fallback. Script and
|
|
162
176
|
inline-formula ink extents are included in title measurement. Index references
|
|
163
|
-
and approximate parent groups do not participate; body text, captions
|
|
164
|
-
|
|
177
|
+
and approximate parent groups do not participate; body text, captions and code
|
|
178
|
+
retain their original independent fitting results. Structured tables are placed
|
|
179
|
+
after titles and equations, respecting their final drawing bounds.
|
|
165
180
|
|
|
166
181
|
`pdf_title_layout_expanded` identifies expanded title areas.
|
|
167
182
|
`pdf_layout_font_exception` records local-body increases or insufficient-space
|
|
@@ -27,7 +27,7 @@ dependencies = [
|
|
|
27
27
|
"mammoth>=1.11.0,<2", "openpyxl>=3.1.5,<4", "olefile>=0.47,<1",
|
|
28
28
|
"pylatexenc>=2.10,<3", "latex2mathml>=3.81.0,<4", "mathml2omml==0.0.2",
|
|
29
29
|
"resvg_py>=0.5.0,<0.6",
|
|
30
|
-
"reportlab", "ziamath>=0.13,<0.14",
|
|
30
|
+
"reportlab[accel]", "ziamath>=0.13,<0.14",
|
|
31
31
|
"magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
|
|
32
32
|
]
|
|
33
33
|
|
|
@@ -208,42 +208,46 @@ def _cluster_baselines(
|
|
|
208
208
|
median_loose_height = statistics.median(feature.loose_height for feature in anchors)
|
|
209
209
|
tolerance = max(SCRIPT_BASELINE_ABSOLUTE_TOLERANCE, median_loose_height * SCRIPT_BASELINE_LOOSE_HEIGHT_RATIO)
|
|
210
210
|
groups: list[list[int]] = []
|
|
211
|
+
group_origins: list[list[float]] = []
|
|
211
212
|
for feature in sorted(anchors, key=lambda item: item.origin[1] if item.origin is not None else 0.0):
|
|
212
213
|
baseline = feature.origin[1] if feature.origin is not None else 0.0
|
|
213
214
|
if not groups:
|
|
214
215
|
groups.append([feature.index])
|
|
216
|
+
group_origins.append([baseline])
|
|
215
217
|
continue
|
|
216
|
-
previous_baseline =
|
|
217
|
-
features[index].origin[1] for index in groups[-1] if features[index].origin is not None
|
|
218
|
-
)
|
|
218
|
+
previous_baseline = _sorted_origin_median(group_origins[-1])
|
|
219
219
|
if abs(baseline - previous_baseline) <= tolerance:
|
|
220
220
|
groups[-1].append(feature.index)
|
|
221
|
+
group_origins[-1].append(baseline)
|
|
221
222
|
else:
|
|
222
223
|
groups.append([feature.index])
|
|
224
|
+
group_origins.append([baseline])
|
|
223
225
|
return (
|
|
224
226
|
[
|
|
225
227
|
ScriptBaselineCluster(
|
|
226
|
-
baseline=
|
|
228
|
+
baseline=_sorted_origin_median(origins),
|
|
227
229
|
member_indices=tuple(group),
|
|
228
230
|
)
|
|
229
|
-
for group in groups
|
|
231
|
+
for group, origins in zip(groups, group_origins, strict=True)
|
|
230
232
|
],
|
|
231
233
|
tolerance,
|
|
232
234
|
)
|
|
233
235
|
|
|
234
236
|
|
|
237
|
+
def _sorted_origin_median(origins: list[float]) -> float:
|
|
238
|
+
"""原始字符已按 origin 排序,直接使用与 statistics.median 相同的中位运算。"""
|
|
239
|
+
middle = len(origins) // 2
|
|
240
|
+
return origins[middle] if len(origins) % 2 else (origins[middle - 1] + origins[middle]) / 2
|
|
241
|
+
|
|
242
|
+
|
|
235
243
|
def _cluster_tight_height(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
|
|
236
244
|
"""返回基线簇的高分位 tight 高度。"""
|
|
237
|
-
return _quantile(
|
|
238
|
-
[features[index].tight_height for index in cluster.member_indices if features[index].tight_height > 0], 0.9
|
|
239
|
-
)
|
|
245
|
+
return _quantile([height for index in cluster.member_indices if (height := features[index].tight_height) > 0], 0.9)
|
|
240
246
|
|
|
241
247
|
|
|
242
248
|
def _cluster_loose_height(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
|
|
243
249
|
"""返回基线簇的高分位 loose 高度。"""
|
|
244
|
-
return _quantile(
|
|
245
|
-
[features[index].loose_height for index in cluster.member_indices if features[index].loose_height > 0], 0.9
|
|
246
|
-
)
|
|
250
|
+
return _quantile([height for index in cluster.member_indices if (height := features[index].loose_height) > 0], 0.9)
|
|
247
251
|
|
|
248
252
|
|
|
249
253
|
def _cluster_tight_center(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
|
|
@@ -283,29 +287,33 @@ def _cluster_has_consistent_displacement(
|
|
|
283
287
|
def _choose_body_band(
|
|
284
288
|
features: list[ScriptCharFeature],
|
|
285
289
|
clusters: list[ScriptBaselineCluster],
|
|
290
|
+
heights: dict[ScriptBaselineCluster, tuple[float, float]] | None = None,
|
|
286
291
|
) -> tuple[ScriptBodyBand, ScriptBaselineCluster] | None:
|
|
287
292
|
"""在接近最高字形的基线簇中按字符数选择正文基线。"""
|
|
288
293
|
if not clusters:
|
|
289
294
|
return None
|
|
290
|
-
|
|
295
|
+
if heights is None:
|
|
296
|
+
heights = {
|
|
297
|
+
cluster: (_cluster_tight_height(features, cluster), _cluster_loose_height(features, cluster))
|
|
298
|
+
for cluster in clusters
|
|
299
|
+
}
|
|
300
|
+
maximum_height = max(heights[cluster][0] for cluster in clusters)
|
|
291
301
|
comparable = [
|
|
292
|
-
cluster
|
|
293
|
-
for cluster in clusters
|
|
294
|
-
if _cluster_tight_height(features, cluster) >= maximum_height * SCRIPT_BODY_COMPARABLE_HEIGHT_RATIO
|
|
302
|
+
cluster for cluster in clusters if heights[cluster][0] >= maximum_height * SCRIPT_BODY_COMPARABLE_HEIGHT_RATIO
|
|
295
303
|
]
|
|
296
304
|
body_cluster = max(
|
|
297
305
|
comparable,
|
|
298
306
|
key=lambda cluster: (
|
|
299
307
|
len(cluster.member_indices),
|
|
300
|
-
|
|
301
|
-
|
|
308
|
+
heights[cluster][0],
|
|
309
|
+
heights[cluster][1],
|
|
302
310
|
),
|
|
303
311
|
)
|
|
304
312
|
return (
|
|
305
313
|
ScriptBodyBand(
|
|
306
314
|
baseline=body_cluster.baseline,
|
|
307
|
-
tight_height=
|
|
308
|
-
loose_height=
|
|
315
|
+
tight_height=heights[body_cluster][0],
|
|
316
|
+
loose_height=heights[body_cluster][1],
|
|
309
317
|
member_indices=frozenset(body_cluster.member_indices),
|
|
310
318
|
),
|
|
311
319
|
body_cluster,
|
|
@@ -508,6 +516,7 @@ def _recheck_weak_clusters_with_local_font_body(
|
|
|
508
516
|
component_indices: list[int],
|
|
509
517
|
body_band: ScriptBodyBand,
|
|
510
518
|
cluster_roles: dict[ScriptBaselineCluster, ScriptRole],
|
|
519
|
+
heights: dict[ScriptBaselineCluster, tuple[float, float]],
|
|
511
520
|
) -> None:
|
|
512
521
|
"""用同字体局部正文撤销弱误判;不制造角标,不让撤销结果成为新参考。"""
|
|
513
522
|
initial_roles = dict(cluster_roles)
|
|
@@ -543,7 +552,7 @@ def _recheck_weak_clusters_with_local_font_body(
|
|
|
543
552
|
continue
|
|
544
553
|
shift = cluster.baseline - reference.baseline
|
|
545
554
|
strong_shift = abs(shift) >= height * SCRIPT_STRONG_SHIFT_RATIO
|
|
546
|
-
tight_ratio =
|
|
555
|
+
tight_ratio = heights[cluster][0] / height
|
|
547
556
|
if abs(shift) < max(SCRIPT_ORIGIN_MIN_SHIFT_ABSOLUTE, height * SCRIPT_ORIGIN_MIN_SHIFT_RATIO) or (
|
|
548
557
|
tight_ratio > SCRIPT_TIGHT_HEIGHT_RATIO and not (strong_shift and tight_ratio <= SCRIPT_STRONG_MAX_HEIGHT_RATIO)
|
|
549
558
|
):
|
|
@@ -559,7 +568,11 @@ def _assign_component(
|
|
|
559
568
|
) -> None:
|
|
560
569
|
"""在单个视觉组件内按 origin 基线簇和双 bbox 一致性分配角色。"""
|
|
561
570
|
clusters, tolerance = _cluster_baselines(features, component_indices)
|
|
562
|
-
|
|
571
|
+
# 基线簇在本次组件判定内不变,高度分位数可供正文选择与各角标规则共享。
|
|
572
|
+
heights = {
|
|
573
|
+
cluster: (_cluster_tight_height(features, cluster), _cluster_loose_height(features, cluster)) for cluster in clusters
|
|
574
|
+
}
|
|
575
|
+
body_result = _choose_body_band(features, clusters, heights)
|
|
563
576
|
if body_result is None:
|
|
564
577
|
return
|
|
565
578
|
body_band, body_cluster = body_result
|
|
@@ -570,8 +583,8 @@ def _assign_component(
|
|
|
570
583
|
if cluster is body_cluster:
|
|
571
584
|
continue
|
|
572
585
|
shift = cluster.baseline - body_band.baseline
|
|
573
|
-
tight_ratio =
|
|
574
|
-
loose_ratio =
|
|
586
|
+
tight_ratio = heights[cluster][0] / body_band.tight_height
|
|
587
|
+
loose_ratio = heights[cluster][1] / body_band.loose_height
|
|
575
588
|
minimum_shift = max(SCRIPT_ORIGIN_MIN_SHIFT_ABSOLUTE, body_band.tight_height * SCRIPT_ORIGIN_MIN_SHIFT_RATIO)
|
|
576
589
|
strong_shift = abs(shift) >= body_band.tight_height * SCRIPT_STRONG_SHIFT_RATIO
|
|
577
590
|
if (
|
|
@@ -587,7 +600,7 @@ def _assign_component(
|
|
|
587
600
|
cluster_roles[cluster] = "body"
|
|
588
601
|
else:
|
|
589
602
|
cluster_roles[cluster] = _script_role(shift)
|
|
590
|
-
_recheck_weak_clusters_with_local_font_body(features, font_keys, component_indices, body_band, cluster_roles)
|
|
603
|
+
_recheck_weak_clusters_with_local_font_body(features, font_keys, component_indices, body_band, cluster_roles, heights)
|
|
591
604
|
for index in component_indices:
|
|
592
605
|
feature = features[index]
|
|
593
606
|
if (
|
{docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py
RENAMED
|
@@ -143,6 +143,14 @@ def _choose_cell_for_glyph_indexed(
|
|
|
143
143
|
0,
|
|
144
144
|
min(rows - 1, bisect_left(index.y_tracks, glyph.bbox[3]) - 1),
|
|
145
145
|
)
|
|
146
|
+
if left_col == right_col and top_row == bottom_row:
|
|
147
|
+
# 只覆盖一个原子格时仍执行原面积/中心判定,省去候选集合与排序。
|
|
148
|
+
cell_index = index.owners[top_row][left_col]
|
|
149
|
+
bbox = specs[cell_index].bbox
|
|
150
|
+
if glyph_overlap_ratio(glyph, bbox) > 0:
|
|
151
|
+
return cell_index, False
|
|
152
|
+
center_x, center_y = bbox_center(glyph.bbox)
|
|
153
|
+
return (cell_index, False) if bbox[0] <= center_x <= bbox[2] and bbox[1] <= center_y <= bbox[3] else (None, False)
|
|
146
154
|
candidate_indices = {
|
|
147
155
|
index.owners[row][col] for row in range(top_row, bottom_row + 1) for col in range(left_col, right_col + 1)
|
|
148
156
|
}
|
{docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py
RENAMED
|
@@ -32,7 +32,7 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
32
32
|
table_bbox = normalize_bbox(table_input.table_bbox)
|
|
33
33
|
if table_bbox is None:
|
|
34
34
|
return []
|
|
35
|
-
selected: list[tuple[int, int, Char]] = []
|
|
35
|
+
selected: list[tuple[int, int, Char, BBox]] = []
|
|
36
36
|
for fallback_index, char in enumerate(table_input.chars):
|
|
37
37
|
char_bbox = normalize_bbox(char.get("bbox"))
|
|
38
38
|
if char_bbox is None:
|
|
@@ -44,14 +44,14 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
44
44
|
source_index = int(char.get("char_idx", fallback_index))
|
|
45
45
|
except (TypeError, ValueError):
|
|
46
46
|
source_index = fallback_index
|
|
47
|
-
selected.append((source_index, fallback_index, char))
|
|
47
|
+
selected.append((source_index, fallback_index, char, char_bbox))
|
|
48
48
|
|
|
49
49
|
selected.sort(key=lambda item: (item[0], item[1]))
|
|
50
50
|
output: list[_PendingGlyph] = []
|
|
51
51
|
angle = normalize_angle(table_input.angle)
|
|
52
52
|
pending_space = False
|
|
53
53
|
pending_break = False
|
|
54
|
-
for
|
|
54
|
+
for source_index, _fallback_index, char, absolute_bbox in selected:
|
|
55
55
|
raw_text = str(char.get("char") or "")
|
|
56
56
|
if not raw_text:
|
|
57
57
|
continue
|
|
@@ -66,9 +66,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
66
66
|
text = _normalize_table_text(raw_text)
|
|
67
67
|
if not text or text.isspace():
|
|
68
68
|
continue
|
|
69
|
-
absolute_bbox = normalize_bbox(char.get("bbox"))
|
|
70
|
-
if absolute_bbox is None:
|
|
71
|
-
continue
|
|
72
69
|
local_bbox = page_bbox_to_table_local(
|
|
73
70
|
absolute_bbox,
|
|
74
71
|
table_bbox,
|
|
@@ -76,10 +73,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
76
73
|
)
|
|
77
74
|
if local_bbox is None or local_bbox[3] - local_bbox[1] < 0.5:
|
|
78
75
|
continue
|
|
79
|
-
try:
|
|
80
|
-
source_index = int(char.get("char_idx", fallback_index))
|
|
81
|
-
except (TypeError, ValueError):
|
|
82
|
-
source_index = fallback_index
|
|
83
76
|
output.append(
|
|
84
77
|
_PendingGlyph(
|
|
85
78
|
glyph_id=len(output),
|
|
@@ -153,7 +146,14 @@ def _assign_visual_rows(
|
|
|
153
146
|
)
|
|
154
147
|
else:
|
|
155
148
|
rows[best_index].append(glyph)
|
|
156
|
-
|
|
149
|
+
# 两框合并保持原 min/max 顺序,避免为每个字符建立通用迭代器。
|
|
150
|
+
previous_bbox = row_bboxes[best_index]
|
|
151
|
+
row_bboxes[best_index] = (
|
|
152
|
+
min(previous_bbox[0], glyph.bbox[0]),
|
|
153
|
+
min(previous_bbox[1], glyph.bbox[1]),
|
|
154
|
+
max(previous_bbox[2], glyph.bbox[2]),
|
|
155
|
+
max(previous_bbox[3], glyph.bbox[3]),
|
|
156
|
+
)
|
|
157
157
|
for row_index in range(best_index, len(row_bboxes)):
|
|
158
158
|
prefix_max_bottoms[row_index] = max(
|
|
159
159
|
prefix_max_bottoms[row_index - 1] if row_index > 0 else row_bboxes[row_index][3],
|
|
@@ -170,7 +170,11 @@ def _assign_visual_rows(
|
|
|
170
170
|
def _contains_cjk(text: str) -> bool:
|
|
171
171
|
"""判断文本是否包含常见中日韩统一表意字符。"""
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
# 组行热路径通常只传入相邻两个字符,直接遍历避免逐次创建生成器。
|
|
174
|
+
for char in text:
|
|
175
|
+
if "\u3400" <= char <= "\u9fff":
|
|
176
|
+
return True
|
|
177
|
+
return False
|
|
174
178
|
|
|
175
179
|
|
|
176
180
|
def _join_glyph_line(
|
|
@@ -248,12 +252,14 @@ def _cell_row_separator(
|
|
|
248
252
|
def _glyph_line_parts(
|
|
249
253
|
glyphs: list[NativeTableGlyph] | list[_PendingGlyph],
|
|
250
254
|
median_height: float,
|
|
255
|
+
*,
|
|
256
|
+
presorted: bool = False,
|
|
251
257
|
) -> list[tuple[str, int | None]]:
|
|
252
258
|
"""重建单行文本片段,并保留每个可见片段的原字符索引。"""
|
|
253
259
|
|
|
254
260
|
if not glyphs:
|
|
255
261
|
return []
|
|
256
|
-
ordered = sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
|
|
262
|
+
ordered = glyphs if presorted else sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
|
|
257
263
|
parts: list[tuple[str, int | None]] = [(ordered[0].text, ordered[0].source_index)]
|
|
258
264
|
previous = ordered[0]
|
|
259
265
|
for glyph in ordered[1:]:
|
|
@@ -292,7 +298,8 @@ def _tokenize_row(
|
|
|
292
298
|
groups[-1].append(glyph)
|
|
293
299
|
tokens: list[NativeTableToken] = []
|
|
294
300
|
for group in groups:
|
|
295
|
-
|
|
301
|
+
# group 是视觉行按同一排序键切出的连续片段,不必再次排序。
|
|
302
|
+
content = "".join(text for text, _source_index in _glyph_line_parts(group, median_height, presorted=True))
|
|
296
303
|
if not content:
|
|
297
304
|
continue
|
|
298
305
|
tokens.append(
|
{docvortex-0.4.4 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py
RENAMED
|
@@ -47,6 +47,78 @@ class _CanonicalTrack:
|
|
|
47
47
|
aliases: tuple[float, ...]
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
class _IndexedRules(list[_MergedRule]):
|
|
51
|
+
"""保存单次候选构造中的只读线段及轨道区间缓存,使用期间不修改线段。"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, rules: list[_MergedRule]) -> None:
|
|
54
|
+
"""按方向分组并保留原始线段顺序,缓存随当前表格调用释放。"""
|
|
55
|
+
super().__init__(rules)
|
|
56
|
+
self._oriented = {
|
|
57
|
+
orientation: tuple(rule for rule in rules if rule.orientation == orientation)
|
|
58
|
+
for orientation in ("horizontal", "vertical")
|
|
59
|
+
}
|
|
60
|
+
self._intervals: dict[tuple[str, tuple[float, ...], float], list[tuple[float, float]]] = {}
|
|
61
|
+
self._coverages: dict[tuple[str, tuple[float, ...], float, float, float], float] = {}
|
|
62
|
+
|
|
63
|
+
def coverage(self, orientation: str, aliases: tuple[float, ...], start: float, end: float, tolerance: float) -> float:
|
|
64
|
+
"""复用轨道匹配和相同查询,区间覆盖仍执行原有裁剪与浮点累加。"""
|
|
65
|
+
key = orientation, aliases, tolerance
|
|
66
|
+
coverage_key = (*key, start, end)
|
|
67
|
+
cached = self._coverages.get(coverage_key)
|
|
68
|
+
if cached is not None:
|
|
69
|
+
return cached
|
|
70
|
+
intervals = self._intervals.get(key)
|
|
71
|
+
if intervals is None:
|
|
72
|
+
oriented = self._oriented.get(orientation, ())
|
|
73
|
+
if len(aliases) == 1:
|
|
74
|
+
coordinate = aliases[0]
|
|
75
|
+
intervals = [(rule.start, rule.end) for rule in oriented if abs(rule.coordinate - coordinate) <= tolerance]
|
|
76
|
+
else:
|
|
77
|
+
intervals = [
|
|
78
|
+
(rule.start, rule.end)
|
|
79
|
+
for rule in oriented
|
|
80
|
+
if any(abs(rule.coordinate - alias) <= tolerance for alias in aliases)
|
|
81
|
+
]
|
|
82
|
+
self._intervals[key] = intervals
|
|
83
|
+
result = covered_interval_ratio(intervals, start, end)
|
|
84
|
+
self._coverages[coverage_key] = result
|
|
85
|
+
return result
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@dataclass(frozen=True, slots=True)
|
|
89
|
+
class _RulePreparation:
|
|
90
|
+
"""保存相同裁剪范围的线段与原始轨道,供 raw/supported 假设复用。"""
|
|
91
|
+
|
|
92
|
+
fragments: list[_MergedRule]
|
|
93
|
+
rules: _IndexedRules
|
|
94
|
+
inferred: tuple[list[float], list[float], list[float]]
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _prepare_rule_evidence(
|
|
98
|
+
table_input: NativeTableInput,
|
|
99
|
+
snap_tolerance: float,
|
|
100
|
+
join_gap: float,
|
|
101
|
+
width: float,
|
|
102
|
+
height: float,
|
|
103
|
+
*,
|
|
104
|
+
include_drawing: bool,
|
|
105
|
+
include_rectangles: bool,
|
|
106
|
+
evidence_halo: float,
|
|
107
|
+
) -> _RulePreparation:
|
|
108
|
+
"""一次构造裁剪、合并和原始轨道证据,不缓存后续假设判定。"""
|
|
109
|
+
fragments = _local_rule_fragments(
|
|
110
|
+
table_input,
|
|
111
|
+
snap_tolerance,
|
|
112
|
+
include_drawing=include_drawing,
|
|
113
|
+
include_rectangles=include_rectangles,
|
|
114
|
+
evidence_halo=evidence_halo,
|
|
115
|
+
)
|
|
116
|
+
if evidence_halo == 0.0 and (not fragments or len(fragments) > MAX_PRIMITIVES_PER_TABLE):
|
|
117
|
+
return _RulePreparation(fragments, _IndexedRules([]), ([], [], []))
|
|
118
|
+
rules = _IndexedRules(_merge_rule_fragments(fragments, snap_tolerance, join_gap))
|
|
119
|
+
return _RulePreparation(fragments, rules, _infer_grid_tracks(rules, snap_tolerance, width, height))
|
|
120
|
+
|
|
121
|
+
|
|
50
122
|
@dataclass(frozen=True, slots=True)
|
|
51
123
|
class _PhysicalRowEvidence:
|
|
52
124
|
"""保存一个原子行由 drawing 独立验证的边界可靠度。"""
|
|
@@ -710,6 +782,8 @@ def _separator_coverage_for_track(
|
|
|
710
782
|
) -> float:
|
|
711
783
|
"""按规范轨道全部 alias 合并计算 separator 覆盖率。"""
|
|
712
784
|
|
|
785
|
+
if isinstance(rules, _IndexedRules):
|
|
786
|
+
return rules.coverage(orientation, track.aliases, start, end, snap_tolerance)
|
|
713
787
|
intervals = [
|
|
714
788
|
(rule.start, rule.end)
|
|
715
789
|
for rule in rules
|
|
@@ -787,6 +861,8 @@ def _separator_coverage(
|
|
|
787
861
|
) -> float:
|
|
788
862
|
"""计算指定潜在隔断被同轴物理线段覆盖的比例。"""
|
|
789
863
|
|
|
864
|
+
if isinstance(rules, _IndexedRules):
|
|
865
|
+
return rules.coverage(orientation, (coordinate,), start, end, snap_tolerance)
|
|
790
866
|
intervals = [
|
|
791
867
|
(rule.start, rule.end)
|
|
792
868
|
for rule in rules
|
|
@@ -1196,6 +1272,7 @@ def _build_vector_tracks(
|
|
|
1196
1272
|
include_rectangles: bool,
|
|
1197
1273
|
prune_unsupported_horizontal: bool,
|
|
1198
1274
|
diagnostics: dict[str, Any] | None,
|
|
1275
|
+
rule_cache: dict[tuple[bool, bool, float], _RulePreparation] | None = None,
|
|
1199
1276
|
) -> _VectorTracks | None:
|
|
1200
1277
|
"""构造并规范化轨道,保持 halo、别名及物理行数的原有拒绝顺序。"""
|
|
1201
1278
|
|
|
@@ -1225,26 +1302,26 @@ def _build_vector_tracks(
|
|
|
1225
1302
|
table_bbox,
|
|
1226
1303
|
normalize_angle(table_input.angle),
|
|
1227
1304
|
)
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1305
|
+
if rule_cache is None:
|
|
1306
|
+
rule_cache = {}
|
|
1307
|
+
exact_key = include_drawing, include_rectangles, 0.0
|
|
1308
|
+
exact = rule_cache.get(exact_key)
|
|
1309
|
+
if exact is None:
|
|
1310
|
+
exact = _prepare_rule_evidence(
|
|
1311
|
+
table_input,
|
|
1312
|
+
snap_tolerance,
|
|
1313
|
+
join_gap,
|
|
1314
|
+
local_width,
|
|
1315
|
+
local_height,
|
|
1316
|
+
include_drawing=include_drawing,
|
|
1317
|
+
include_rectangles=include_rectangles,
|
|
1318
|
+
evidence_halo=0.0,
|
|
1319
|
+
)
|
|
1320
|
+
rule_cache[exact_key] = exact
|
|
1321
|
+
exact_fragments = exact.fragments
|
|
1235
1322
|
if not exact_fragments or len(exact_fragments) > MAX_PRIMITIVES_PER_TABLE:
|
|
1236
1323
|
return _reject_vector_candidate(diagnostics, "raw_fragments")
|
|
1237
|
-
|
|
1238
|
-
exact_fragments,
|
|
1239
|
-
snap_tolerance,
|
|
1240
|
-
join_gap,
|
|
1241
|
-
)
|
|
1242
|
-
exact_x_tracks, exact_y_tracks, _removed = _infer_grid_tracks(
|
|
1243
|
-
exact_rules,
|
|
1244
|
-
snap_tolerance,
|
|
1245
|
-
local_width,
|
|
1246
|
-
local_height,
|
|
1247
|
-
)
|
|
1324
|
+
exact_x_tracks, exact_y_tracks, _removed = exact.inferred
|
|
1248
1325
|
# 多行表格保持原始 bbox 裁剪;halo 只服务可能退化为单物理行的
|
|
1249
1326
|
# 边界片段,避免吸入相邻行或页外端点改变既有拓扑。
|
|
1250
1327
|
single_column_halo_hint = (
|
|
@@ -1278,29 +1355,29 @@ def _build_vector_tracks(
|
|
|
1278
1355
|
else 0.0
|
|
1279
1356
|
)
|
|
1280
1357
|
if evidence_halo > 0:
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1358
|
+
halo_key = include_drawing, include_rectangles, evidence_halo
|
|
1359
|
+
prepared = rule_cache.get(halo_key)
|
|
1360
|
+
if prepared is None:
|
|
1361
|
+
prepared = _prepare_rule_evidence(
|
|
1362
|
+
table_input,
|
|
1363
|
+
snap_tolerance,
|
|
1364
|
+
join_gap,
|
|
1365
|
+
local_width,
|
|
1366
|
+
local_height,
|
|
1367
|
+
include_drawing=include_drawing,
|
|
1368
|
+
include_rectangles=include_rectangles,
|
|
1369
|
+
evidence_halo=evidence_halo,
|
|
1370
|
+
)
|
|
1371
|
+
rule_cache[halo_key] = prepared
|
|
1293
1372
|
else:
|
|
1294
|
-
|
|
1295
|
-
|
|
1373
|
+
prepared = exact
|
|
1374
|
+
raw_fragments, rules = prepared.fragments, prepared.rules
|
|
1296
1375
|
if diagnostics is not None:
|
|
1297
1376
|
diagnostics["raw_fragment_count"] = len(raw_fragments)
|
|
1298
|
-
inferred_x_tracks, inferred_y_tracks, removed_horizontal_tracks =
|
|
1299
|
-
rules,
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
local_height,
|
|
1303
|
-
prune_unsupported_horizontal=prune_unsupported_horizontal,
|
|
1377
|
+
inferred_x_tracks, inferred_y_tracks, removed_horizontal_tracks = (
|
|
1378
|
+
_infer_grid_tracks(rules, snap_tolerance, local_width, local_height, prune_unsupported_horizontal=True)
|
|
1379
|
+
if prune_unsupported_horizontal
|
|
1380
|
+
else prepared.inferred
|
|
1304
1381
|
)
|
|
1305
1382
|
if diagnostics is not None:
|
|
1306
1383
|
diagnostics["track_hypothesis"] = "supported" if prune_unsupported_horizontal else "raw"
|
|
@@ -1824,6 +1901,7 @@ def _build_vector_candidate(
|
|
|
1824
1901
|
evidence_label: str,
|
|
1825
1902
|
prune_unsupported_horizontal: bool = False,
|
|
1826
1903
|
diagnostics: dict[str, Any] | None = None,
|
|
1904
|
+
rule_cache: dict[tuple[bool, bool, float], _RulePreparation] | None = None,
|
|
1827
1905
|
) -> NativeTableCandidate | None:
|
|
1828
1906
|
"""按轨道、拓扑、文本落格及评分的固定顺序构造矢量候选。"""
|
|
1829
1907
|
|
|
@@ -1836,6 +1914,7 @@ def _build_vector_candidate(
|
|
|
1836
1914
|
include_rectangles=include_rectangles,
|
|
1837
1915
|
prune_unsupported_horizontal=prune_unsupported_horizontal,
|
|
1838
1916
|
diagnostics=diagnostics,
|
|
1917
|
+
rule_cache=rule_cache,
|
|
1839
1918
|
)
|
|
1840
1919
|
if tracks is None:
|
|
1841
1920
|
return None
|
|
@@ -1853,6 +1932,7 @@ def build_vector_candidates(
|
|
|
1853
1932
|
"""分别从 drawing 中心线和矩形晶格生成矢量网格候选。"""
|
|
1854
1933
|
|
|
1855
1934
|
candidates: list[NativeTableCandidate] = []
|
|
1935
|
+
rule_cache: dict[tuple[bool, bool, float], _RulePreparation] = {}
|
|
1856
1936
|
raw_line_diagnostics: dict[str, Any] | None = {} if diagnostics is not None else None
|
|
1857
1937
|
line_candidate = _build_vector_candidate(
|
|
1858
1938
|
table_input,
|
|
@@ -1861,6 +1941,7 @@ def build_vector_candidates(
|
|
|
1861
1941
|
include_rectangles=False,
|
|
1862
1942
|
evidence_label="line_grid",
|
|
1863
1943
|
diagnostics=raw_line_diagnostics,
|
|
1944
|
+
rule_cache=rule_cache,
|
|
1864
1945
|
)
|
|
1865
1946
|
line_hypotheses = [raw_line_diagnostics] if raw_line_diagnostics is not None else []
|
|
1866
1947
|
selected_line_diagnostics = raw_line_diagnostics
|
|
@@ -1874,6 +1955,7 @@ def build_vector_candidates(
|
|
|
1874
1955
|
evidence_label="line_grid",
|
|
1875
1956
|
prune_unsupported_horizontal=True,
|
|
1876
1957
|
diagnostics=supported_line_diagnostics,
|
|
1958
|
+
rule_cache=rule_cache,
|
|
1877
1959
|
)
|
|
1878
1960
|
if supported_line_diagnostics is not None:
|
|
1879
1961
|
removed_tracks = supported_line_diagnostics.get(
|
|
@@ -1900,6 +1982,7 @@ def build_vector_candidates(
|
|
|
1900
1982
|
include_rectangles=True,
|
|
1901
1983
|
evidence_label="rect_grid",
|
|
1902
1984
|
diagnostics=rect_diagnostics,
|
|
1985
|
+
rule_cache=rule_cache,
|
|
1903
1986
|
)
|
|
1904
1987
|
if diagnostics is not None and rect_diagnostics is not None:
|
|
1905
1988
|
diagnostics.append(rect_diagnostics)
|
|
@@ -2,18 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from ....document.pdf.text._contracts import Bbox
|
|
5
6
|
from ....schema import BBox
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
def normalize_bbox(value: object) -> BBox | None:
|
|
9
10
|
"""把任意四元组规范为有效浮点 bbox,异常或退化框返回空。"""
|
|
10
11
|
|
|
12
|
+
# 自有 Bbox 的下标协议仅转发底层数组,直接读取可避免每个框五次 Python 调用。
|
|
13
|
+
# 只匹配精确类型,第三方可迭代对象及覆盖下标行为的子类仍走原协议。
|
|
14
|
+
if type(value) is Bbox:
|
|
15
|
+
value = value.bbox
|
|
11
16
|
try:
|
|
12
17
|
x0, y0, x1, y1 = [float(item) for item in value] # type: ignore[arg-type]
|
|
13
18
|
except (TypeError, ValueError):
|
|
14
19
|
return None
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
# 与两个元素的稳定排序使用相同比较方向,保留相等值及 NaN 的顺序。
|
|
21
|
+
left, right = (x1, x0) if x1 < x0 else (x0, x1)
|
|
22
|
+
top, bottom = (y1, y0) if y1 < y0 else (y0, y1)
|
|
17
23
|
if right <= left or bottom <= top:
|
|
18
24
|
return None
|
|
19
25
|
return left, top, right, bottom
|
|
@@ -81,8 +81,12 @@ def _cell_visual_lines(
|
|
|
81
81
|
chars=chars,
|
|
82
82
|
visual_row_id=visual_row,
|
|
83
83
|
)
|
|
84
|
-
_fill_native_typography(line, page_size)
|
|
85
84
|
lines.append(line)
|
|
85
|
+
# 排版特征只供多行二维合并使用;单行会原样进入字符脚本判定,
|
|
86
|
+
# 该路径只读取 chars/angle/公式区域,不读取行级字体或高度统计。
|
|
87
|
+
if len(lines) > 1:
|
|
88
|
+
for line in lines:
|
|
89
|
+
_fill_native_typography(line, page_size)
|
|
86
90
|
return lines
|
|
87
91
|
|
|
88
92
|
|