docvortex 0.2.3__tar.gz → 0.2.4__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.2.3/src/docvortex.egg-info → docvortex-0.2.4}/PKG-INFO +2 -1
- {docvortex-0.2.3 → docvortex-0.2.4}/pyproject.toml +1 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/models.py +7 -1
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/assembly.py +192 -0
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/converter.py +69 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/models.py +10 -1
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/package.py +6 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/path.py +91 -65
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/reading_order.py +13 -82
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/resources.py +29 -2
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/scene.py +47 -10
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/table.py +192 -20
- docvortex-0.2.4/src/docvortex/analyzers/native/ofd/vector.py +271 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/api.py +8 -2
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/version.py +1 -1
- {docvortex-0.2.3 → docvortex-0.2.4/src/docvortex.egg-info}/PKG-INFO +2 -1
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/SOURCES.txt +4 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/requires.txt +1 -0
- docvortex-0.2.4/tests/unittest/test_ofd_assembly.py +242 -0
- docvortex-0.2.4/tests/unittest/test_ofd_vector_tables.py +323 -0
- docvortex-0.2.3/src/docvortex/analyzers/native/ofd/converter.py +0 -31
- {docvortex-0.2.3 → docvortex-0.2.4}/LICENSE.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/MANIFEST.in +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/README.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/README.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/demo.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/README.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/schemas/middle-2.0.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/schemas/model-2.0.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/setup.cfg +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/script_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/shared.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/candidate.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/engine.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_common.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/text_grid.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_recovery/vector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/text_styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/cli.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/document.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/visual_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/document/source.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/errors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/files.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/hyperlink.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/image_payload.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/platform.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/options.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/api.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/html.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/result.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/schema.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex/visualization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_architecture.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_document_envelope.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_format_matrix.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_html_namespace.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_render_ownership.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/__init__.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/build_html_css.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/capture_baseline.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.2.3 → docvortex-0.2.4}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
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
|
|
@@ -35,6 +35,7 @@ Requires-Dist: olefile<1,>=0.47
|
|
|
35
35
|
Requires-Dist: pylatexenc<3,>=2.10
|
|
36
36
|
Requires-Dist: latex2mathml<4,>=3.81.0
|
|
37
37
|
Requires-Dist: mathml2omml==0.0.2
|
|
38
|
+
Requires-Dist: resvg_py<0.6,>=0.5.0
|
|
38
39
|
Requires-Dist: reportlab
|
|
39
40
|
Requires-Dist: ziamath<0.14,>=0.13
|
|
40
41
|
Requires-Dist: fast-langdetect<0.3.0,>=0.2.3
|
|
@@ -26,6 +26,7 @@ dependencies = [
|
|
|
26
26
|
"python-docx>=1.2.0,<2", "pypptx-with-oxml>=1.0.3,<2",
|
|
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
|
+
"resvg_py>=0.5.0,<0.6",
|
|
29
30
|
"reportlab", "ziamath>=0.13,<0.14", "fast-langdetect>=0.2.3,<0.3.0",
|
|
30
31
|
"magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
|
|
31
32
|
]
|
|
@@ -66,14 +66,20 @@ class HtmlModel:
|
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
class OfdModel:
|
|
69
|
-
"""
|
|
69
|
+
"""包装 OFD 固定版式解析,保留最近一次调用的非致命诊断。"""
|
|
70
|
+
|
|
71
|
+
def __init__(self) -> None:
|
|
72
|
+
"""初始化实例级诊断,避免不同文档间串用结果。"""
|
|
73
|
+
self.diagnostics: list[dict[str, Any]] = []
|
|
70
74
|
|
|
71
75
|
def predict(self, file_binary: BinaryIO) -> list[list[dict[str, Any]]]:
|
|
72
76
|
"""转换调用方持有的整份 OFD 流,并返回逐物理页 model-list。"""
|
|
73
77
|
from .ofd.converter import OfdConverter
|
|
74
78
|
|
|
79
|
+
self.diagnostics = []
|
|
75
80
|
converter = OfdConverter()
|
|
76
81
|
converter.convert(file_binary)
|
|
82
|
+
self.diagnostics = converter.diagnostics
|
|
77
83
|
return converter.pages
|
|
78
84
|
|
|
79
85
|
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"""在 OFD 所属区域内恢复视觉行、样式片段和保守段落。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import re
|
|
7
|
+
import statistics
|
|
8
|
+
from dataclasses import replace
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from ....schema import BBox, BlockType
|
|
12
|
+
from .geometry import bbox_union
|
|
13
|
+
from .models import TextLine
|
|
14
|
+
from .text import format_line_html, format_line_spans
|
|
15
|
+
|
|
16
|
+
_LIST_START = re.compile(r"^\s*(?:[•●▪◆]|[-*]\s|\d+[.)、]\s*|[一二三四五六七八九十]+[、)])")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upright_point(x: float, y: float, angle: int) -> tuple[float, float]:
|
|
20
|
+
"""将页面点旋转到文字阅读方向,统一横排与直角旋转的几何计算。"""
|
|
21
|
+
radians = math.radians(angle)
|
|
22
|
+
cosine, sine = round(math.cos(radians), 12), round(math.sin(radians), 12)
|
|
23
|
+
return cosine * x + sine * y, -sine * x + cosine * y
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def upright_box(bbox: BBox, angle: int) -> BBox:
|
|
27
|
+
"""在文字方向坐标内计算矩形外接框。"""
|
|
28
|
+
points = [upright_point(x, y, angle) for x in (bbox[0], bbox[2]) for y in (bbox[1], bbox[3])]
|
|
29
|
+
return min(p[0] for p in points), min(p[1] for p in points), max(p[0] for p in points), max(p[1] for p in points)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def line_baseline(line: TextLine) -> float:
|
|
33
|
+
"""优先读取真实字形基线,缺少字形时才退回视觉框中心。"""
|
|
34
|
+
if line.glyphs:
|
|
35
|
+
return statistics.median(upright_point(*glyph.origin, line.angle)[1] for glyph in line.glyphs)
|
|
36
|
+
box = upright_box(line.bbox, line.angle)
|
|
37
|
+
return (box[1] + box[3]) / 2
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def line_runs(line: TextLine) -> tuple[tuple[str, tuple[str, ...]], ...]:
|
|
41
|
+
"""读取已组装行的样式片段,原始行按其自身样式返回单个片段。"""
|
|
42
|
+
return line.runs or ((line.text, line.styles),)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def line_spans(line: TextLine) -> list[dict[str, object]]:
|
|
46
|
+
"""将视觉行的各样式片段投影为既有结构化 Span。"""
|
|
47
|
+
return [span for text, styles in line_runs(line) for span in format_line_spans(text, styles)]
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def line_html(line: TextLine) -> str:
|
|
51
|
+
"""按片段样式序列化单元格文字,不把首片段样式扩散到整行。"""
|
|
52
|
+
return "".join(format_line_html(text, styles) for text, styles in line_runs(line))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _fragment_separator(first: TextLine, second: TextLine) -> str:
|
|
56
|
+
"""仅在英文单词片段之间存在可见词间距时补空格。"""
|
|
57
|
+
if not first.text or not second.text:
|
|
58
|
+
return ""
|
|
59
|
+
if not (first.text[-1].isascii() and second.text[0].isascii() and first.text[-1].isalnum() and second.text[0].isalnum()):
|
|
60
|
+
return ""
|
|
61
|
+
first_box = upright_box(first.glyphs[-1].bbox if first.glyphs else first.bbox, first.angle)
|
|
62
|
+
second_box = upright_box(second.glyphs[0].bbox if second.glyphs else second.bbox, second.angle)
|
|
63
|
+
widths = [box[2] - box[0] for box in (first_box, second_box)]
|
|
64
|
+
threshold = 0.2 * max(min(first.font_size, second.font_size), statistics.median(widths), 0.5)
|
|
65
|
+
return " " if second_box[0] - first_box[2] >= threshold else ""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def merge_same_baseline_lines(lines: list[TextLine]) -> list[TextLine]:
|
|
69
|
+
"""按真实基线聚行并沿阅读方向拼接,保留样式及层和模板隔离。"""
|
|
70
|
+
metrics = {id(line): (line_baseline(line), upright_box(line.bbox, line.angle)) for line in lines}
|
|
71
|
+
ordered = sorted(lines, key=lambda line: (line.angle, line.layer_type, line.template_id or -1, metrics[id(line)][0]))
|
|
72
|
+
rows: list[list[TextLine]] = []
|
|
73
|
+
for line in ordered:
|
|
74
|
+
previous = rows[-1][0] if rows else None
|
|
75
|
+
if (
|
|
76
|
+
previous is not None
|
|
77
|
+
and (line.angle, line.layer_type, line.template_id) == (previous.angle, previous.layer_type, previous.template_id)
|
|
78
|
+
and abs(metrics[id(line)][0] - metrics[id(previous)][0]) <= 0.2 * min(line.font_size, previous.font_size)
|
|
79
|
+
):
|
|
80
|
+
rows[-1].append(line)
|
|
81
|
+
else:
|
|
82
|
+
rows.append([line])
|
|
83
|
+
output: list[TextLine] = []
|
|
84
|
+
for row in rows:
|
|
85
|
+
fragments = sorted(row, key=lambda line: (metrics[id(line)][1][0], line.paint_order))
|
|
86
|
+
assembled: list[TextLine] = []
|
|
87
|
+
for line in fragments:
|
|
88
|
+
previous = assembled[-1] if assembled else None
|
|
89
|
+
if previous is not None:
|
|
90
|
+
first_box, second_box = upright_box(previous.bbox, line.angle), metrics[id(line)][1]
|
|
91
|
+
size = min(previous.font_size, line.font_size)
|
|
92
|
+
gap = second_box[0] - first_box[2]
|
|
93
|
+
if size > 0 and max(previous.font_size, line.font_size) <= 1.35 * size and -0.25 * size <= gap <= 0.8 * size:
|
|
94
|
+
separator = _fragment_separator(previous, line)
|
|
95
|
+
runs = line_runs(previous) + (((separator, ()),) if separator else ()) + line_runs(line)
|
|
96
|
+
assembled[-1] = replace(
|
|
97
|
+
previous,
|
|
98
|
+
text=previous.text + separator + line.text,
|
|
99
|
+
bbox=bbox_union((previous.bbox, line.bbox)) or previous.bbox,
|
|
100
|
+
glyphs=previous.glyphs + line.glyphs,
|
|
101
|
+
paint_order=min(previous.paint_order, line.paint_order),
|
|
102
|
+
runs=runs,
|
|
103
|
+
)
|
|
104
|
+
continue
|
|
105
|
+
assembled.append(line)
|
|
106
|
+
output.extend(assembled)
|
|
107
|
+
return output
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _block_text(block: dict[str, Any]) -> str:
|
|
111
|
+
"""读取 OFD 私有视觉行文本,避免依赖公共 Span 的序列化细节。"""
|
|
112
|
+
return block.get("text_line", "")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def _paragraph_separator(previous: str, current: str) -> str:
|
|
116
|
+
"""中文换行直接续接,英文词和句末标点后的换行补空格,保留已有空白与连字符。"""
|
|
117
|
+
last, first = previous[-1:], current[:1]
|
|
118
|
+
if not last or not first or not (last.isascii() and first.isascii()):
|
|
119
|
+
return ""
|
|
120
|
+
return " " if (last.isalnum() or last in '.,;:!?)]}"') and (first.isalnum() or first in '(["') else ""
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def merge_paragraph_blocks(blocks: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
124
|
+
"""在阅读顺序内按局部栏宽、行距及缩进合段,视觉块和辅助块作为屏障。"""
|
|
125
|
+
output: list[dict[str, Any]] = []
|
|
126
|
+
for index, block in enumerate(blocks):
|
|
127
|
+
if block["type"] != BlockType.TEXT:
|
|
128
|
+
output.append(block)
|
|
129
|
+
continue
|
|
130
|
+
angle = block["angle"]
|
|
131
|
+
current_box = upright_box(block["bbox_mm"], angle)
|
|
132
|
+
size = block["font_size_mm"]
|
|
133
|
+
# 只观察邻近且横向重叠的正文,防止另一栏或远处区域影响本栏尺度。
|
|
134
|
+
neighbors: list[dict[str, Any]] = []
|
|
135
|
+
for direction in (-1, 1):
|
|
136
|
+
for offset in range(1, 9):
|
|
137
|
+
position = index + direction * offset
|
|
138
|
+
if not 0 <= position < len(blocks):
|
|
139
|
+
break
|
|
140
|
+
candidate = blocks[position]
|
|
141
|
+
if (
|
|
142
|
+
candidate["type"] != BlockType.TEXT
|
|
143
|
+
or candidate["angle"] != angle
|
|
144
|
+
or candidate["text_scope"] != block["text_scope"]
|
|
145
|
+
):
|
|
146
|
+
break
|
|
147
|
+
box = upright_box(candidate["bbox_mm"], angle)
|
|
148
|
+
if abs(box[1] - current_box[1]) > 20 * size or min(box[2], current_box[2]) <= max(box[0], current_box[0]):
|
|
149
|
+
break
|
|
150
|
+
if abs(box[0] - current_box[0]) <= 3 * size:
|
|
151
|
+
neighbors.append(candidate)
|
|
152
|
+
context = neighbors + [block]
|
|
153
|
+
boxes = [upright_box(item["bbox_mm"], angle) for item in context]
|
|
154
|
+
right = max(box[2] for box in boxes)
|
|
155
|
+
baselines = sorted({item["baseline_mm"] for item in context})
|
|
156
|
+
gaps = [b - a for a, b in zip(baselines[:-1], baselines[1:], strict=True) if b - a >= 0.5 * size]
|
|
157
|
+
pitch = statistics.median(gaps) if gaps else 1.5 * size
|
|
158
|
+
previous = output[-1] if output else None
|
|
159
|
+
can_merge = (
|
|
160
|
+
previous is not None
|
|
161
|
+
and previous["type"] == BlockType.TEXT
|
|
162
|
+
and previous["angle"] == angle
|
|
163
|
+
and previous["text_scope"] == block["text_scope"]
|
|
164
|
+
)
|
|
165
|
+
if can_merge:
|
|
166
|
+
last_box = upright_box(previous["line_bboxes_mm"][-1], angle)
|
|
167
|
+
previous_size = previous["font_size_mm"]
|
|
168
|
+
delta = block["baseline_mm"] - previous["baseline_mm"]
|
|
169
|
+
previous_text, current_text = _block_text(previous).strip(), _block_text(block).strip()
|
|
170
|
+
can_merge = (
|
|
171
|
+
min(size, previous_size) > 0
|
|
172
|
+
and max(size, previous_size) <= 1.25 * min(size, previous_size)
|
|
173
|
+
and 0.5 * size <= delta <= min(1.4 * pitch, 3 * size)
|
|
174
|
+
and -2.5 * size <= current_box[0] - last_box[0] <= 0.8 * size
|
|
175
|
+
and right - last_box[2] <= 1.5 * size
|
|
176
|
+
and min(last_box[2], current_box[2]) > max(last_box[0], current_box[0])
|
|
177
|
+
and not _LIST_START.match(current_text)
|
|
178
|
+
and not (len(previous_text) <= 4 or len(current_text) <= 4)
|
|
179
|
+
)
|
|
180
|
+
if can_merge:
|
|
181
|
+
previous_text, current_text = _block_text(previous), _block_text(block)
|
|
182
|
+
separator = _paragraph_separator(previous_text, current_text)
|
|
183
|
+
previous["content"].extend(format_line_spans(separator, ()))
|
|
184
|
+
previous["content"].extend(block["content"])
|
|
185
|
+
previous["bbox_mm"] = bbox_union((previous["bbox_mm"], block["bbox_mm"]))
|
|
186
|
+
previous["line_bboxes_mm"].extend(block["line_bboxes_mm"])
|
|
187
|
+
previous["baseline_mm"] = block["baseline_mm"]
|
|
188
|
+
previous["text_line"] = current_text
|
|
189
|
+
else:
|
|
190
|
+
# 复制将被追加的列表,确保组段不会修改调用方的原始视觉行。
|
|
191
|
+
output.append({**block, "content": list(block["content"]), "line_bboxes_mm": list(block["line_bboxes_mm"])})
|
|
192
|
+
return output
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"""OFD 二进制流到分页 raw model-list 的转换入口。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import BinaryIO
|
|
6
|
+
import base64
|
|
7
|
+
|
|
8
|
+
from .constants import MAX_TOTAL_BYTES
|
|
9
|
+
from .errors import OfdResourceLimitError
|
|
10
|
+
from .package import OfdPackage
|
|
11
|
+
from .reading_order import OfdReadingOrderProjector
|
|
12
|
+
from .scene import OfdSceneBuilder
|
|
13
|
+
from .models import ImageItem
|
|
14
|
+
from .vector import render_vector_page, UnsupportedVector
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class OfdConverter:
|
|
18
|
+
"""编排 OFD 包读取、场景构建和阅读顺序投影。"""
|
|
19
|
+
|
|
20
|
+
def __init__(self) -> None:
|
|
21
|
+
"""初始化空的分页输出。"""
|
|
22
|
+
self.pages: list[list[dict[str, object]]] = []
|
|
23
|
+
self.diagnostics: list[dict[str, object]] = []
|
|
24
|
+
|
|
25
|
+
def convert(self, file_binary: BinaryIO) -> None:
|
|
26
|
+
"""读取整份 OFD 并更新分页 model-list。"""
|
|
27
|
+
self.pages = []
|
|
28
|
+
self.diagnostics = []
|
|
29
|
+
file_bytes = file_binary.read(MAX_TOTAL_BYTES + 1)
|
|
30
|
+
if len(file_bytes) > MAX_TOTAL_BYTES:
|
|
31
|
+
raise OfdResourceLimitError(f"OFD resource limit exceeded: max_total_bytes={MAX_TOTAL_BYTES}")
|
|
32
|
+
with OfdPackage(file_bytes) as package:
|
|
33
|
+
scenes = OfdSceneBuilder(package).build()
|
|
34
|
+
for scene in scenes:
|
|
35
|
+
if (
|
|
36
|
+
not scene.text_object_count
|
|
37
|
+
and not scene.image_object_count
|
|
38
|
+
and scene.vector_paths
|
|
39
|
+
and not scene.vector_unsupported
|
|
40
|
+
):
|
|
41
|
+
try:
|
|
42
|
+
payload = render_vector_page(scene, package)
|
|
43
|
+
except OfdResourceLimitError:
|
|
44
|
+
raise
|
|
45
|
+
except (UnsupportedVector, ValueError, RuntimeError, OSError) as exc:
|
|
46
|
+
scene.diagnostics.append({"code": "ofd_vector_render_failed", "message": str(exc)})
|
|
47
|
+
else:
|
|
48
|
+
if payload is not None:
|
|
49
|
+
scene.images.append(
|
|
50
|
+
ImageItem(
|
|
51
|
+
scene.physical_box,
|
|
52
|
+
"data:image/png;base64," + base64.b64encode(payload).decode("ascii"),
|
|
53
|
+
0,
|
|
54
|
+
None,
|
|
55
|
+
"Body",
|
|
56
|
+
None,
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
scene.diagnostics.append(
|
|
60
|
+
{
|
|
61
|
+
"code": "ofd_vector_rasterized",
|
|
62
|
+
"message": "Vector-only page preserved as an image; no text recognition was performed",
|
|
63
|
+
}
|
|
64
|
+
)
|
|
65
|
+
self.diagnostics.extend({**item, "page_index": scene.page_idx} for item in scene.diagnostics)
|
|
66
|
+
self.pages = OfdReadingOrderProjector(scenes).project()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
__all__ = ["OfdConverter"]
|
|
@@ -3,13 +3,16 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any, TYPE_CHECKING
|
|
7
7
|
|
|
8
8
|
from lxml import etree # type: ignore[reportMissingImports]
|
|
9
9
|
|
|
10
10
|
from ....schema import BBox
|
|
11
11
|
from .geometry import Affine, Point, Quad
|
|
12
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from .vector import VectorPath, ClipPath
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
@dataclass(frozen=True, slots=True)
|
|
15
18
|
class FontResource:
|
|
@@ -78,6 +81,7 @@ class TextLine:
|
|
|
78
81
|
layer_type: str
|
|
79
82
|
template_id: int | None
|
|
80
83
|
styles: tuple[str, ...] = ()
|
|
84
|
+
runs: tuple[tuple[str, tuple[str, ...]], ...] = ()
|
|
81
85
|
|
|
82
86
|
|
|
83
87
|
@dataclass(frozen=True, slots=True)
|
|
@@ -115,6 +119,10 @@ class OfdPageScene:
|
|
|
115
119
|
axis_lines: list[AxisLine] = field(default_factory=list)
|
|
116
120
|
images: list[ImageItem] = field(default_factory=list)
|
|
117
121
|
diagnostics: list[dict[str, Any]] = field(default_factory=list)
|
|
122
|
+
vector_paths: list[VectorPath] = field(default_factory=list)
|
|
123
|
+
text_object_count: int = 0
|
|
124
|
+
image_object_count: int = 0
|
|
125
|
+
vector_unsupported: bool = False
|
|
118
126
|
|
|
119
127
|
|
|
120
128
|
@dataclass(frozen=True, slots=True)
|
|
@@ -151,6 +159,7 @@ class PageBuildContext:
|
|
|
151
159
|
layer_type: str
|
|
152
160
|
template_id: int | None
|
|
153
161
|
draw_style: dict[str, str] = field(default_factory=dict)
|
|
162
|
+
vector_clips: tuple[tuple[ClipPath, ...], ...] = ()
|
|
154
163
|
|
|
155
164
|
|
|
156
165
|
__all__ = [
|
|
@@ -101,6 +101,12 @@ class OfdPackage:
|
|
|
101
101
|
self._asset_bytes = 0
|
|
102
102
|
self._root: etree._Element | None = None
|
|
103
103
|
|
|
104
|
+
def charge_generated_asset(self, size: int) -> None:
|
|
105
|
+
"""将生成的 PNG 与包内读取素材累计到同一文档资产预算。"""
|
|
106
|
+
if self._asset_bytes + size > MAX_ASSET_TOTAL_BYTES:
|
|
107
|
+
raise OfdResourceLimitError(f"OFD resource limit exceeded: max_asset_total_bytes={MAX_ASSET_TOTAL_BYTES}")
|
|
108
|
+
self._asset_bytes += size
|
|
109
|
+
|
|
104
110
|
@staticmethod
|
|
105
111
|
def _is_safe_member_name(name: str) -> bool:
|
|
106
112
|
"""判断 ZIP 成员是否为包内安全 POSIX 路径。"""
|
|
@@ -80,49 +80,75 @@ def _line_bbox(first: tuple[float, float], second: tuple[float, float], width: f
|
|
|
80
80
|
return None
|
|
81
81
|
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
83
|
+
PathCommand = tuple[str, tuple[float, ...]]
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def parse_path_commands(value: str, budget: OfdPathBudget) -> tuple[PathCommand, ...]:
|
|
87
|
+
"""只扫描一次完整路径命令,绘制与表格检测共用同一份受限数值结果。"""
|
|
88
|
+
commands: list[PathCommand] = []
|
|
89
|
+
operator: str | None = None
|
|
89
90
|
parameters: list[float] = []
|
|
90
|
-
commands = {"S", "M", "L", "Q", "B", "A", "C", "CM"}
|
|
91
91
|
arity = {"S": 2, "M": 2, "L": 2, "Q": 4, "B": 6, "A": 7, "CM": 2}
|
|
92
|
+
cursor = 0
|
|
93
|
+
pending = False
|
|
92
94
|
for match in _TOKEN_RE.finditer(value):
|
|
93
95
|
budget.charge_token()
|
|
96
|
+
if value[cursor : match.start()].strip(" \t\r\n,"):
|
|
97
|
+
return ()
|
|
98
|
+
cursor = match.end()
|
|
94
99
|
token = match.group()
|
|
95
|
-
if token in
|
|
100
|
+
if token in {*arity, "C"}:
|
|
96
101
|
if parameters:
|
|
97
|
-
return
|
|
102
|
+
return ()
|
|
98
103
|
budget.charge_command()
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
command = None
|
|
104
|
+
operator = token
|
|
105
|
+
pending = operator != "C"
|
|
106
|
+
if operator == "C":
|
|
107
|
+
commands.append((operator, ()))
|
|
108
|
+
operator = None
|
|
105
109
|
continue
|
|
106
|
-
if
|
|
107
|
-
return
|
|
108
|
-
|
|
109
|
-
if
|
|
110
|
-
return
|
|
111
|
-
parameters.append(
|
|
112
|
-
if len(parameters)
|
|
110
|
+
if operator is None:
|
|
111
|
+
return ()
|
|
112
|
+
number = _finite_float(token)
|
|
113
|
+
if number is None:
|
|
114
|
+
return ()
|
|
115
|
+
parameters.append(number)
|
|
116
|
+
if len(parameters) == arity[operator]:
|
|
117
|
+
if operator == "A" and (
|
|
118
|
+
parameters[0] < 0 or parameters[1] < 0 or parameters[3] not in (0, 1) or parameters[4] not in (0, 1)
|
|
119
|
+
):
|
|
120
|
+
return ()
|
|
121
|
+
commands.append((operator, tuple(parameters)))
|
|
122
|
+
parameters.clear()
|
|
123
|
+
pending = False
|
|
124
|
+
return () if pending or parameters or value[cursor:].strip() else tuple(commands)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def command_segments(
|
|
128
|
+
commands: tuple[PathCommand, ...], transform: Affine
|
|
129
|
+
) -> list[tuple[tuple[float, float], tuple[float, float]]]:
|
|
130
|
+
"""从已解析路径读取直线段,曲线只更新端点而不把控制线当表格边框。"""
|
|
131
|
+
result = []
|
|
132
|
+
current = start = None
|
|
133
|
+
for operator, values in commands:
|
|
134
|
+
if operator == "C":
|
|
135
|
+
if current is not None and start is not None and current != start:
|
|
136
|
+
result.append((transform.apply(current), transform.apply(start)))
|
|
137
|
+
current = start
|
|
113
138
|
continue
|
|
114
|
-
endpoint =
|
|
115
|
-
if
|
|
116
|
-
current = endpoint
|
|
117
|
-
subpath_start = endpoint
|
|
118
|
-
elif command in {"L", "CM"}:
|
|
119
|
-
if current is not None:
|
|
120
|
-
result.append((transform.apply(current), transform.apply(endpoint)))
|
|
121
|
-
current = endpoint
|
|
139
|
+
endpoint = values[-2:]
|
|
140
|
+
if operator in {"S", "M"}:
|
|
141
|
+
current = start = endpoint
|
|
122
142
|
else:
|
|
143
|
+
if operator in {"L", "CM"} and current is not None:
|
|
144
|
+
result.append((transform.apply(current), transform.apply(endpoint)))
|
|
123
145
|
current = endpoint
|
|
124
|
-
|
|
125
|
-
|
|
146
|
+
return result
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _segments(value: str, transform: Affine, budget: OfdPathBudget) -> list[tuple[tuple[float, float], tuple[float, float]]]:
|
|
150
|
+
"""保留既有内部入口,复用完整命令解析提取直线段。"""
|
|
151
|
+
return command_segments(parse_path_commands(value, budget), transform)
|
|
126
152
|
|
|
127
153
|
|
|
128
154
|
def build_axis_lines(
|
|
@@ -134,6 +160,7 @@ def build_axis_lines(
|
|
|
134
160
|
template_id: int | None,
|
|
135
161
|
budget: OfdPathBudget,
|
|
136
162
|
resolved_style: dict[str, str] | None = None,
|
|
163
|
+
commands: tuple[PathCommand, ...] | None = None,
|
|
137
164
|
) -> list[AxisLine]:
|
|
138
165
|
"""从一个 PathObject 提取可见轴向线段。"""
|
|
139
166
|
style = resolved_style or {}
|
|
@@ -157,42 +184,41 @@ def build_axis_lines(
|
|
|
157
184
|
object_transform = parent_transform.compose(Affine.translation(boundary[0], boundary[1])).compose(
|
|
158
185
|
parse_affine(path_object.get("CTM"))
|
|
159
186
|
)
|
|
160
|
-
extracted: list[AxisLine] = []
|
|
161
187
|
data = first_descendant(path_object, "AbbreviatedData")
|
|
162
|
-
|
|
188
|
+
if commands is None:
|
|
189
|
+
commands = parse_path_commands(element_text(data), budget) if data is not None else ()
|
|
190
|
+
if any(operator in {"Q", "B", "A"} for operator, _ in commands):
|
|
191
|
+
return []
|
|
192
|
+
segments = command_segments(commands, object_transform)
|
|
193
|
+
stroke = style.get("Stroke", path_object.get("Stroke", "true")).casefold() not in {"false", "0"}
|
|
194
|
+
fill = style.get("Fill", path_object.get("Fill", "false")).casefold() in {"true", "1"}
|
|
195
|
+
extracted: list[AxisLine] = []
|
|
196
|
+
if fill and not stroke:
|
|
197
|
+
# 只把单个细长矩形归约为中心线,字形轮廓、背景和角点填充均不能提供边框证据。
|
|
198
|
+
if len(segments) != 4 or not commands or commands[-1][0] != "C":
|
|
199
|
+
return []
|
|
200
|
+
points = {point for segment in segments for point in segment}
|
|
201
|
+
xs, ys = sorted({p[0] for p in points}), sorted({p[1] for p in points})
|
|
202
|
+
if len(points) != 4 or len(xs) != 2 or len(ys) != 2:
|
|
203
|
+
return []
|
|
204
|
+
if any(first[0] != second[0] and first[1] != second[1] for first, second in segments):
|
|
205
|
+
return []
|
|
206
|
+
dx, dy = xs[-1] - xs[0], ys[-1] - ys[0]
|
|
207
|
+
if min(dx, dy) <= 0 or max(dx, dy) < 5 * min(dx, dy):
|
|
208
|
+
return []
|
|
209
|
+
orientation = "horizontal" if dx >= dy else "vertical"
|
|
210
|
+
clipped = bbox_intersection((xs[0], ys[0], xs[-1], ys[-1]), object_clip)
|
|
211
|
+
return [AxisLine(clipped, orientation, min(dx, dy), paint_order, template_id)] if clipped else []
|
|
212
|
+
if not stroke:
|
|
213
|
+
return []
|
|
214
|
+
width *= max(math.hypot(object_transform.a, object_transform.b), math.hypot(object_transform.c, object_transform.d))
|
|
163
215
|
for first, second in segments:
|
|
164
216
|
line = _line_bbox(first, second, width)
|
|
165
|
-
if line is None:
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
extracted.append(
|
|
171
|
-
AxisLine(
|
|
172
|
-
bbox=clipped,
|
|
173
|
-
orientation=orientation,
|
|
174
|
-
width=width,
|
|
175
|
-
paint_order=paint_order,
|
|
176
|
-
template_id=template_id,
|
|
177
|
-
)
|
|
178
|
-
)
|
|
179
|
-
boundary_width = boundary_page[2] - boundary_page[0]
|
|
180
|
-
boundary_height = boundary_page[3] - boundary_page[1]
|
|
181
|
-
if (
|
|
182
|
-
not extracted
|
|
183
|
-
and not segments
|
|
184
|
-
and max(boundary_width, boundary_height) >= 5 * max(min(boundary_width, boundary_height), 0.01)
|
|
185
|
-
):
|
|
186
|
-
orientation = "horizontal" if boundary_width >= boundary_height else "vertical"
|
|
187
|
-
extracted.append(
|
|
188
|
-
AxisLine(
|
|
189
|
-
bbox=object_clip,
|
|
190
|
-
orientation=orientation,
|
|
191
|
-
width=width,
|
|
192
|
-
paint_order=paint_order,
|
|
193
|
-
template_id=template_id,
|
|
194
|
-
)
|
|
195
|
-
)
|
|
217
|
+
if line is not None:
|
|
218
|
+
line_bbox, orientation = line
|
|
219
|
+
clipped = bbox_intersection(line_bbox, object_clip)
|
|
220
|
+
if clipped is not None:
|
|
221
|
+
extracted.append(AxisLine(clipped, orientation, width, paint_order, template_id))
|
|
196
222
|
if not extracted and parse_int(path_object.get("ID")) is None:
|
|
197
223
|
logger.debug("OFD_PATH_SKIPPED: path without stable ID produced no axis lines")
|
|
198
224
|
return extracted
|