docvortex 0.4.4__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.4/src/docvortex.egg-info → docvortex-0.4.6}/PKG-INFO +5 -5
- {docvortex-0.4.4 → docvortex-0.4.6}/README.md +3 -3
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/JSON_PROTOCOL.md +3 -2
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/USAGE.md +19 -4
- {docvortex-0.4.4 → docvortex-0.4.6}/pyproject.toml +1 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_script_geometry.py +92 -24
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +8 -0
- {docvortex-0.4.4 → 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.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +25 -14
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +121 -38
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +15 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/formulas.py +123 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/graphics.py +18 -5
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/detection.py +7 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/scripts.py +2 -2
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_merging.py +27 -2
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/models.py +1 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/pipeline.py +8 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_geometry.py +8 -2
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_text_styles.py +5 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +11 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +16 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/_document.py +0 -34
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_contracts.py +0 -12
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_objects.py +11 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_text_geometry.py +4 -158
- {docvortex-0.4.4 → 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.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/extract.py +81 -48
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula.py +128 -30
- docvortex-0.4.6/src/docvortex/render/_internal/pdf/formula_layout.py +98 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/inline.py +18 -1
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/original.py +105 -5
- docvortex-0.4.6/src/docvortex/render/_internal/pdf/paragraph.py +123 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/renderer.py +41 -7
- docvortex-0.4.6/src/docvortex/render/_internal/pdf/table.py +485 -0
- docvortex-0.4.6/src/docvortex/render/_internal/pdf/table_content.py +251 -0
- docvortex-0.4.6/src/docvortex/render/_internal/pdf/table_layout.py +319 -0
- docvortex-0.4.6/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +410 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/version.py +1 -1
- {docvortex-0.4.4 → docvortex-0.4.6/src/docvortex.egg-info}/PKG-INFO +5 -5
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/SOURCES.txt +22 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/requires.txt +1 -1
- docvortex-0.4.6/tests/benchmarks/native_pdf_table.py +155 -0
- docvortex-0.4.6/tests/benchmarks/pdf_render.py +280 -0
- {docvortex-0.4.4 → 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.4 → docvortex-0.4.6}/tests/test_benchmark_entrypoint.py +28 -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_native_table_performance_equivalence.py +211 -0
- docvortex-0.4.6/tests/unittest/test_pdf_cjk_style.py +178 -0
- docvortex-0.4.6/tests/unittest/test_pdf_formula_layout.py +272 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_original_layout.py +7 -6
- docvortex-0.4.6/tests/unittest/test_pdf_paragraph_cache.py +107 -0
- docvortex-0.4.6/tests/unittest/test_pdf_structured_tables.py +367 -0
- docvortex-0.4.6/tests/unittest/test_pdf_table_cache.py +77 -0
- docvortex-0.4.6/tests/unittest/test_pdf_table_round2.py +305 -0
- docvortex-0.4.6/tests/unittest/test_pdf_text_dedup.py +309 -0
- docvortex-0.4.4/src/docvortex/render/_internal/pdf/table.py +0 -293
- {docvortex-0.4.4 → docvortex-0.4.6}/LICENSE.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/MANIFEST.in +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/README.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/demo.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/METADATA.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/docs/sdk-0.4.md +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/setup.cfg +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/options.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/public_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/result.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_architecture.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_document_metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/__init__.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/build_html_css.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.4 → docvortex-0.4.6}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.4 → 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
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -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 (
|
|
@@ -607,6 +620,61 @@ def _assign_component(
|
|
|
607
620
|
roles[index] = "body"
|
|
608
621
|
|
|
609
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
|
+
|
|
610
678
|
def classify_char_script_roles(
|
|
611
679
|
chars: list[Char],
|
|
612
680
|
*,
|
{docvortex-0.4.4 → docvortex-0.4.6}/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.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.4 → 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
|
|
|
@@ -32,7 +33,7 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
32
33
|
table_bbox = normalize_bbox(table_input.table_bbox)
|
|
33
34
|
if table_bbox is None:
|
|
34
35
|
return []
|
|
35
|
-
selected: list[tuple[int, int, Char]] = []
|
|
36
|
+
selected: list[tuple[int, int, Char, BBox]] = []
|
|
36
37
|
for fallback_index, char in enumerate(table_input.chars):
|
|
37
38
|
char_bbox = normalize_bbox(char.get("bbox"))
|
|
38
39
|
if char_bbox is None:
|
|
@@ -44,14 +45,14 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
44
45
|
source_index = int(char.get("char_idx", fallback_index))
|
|
45
46
|
except (TypeError, ValueError):
|
|
46
47
|
source_index = fallback_index
|
|
47
|
-
selected.append((source_index, fallback_index, char))
|
|
48
|
+
selected.append((source_index, fallback_index, char, char_bbox))
|
|
48
49
|
|
|
49
50
|
selected.sort(key=lambda item: (item[0], item[1]))
|
|
50
51
|
output: list[_PendingGlyph] = []
|
|
51
52
|
angle = normalize_angle(table_input.angle)
|
|
52
53
|
pending_space = False
|
|
53
54
|
pending_break = False
|
|
54
|
-
for
|
|
55
|
+
for source_index, _fallback_index, char, absolute_bbox in selected:
|
|
55
56
|
raw_text = str(char.get("char") or "")
|
|
56
57
|
if not raw_text:
|
|
57
58
|
continue
|
|
@@ -66,9 +67,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
66
67
|
text = _normalize_table_text(raw_text)
|
|
67
68
|
if not text or text.isspace():
|
|
68
69
|
continue
|
|
69
|
-
absolute_bbox = normalize_bbox(char.get("bbox"))
|
|
70
|
-
if absolute_bbox is None:
|
|
71
|
-
continue
|
|
72
70
|
local_bbox = page_bbox_to_table_local(
|
|
73
71
|
absolute_bbox,
|
|
74
72
|
table_bbox,
|
|
@@ -76,10 +74,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
|
|
|
76
74
|
)
|
|
77
75
|
if local_bbox is None or local_bbox[3] - local_bbox[1] < 0.5:
|
|
78
76
|
continue
|
|
79
|
-
try:
|
|
80
|
-
source_index = int(char.get("char_idx", fallback_index))
|
|
81
|
-
except (TypeError, ValueError):
|
|
82
|
-
source_index = fallback_index
|
|
83
77
|
output.append(
|
|
84
78
|
_PendingGlyph(
|
|
85
79
|
glyph_id=len(output),
|
|
@@ -153,7 +147,14 @@ def _assign_visual_rows(
|
|
|
153
147
|
)
|
|
154
148
|
else:
|
|
155
149
|
rows[best_index].append(glyph)
|
|
156
|
-
|
|
150
|
+
# 两框合并保持原 min/max 顺序,避免为每个字符建立通用迭代器。
|
|
151
|
+
previous_bbox = row_bboxes[best_index]
|
|
152
|
+
row_bboxes[best_index] = (
|
|
153
|
+
min(previous_bbox[0], glyph.bbox[0]),
|
|
154
|
+
min(previous_bbox[1], glyph.bbox[1]),
|
|
155
|
+
max(previous_bbox[2], glyph.bbox[2]),
|
|
156
|
+
max(previous_bbox[3], glyph.bbox[3]),
|
|
157
|
+
)
|
|
157
158
|
for row_index in range(best_index, len(row_bboxes)):
|
|
158
159
|
prefix_max_bottoms[row_index] = max(
|
|
159
160
|
prefix_max_bottoms[row_index - 1] if row_index > 0 else row_bboxes[row_index][3],
|
|
@@ -170,7 +171,11 @@ def _assign_visual_rows(
|
|
|
170
171
|
def _contains_cjk(text: str) -> bool:
|
|
171
172
|
"""判断文本是否包含常见中日韩统一表意字符。"""
|
|
172
173
|
|
|
173
|
-
|
|
174
|
+
# 组行热路径通常只传入相邻两个字符,直接遍历避免逐次创建生成器。
|
|
175
|
+
for char in text:
|
|
176
|
+
if "\u3400" <= char <= "\u9fff":
|
|
177
|
+
return True
|
|
178
|
+
return False
|
|
174
179
|
|
|
175
180
|
|
|
176
181
|
def _join_glyph_line(
|
|
@@ -208,6 +213,9 @@ def _looks_like_compact_unit_or_identifier(
|
|
|
208
213
|
combined = previous_line.strip() + next_line.strip()
|
|
209
214
|
if not combined or any(char.isspace() for char in combined):
|
|
210
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
|
|
211
219
|
return any(char.isdigit() or char in "/_^%°µμ" for char in combined)
|
|
212
220
|
|
|
213
221
|
|
|
@@ -248,12 +256,14 @@ def _cell_row_separator(
|
|
|
248
256
|
def _glyph_line_parts(
|
|
249
257
|
glyphs: list[NativeTableGlyph] | list[_PendingGlyph],
|
|
250
258
|
median_height: float,
|
|
259
|
+
*,
|
|
260
|
+
presorted: bool = False,
|
|
251
261
|
) -> list[tuple[str, int | None]]:
|
|
252
262
|
"""重建单行文本片段,并保留每个可见片段的原字符索引。"""
|
|
253
263
|
|
|
254
264
|
if not glyphs:
|
|
255
265
|
return []
|
|
256
|
-
ordered = sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
|
|
266
|
+
ordered = glyphs if presorted else sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
|
|
257
267
|
parts: list[tuple[str, int | None]] = [(ordered[0].text, ordered[0].source_index)]
|
|
258
268
|
previous = ordered[0]
|
|
259
269
|
for glyph in ordered[1:]:
|
|
@@ -292,7 +302,8 @@ def _tokenize_row(
|
|
|
292
302
|
groups[-1].append(glyph)
|
|
293
303
|
tokens: list[NativeTableToken] = []
|
|
294
304
|
for group in groups:
|
|
295
|
-
|
|
305
|
+
# group 是视觉行按同一排序键切出的连续片段,不必再次排序。
|
|
306
|
+
content = "".join(text for text, _source_index in _glyph_line_parts(group, median_height, presorted=True))
|
|
296
307
|
if not content:
|
|
297
308
|
continue
|
|
298
309
|
tokens.append(
|