docvortex 0.4.14__tar.gz → 0.4.16__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.14/src/docvortex.egg-info → docvortex-0.4.16}/PKG-INFO +1 -1
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/sdk-0.4.md +6 -1
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/line_merging.py +64 -3
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/pdf.py +14 -7
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/__init__.py +2 -1
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/_document.py +16 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_contracts.py +8 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/properties.py +2 -2
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/public_api.py +1 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/version.py +1 -1
- {docvortex-0.4.14 → docvortex-0.4.16/src/docvortex.egg-info}/PKG-INFO +1 -1
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex.egg-info/SOURCES.txt +1 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_document_metadata.py +10 -1
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_analysis_api.py +5 -3
- docvortex-0.4.16/tests/test_pdf_cpu_evidence.py +164 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/LICENSE.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/MANIFEST.in +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/README.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/README.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/demo.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/README.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/docx_01.doc +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/docx_01.docx +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/pptx_01.ppt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/pptx_01.pptx +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/rtf_01.rtf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/xlsx_01.xls +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/METADATA.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/USAGE.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/pyproject.toml +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/schemas/middle-2.0.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/schemas/model-2.0.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/setup.cfg +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/opc.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/cli.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/links.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/detection.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/document/source.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/errors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/export/files.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/options.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/html.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/result.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/schema.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex/visualization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_reviewed_history.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_architecture.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_cli_logging.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_document_envelope.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_format_matrix.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_geometry_api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_html_namespace.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_public_export_api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_public_image_api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_render_ownership.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_office_title_types.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/__init__.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/build_html_css.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/capture_baseline.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.4.14 → docvortex-0.4.16}/tools/font_geometry.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# DocVortex 0.4 公共 SDK 与宿主迁移
|
|
2
2
|
|
|
3
|
-
MinerU
|
|
3
|
+
本文记录 0.4 系列的公共模块边界。MinerU 的页面原语复用需要 `docvortex>=0.4.15,<1`,文档协议、解析路由、模型回退与渲染语义保持不变。
|
|
4
4
|
|
|
5
5
|
## 公开入口
|
|
6
6
|
|
|
@@ -30,6 +30,11 @@ MinerU 使用 `docvortex>=0.4.0,<0.5.0`。本轮调整 Python 模块边界,保
|
|
|
30
30
|
|
|
31
31
|
`prepare_table_page` 仅在存在候选表格时调用;同页复用其物化数据。`recover_table_region` 返回最终 HTML、来源、置信度和诊断,`None` 表示没有可接受结果。结构恢复异常以 `PDFTableRecoveryError` 保留原始原因,交给宿主回退;HTML 物化异常继续传播,避免改变旧异常边界。页面几何可以复用,证据不持有 PDFium 裸句柄。
|
|
32
32
|
|
|
33
|
+
从 0.4.15 起,`PDFPage.get_vector_geometry()` 一次遍历返回公开的 `PDFPageVectorGeometry`,其中
|
|
34
|
+
`drawing_lines` 与 `path_infos` 是物化元组。`prepare_table_page` 和 `prepare_text_evidence` 都接受可选的
|
|
35
|
+
`vector_geometry=`,可与 `geometry=` 一起复用。调用方按页、按处理窗口持有并释放这些数据;`PDFPage`
|
|
36
|
+
本身不缓存。文字证据构造只读访问源字符,旋转和组行累加使用独立的局部对象。
|
|
37
|
+
|
|
33
38
|
通用 `convert_bbox` 显式声明 `unit`、`pixel` 或 `point`;`page_size` 使用 point,`render_scale` 是每 point 的像素数。模型 bbox 的自动解释与三位小数规则保留在 MinerU。共享 PDFium 锁、进程池和资源关闭职责仍归 DocVortex。
|
|
34
39
|
|
|
35
40
|
## 升级与回退
|
|
@@ -7,6 +7,8 @@ from .layout_evidence import build_layout_evidence
|
|
|
7
7
|
import re
|
|
8
8
|
import statistics
|
|
9
9
|
import unicodedata
|
|
10
|
+
import heapq
|
|
11
|
+
import math
|
|
10
12
|
|
|
11
13
|
from ....schema import BBox
|
|
12
14
|
from .geometry import (
|
|
@@ -35,6 +37,59 @@ def _caption_crosses_left_text(members: list[_LineItem]) -> bool:
|
|
|
35
37
|
)
|
|
36
38
|
|
|
37
39
|
|
|
40
|
+
def _same_baseline_candidate_pairs(
|
|
41
|
+
lines: list[_LineItem],
|
|
42
|
+
local_bboxes: list[BBox],
|
|
43
|
+
compatible_indices: dict[tuple[int, bool, str | None], list[int]],
|
|
44
|
+
) -> list[list[int]] | None:
|
|
45
|
+
"""仅筛除原规则不可能接受的纵向远距行对;异常或密集页面回退原遍历。"""
|
|
46
|
+
bounds: list[tuple[float, float]] = []
|
|
47
|
+
for line, box in zip(lines, local_bboxes, strict=True):
|
|
48
|
+
try:
|
|
49
|
+
height = _line_effective_height(line, box)
|
|
50
|
+
if not all(math.isfinite(value) for value in (*box, height)) or box[2] <= box[0] or box[3] <= box[1]:
|
|
51
|
+
return None
|
|
52
|
+
# 同行规则既接受框交叠,也接受底边差不超过 0.25 * max(height) 的行。
|
|
53
|
+
# 两行各自扩展底边容差形成超集,最终仍由原判定函数决定是否合并。
|
|
54
|
+
low, high = min(box[1], box[3] - 0.25 * height), box[3] + 0.25 * height
|
|
55
|
+
if line.angle == 0 and line.source_bbox is not None:
|
|
56
|
+
source = line.source_bbox
|
|
57
|
+
if not all(math.isfinite(value) for value in source) or source[2] <= source[0] or source[3] <= source[1]:
|
|
58
|
+
return None
|
|
59
|
+
source_height = source[3] - source[1]
|
|
60
|
+
low = min(low, source[1], source[3] - 0.25 * source_height)
|
|
61
|
+
high = max(high, source[3] + 0.25 * source_height)
|
|
62
|
+
if not math.isfinite(low) or not math.isfinite(high):
|
|
63
|
+
return None
|
|
64
|
+
except (TypeError, ValueError, IndexError):
|
|
65
|
+
return None
|
|
66
|
+
bounds.append((low, high))
|
|
67
|
+
|
|
68
|
+
candidates: list[list[int]] = [[] for _ in lines]
|
|
69
|
+
pair_count = 0
|
|
70
|
+
pair_limit = max(4096, 32 * len(lines))
|
|
71
|
+
for indices in compatible_indices.values():
|
|
72
|
+
active: set[int] = set()
|
|
73
|
+
ends: list[tuple[float, int]] = []
|
|
74
|
+
for index in sorted(indices, key=lambda item: (bounds[item][0], item)):
|
|
75
|
+
low, high = bounds[index]
|
|
76
|
+
# 保留相等端点,避免漏掉原规则恰好落在容差边界上的行对。
|
|
77
|
+
while ends and ends[0][0] < low:
|
|
78
|
+
_, expired = heapq.heappop(ends)
|
|
79
|
+
active.remove(expired)
|
|
80
|
+
pair_count += len(active)
|
|
81
|
+
if pair_count > pair_limit:
|
|
82
|
+
return None
|
|
83
|
+
for previous in active:
|
|
84
|
+
left, right = (previous, index) if previous < index else (index, previous)
|
|
85
|
+
candidates[left].append(right)
|
|
86
|
+
active.add(index)
|
|
87
|
+
heapq.heappush(ends, (high, index))
|
|
88
|
+
for partners in candidates:
|
|
89
|
+
partners.sort()
|
|
90
|
+
return candidates
|
|
91
|
+
|
|
92
|
+
|
|
38
93
|
def _merge_same_baseline_text_lines(
|
|
39
94
|
lines: list[_LineItem],
|
|
40
95
|
page_size: tuple[float, float],
|
|
@@ -67,8 +122,14 @@ def _merge_same_baseline_text_lines(
|
|
|
67
122
|
compatible_indices: dict[tuple[int, bool, str | None], list[int]] = {}
|
|
68
123
|
for index, line in enumerate(lines):
|
|
69
124
|
compatible_indices.setdefault((line.angle, line.formula_candidate_only, line.semantic_type), []).append(index)
|
|
125
|
+
candidates = _same_baseline_candidate_pairs(lines, local_bboxes, compatible_indices)
|
|
70
126
|
for left_index, left_line in enumerate(lines):
|
|
71
|
-
|
|
127
|
+
right_indices = (
|
|
128
|
+
candidates[left_index]
|
|
129
|
+
if candidates is not None
|
|
130
|
+
else compatible_indices[(left_line.angle, left_line.formula_candidate_only, left_line.semantic_type)]
|
|
131
|
+
)
|
|
132
|
+
for right_index in right_indices:
|
|
72
133
|
if right_index <= left_index:
|
|
73
134
|
continue
|
|
74
135
|
right_line = lines[right_index]
|
|
@@ -222,14 +283,14 @@ def _overlapping_inline_cluster_pair_is_connected(
|
|
|
222
283
|
return False
|
|
223
284
|
if first_line.semantic_type != second_line.semantic_type:
|
|
224
285
|
return False
|
|
286
|
+
if _bbox_axis_overlap_ratio(first_bbox, second_bbox, axis="y") < 0.55:
|
|
287
|
+
return False
|
|
225
288
|
if _connection_crosses_table(
|
|
226
289
|
first_line.bbox,
|
|
227
290
|
second_line.bbox,
|
|
228
291
|
table_bboxes,
|
|
229
292
|
):
|
|
230
293
|
return False
|
|
231
|
-
if _bbox_axis_overlap_ratio(first_bbox, second_bbox, axis="y") < 0.55:
|
|
232
|
-
return False
|
|
233
294
|
|
|
234
295
|
first_guard_bbox = first_line.source_bbox or first_bbox
|
|
235
296
|
second_guard_bbox = second_line.source_bbox or second_bbox
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
from collections.abc import Sequence
|
|
6
|
-
from copy import deepcopy
|
|
7
6
|
from dataclasses import dataclass, replace
|
|
8
7
|
from typing import Any
|
|
9
8
|
|
|
10
|
-
from ..document.pdf import PDFPage, PDFPageTextGeometry
|
|
9
|
+
from ..document.pdf import PDFPage, PDFPageTextGeometry, PDFPageVectorGeometry
|
|
11
10
|
from ..schema import BBox
|
|
12
11
|
from .native.pdf._script_geometry import ScriptRole, classify_char_script_roles
|
|
13
12
|
from .native.pdf._table_recovery.contracts import NativeTableRectangle, NativeTableRule, PDFTableRecoveryError
|
|
@@ -57,6 +56,7 @@ def prepare_text_evidence(
|
|
|
57
56
|
page: PDFPage,
|
|
58
57
|
*,
|
|
59
58
|
geometry: PDFPageTextGeometry | None = None,
|
|
59
|
+
vector_geometry: PDFPageVectorGeometry | None = None,
|
|
60
60
|
supported_angles: Sequence[float] = (0.0,),
|
|
61
61
|
table_regions: Sequence[BBox] = (),
|
|
62
62
|
excluded_script_regions: Sequence[BBox] = (),
|
|
@@ -70,11 +70,12 @@ def prepare_text_evidence(
|
|
|
70
70
|
|
|
71
71
|
geometry = geometry if geometry is not None else page.get_chars_with_geometry()
|
|
72
72
|
page_size = tuple(float(value) for value in page.size)
|
|
73
|
-
|
|
73
|
+
# 源字符只读;组行使用独立累加框,旋转等变换在消费处创建局部字符副本。
|
|
74
|
+
chars = geometry.chars
|
|
74
75
|
lines = _build_native_line_items(
|
|
75
76
|
get_lines_from_chars(chars), page_size, page_rotation=page.rotation, supported_angles=supported_angles
|
|
76
77
|
)
|
|
77
|
-
drawing_lines = page.get_drawing_lines()
|
|
78
|
+
drawing_lines = vector_geometry.drawing_lines if vector_geometry is not None else page.get_drawing_lines()
|
|
78
79
|
styles = detect_pdf_text_style_lines(lines, drawing_lines)
|
|
79
80
|
links = detect_pdf_text_link_lines(lines, page.get_link_annotations())
|
|
80
81
|
script_lines = merge_text_line_clusters(list(lines), page_size, list(table_regions))
|
|
@@ -124,16 +125,22 @@ def apply_text_evidence(
|
|
|
124
125
|
)
|
|
125
126
|
|
|
126
127
|
|
|
127
|
-
def prepare_table_page(
|
|
128
|
+
def prepare_table_page(
|
|
129
|
+
page: PDFPage,
|
|
130
|
+
*,
|
|
131
|
+
geometry: PDFPageTextGeometry | None = None,
|
|
132
|
+
vector_geometry: PDFPageVectorGeometry | None = None,
|
|
133
|
+
) -> PDFTablePage:
|
|
128
134
|
"""在调用方确认存在候选表格后物化页面原语,复用已有字符几何。"""
|
|
129
135
|
from .native.pdf._table_recovery.engine import coerce_native_table_rectangles, coerce_native_table_rules
|
|
130
136
|
|
|
131
137
|
geometry = geometry if geometry is not None else page.get_chars_with_geometry()
|
|
138
|
+
vector_geometry = vector_geometry if vector_geometry is not None else page.get_vector_geometry()
|
|
132
139
|
return PDFTablePage(
|
|
133
140
|
tuple(float(value) for value in page.size),
|
|
134
141
|
geometry,
|
|
135
|
-
coerce_native_table_rules(
|
|
136
|
-
coerce_native_table_rectangles(
|
|
142
|
+
coerce_native_table_rules(vector_geometry.drawing_lines),
|
|
143
|
+
coerce_native_table_rectangles(vector_geometry.path_infos),
|
|
137
144
|
)
|
|
138
145
|
|
|
139
146
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""PDF 文档访问、显式分类及共享文本契约。"""
|
|
2
2
|
|
|
3
|
-
from ._document import PDFDocument, PDFPage, PDFPageTextGeometry, get_lines_from_chars
|
|
3
|
+
from ._document import PDFDocument, PDFPage, PDFPageTextGeometry, PDFPageVectorGeometry, get_lines_from_chars
|
|
4
4
|
from .pdfium import PdfiumFontError, PdfiumRuntimeInfo, initialize_pdfium_runtime
|
|
5
5
|
from .text import Bbox, Char, Line, Span
|
|
6
6
|
|
|
@@ -8,6 +8,7 @@ __all__ = [
|
|
|
8
8
|
"PDFDocument",
|
|
9
9
|
"PDFPage",
|
|
10
10
|
"PDFPageTextGeometry",
|
|
11
|
+
"PDFPageVectorGeometry",
|
|
11
12
|
"get_lines_from_chars",
|
|
12
13
|
"Bbox",
|
|
13
14
|
"Char",
|
|
@@ -104,6 +104,7 @@ from .native_contracts import (
|
|
|
104
104
|
from .native_contracts import (
|
|
105
105
|
PDFPageTextGeometry as PDFPageTextGeometry,
|
|
106
106
|
)
|
|
107
|
+
from .native_contracts import PDFPageVectorGeometry as PDFPageVectorGeometry
|
|
107
108
|
from .native_contracts import (
|
|
108
109
|
PDFPathInfo as PDFPathInfo,
|
|
109
110
|
)
|
|
@@ -289,6 +290,10 @@ class PDFPage:
|
|
|
289
290
|
|
|
290
291
|
return self.pdf_doc.get_page_path_infos(self._idx)
|
|
291
292
|
|
|
293
|
+
def get_vector_geometry(self) -> PDFPageVectorGeometry:
|
|
294
|
+
"""一次读取当前页的绘图线和路径摘要,由调用方显式管理复用范围。"""
|
|
295
|
+
return self.pdf_doc.get_page_vector_geometry(self._idx)
|
|
296
|
+
|
|
292
297
|
def get_link_annotations(self) -> list[PDFLinkAnnotation]:
|
|
293
298
|
"""读取当前页已规范到视觉页面坐标的外部 URI Link 注解。"""
|
|
294
299
|
|
|
@@ -599,6 +604,17 @@ class PDFDocument:
|
|
|
599
604
|
page_rotation = 0
|
|
600
605
|
return _extract_page_drawing_lines(page, page_bbox, page_rotation)
|
|
601
606
|
|
|
607
|
+
def get_page_vector_geometry(self, page_idx: int) -> PDFPageVectorGeometry:
|
|
608
|
+
"""在同一页面和共享锁内遍历一次 Path,返回独立物化的矢量几何。"""
|
|
609
|
+
with self._open_page(page_idx) as page:
|
|
610
|
+
page_bbox = _normalize_pdf_page_bbox(page.get_bbox())
|
|
611
|
+
try:
|
|
612
|
+
page_rotation = int(page.get_rotation()) % 360
|
|
613
|
+
except Exception:
|
|
614
|
+
page_rotation = 0
|
|
615
|
+
drawings, paths = _extract_page_paths_and_lines(page, page_bbox, page_rotation)
|
|
616
|
+
return PDFPageVectorGeometry(tuple(drawings), tuple(paths))
|
|
617
|
+
|
|
602
618
|
def get_page_path_infos(self, page_idx: int) -> list[PDFPathInfo]:
|
|
603
619
|
"""提取页面及嵌套 Form 中的 Path 几何和绘制特征。"""
|
|
604
620
|
with self._open_page(page_idx) as page:
|
|
@@ -125,6 +125,14 @@ class PDFImageInfo:
|
|
|
125
125
|
fingerprint: str | None
|
|
126
126
|
|
|
127
127
|
|
|
128
|
+
@dataclass(frozen=True, slots=True)
|
|
129
|
+
class PDFPageVectorGeometry:
|
|
130
|
+
"""保存一次 Path 遍历物化的线与路径摘要,不持有 PDFium 句柄。"""
|
|
131
|
+
|
|
132
|
+
drawing_lines: tuple[PDFDrawingLine, ...] = ()
|
|
133
|
+
path_infos: tuple[PDFPathInfo, ...] = ()
|
|
134
|
+
|
|
135
|
+
|
|
128
136
|
@dataclass(frozen=True, slots=True)
|
|
129
137
|
class _PDFPageSnapshot:
|
|
130
138
|
"""保存单次页面生命周期提取的纯 Python 数据,不持有 PDFium 子对象。"""
|
|
@@ -29,7 +29,7 @@ def property_date(value: object, *, warnings: list[str] | None = None) -> str |
|
|
|
29
29
|
if not text:
|
|
30
30
|
return None
|
|
31
31
|
if text.startswith("D:"):
|
|
32
|
-
match = re.fullmatch(r"D:(\d{4})(\d{2})?(\d{2})?(\d{2})?(\d{2})?(\d{2})?(Z|[+-]\d{2}'
|
|
32
|
+
match = re.fullmatch(r"D:(\d{4})(\d{2})?(\d{2})?(\d{2})?(\d{2})?(\d{2})?(Z|[+-]\d{2}'?(?:\d{2}'?)?)?", text)
|
|
33
33
|
if match is None:
|
|
34
34
|
if warnings is not None:
|
|
35
35
|
warnings.append(f"Invalid declared date: {text[:120]}")
|
|
@@ -41,7 +41,7 @@ def property_date(value: object, *, warnings: list[str] | None = None) -> str |
|
|
|
41
41
|
text += separator + part
|
|
42
42
|
if zone:
|
|
43
43
|
zone = zone.replace("'", "")
|
|
44
|
-
text += zone if zone == "Z" else zone[:3] + ":" + zone[3:]
|
|
44
|
+
text += zone if zone == "Z" else zone[:3] + (":" + zone[3:] if zone[3:] else ":00")
|
|
45
45
|
try:
|
|
46
46
|
if re.fullmatch(r"\d{4}", text):
|
|
47
47
|
date(int(text), 1, 1)
|
|
@@ -452,6 +452,7 @@ tests/test_history_geometry_tools.py
|
|
|
452
452
|
tests/test_html_namespace.py
|
|
453
453
|
tests/test_mixed_font_script_reference.py
|
|
454
454
|
tests/test_pdf_analysis_api.py
|
|
455
|
+
tests/test_pdf_cpu_evidence.py
|
|
455
456
|
tests/test_pdf_font_geometry.py
|
|
456
457
|
tests/test_pdf_font_runtime.py
|
|
457
458
|
tests/test_pdf_model_text_normalization.py
|
|
@@ -156,7 +156,16 @@ def test_rtf_explicit_time_count_and_application() -> None:
|
|
|
156
156
|
|
|
157
157
|
@pytest.mark.parametrize(
|
|
158
158
|
"value,expected",
|
|
159
|
-
[
|
|
159
|
+
[
|
|
160
|
+
("D:2024", "2024"),
|
|
161
|
+
("D:202402", "2024-02"),
|
|
162
|
+
("2024-03-04", "2024-03-04"),
|
|
163
|
+
("D:202413", None),
|
|
164
|
+
("yesterday", None),
|
|
165
|
+
("D:20131014124204-04'", "2013-10-14T12:42:04-04:00"),
|
|
166
|
+
("D:20240304050607+08", "2024-03-04T05:06:07+08:00"),
|
|
167
|
+
("D:20240304050607+0", None),
|
|
168
|
+
],
|
|
160
169
|
)
|
|
161
170
|
def test_dates_never_invent_missing_parts(value: str, expected: str | None) -> None:
|
|
162
171
|
"""非法日期保持未知,年和月精度不能补成任意日期。"""
|
|
@@ -23,7 +23,7 @@ from docvortex.analyzers.pdf import (
|
|
|
23
23
|
prepare_text_evidence,
|
|
24
24
|
recover_table_region,
|
|
25
25
|
)
|
|
26
|
-
from docvortex.document.pdf import PDFPageTextGeometry
|
|
26
|
+
from docvortex.document.pdf import PDFPageTextGeometry, PDFPageVectorGeometry
|
|
27
27
|
from docvortex.public_api import PUBLIC_API
|
|
28
28
|
|
|
29
29
|
|
|
@@ -112,6 +112,7 @@ def test_table_page_is_reused_and_returns_materialized_html(monkeypatch: pytest.
|
|
|
112
112
|
page = MagicMock(size=(100.0, 200.0))
|
|
113
113
|
page.get_drawing_lines.return_value = []
|
|
114
114
|
page.get_path_infos.return_value = []
|
|
115
|
+
page.get_vector_geometry.return_value = PDFPageVectorGeometry()
|
|
115
116
|
geometry = PDFPageTextGeometry([], {}, {})
|
|
116
117
|
prepared = prepare_table_page(page, geometry=geometry)
|
|
117
118
|
recover = MagicMock(
|
|
@@ -125,8 +126,9 @@ def test_table_page_is_reused_and_returns_materialized_html(monkeypatch: pytest.
|
|
|
125
126
|
assert all(result.html == "<table><tr><td>x<sup>2</sup></td></tr></table>" for result in results)
|
|
126
127
|
assert [call.args[0].angle for call in recover.call_args_list] == [0, 90]
|
|
127
128
|
page.get_chars_with_geometry.assert_not_called()
|
|
128
|
-
page.
|
|
129
|
-
page.
|
|
129
|
+
page.get_vector_geometry.assert_called_once()
|
|
130
|
+
page.get_drawing_lines.assert_not_called()
|
|
131
|
+
page.get_path_infos.assert_not_called()
|
|
130
132
|
assert prepared.geometry is geometry
|
|
131
133
|
monkeypatch.setattr(table_materialization, "recover_table_result", lambda *_args: None)
|
|
132
134
|
assert recover_table_region(prepared, (10, 20, 90, 80)) is None
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""验证页面原语复用、源数据只读和行对筛选的保守等价性。"""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import pickle
|
|
7
|
+
import random
|
|
8
|
+
from copy import deepcopy
|
|
9
|
+
from dataclasses import asdict
|
|
10
|
+
from io import BytesIO
|
|
11
|
+
from unittest.mock import MagicMock
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
from reportlab.pdfgen.canvas import Canvas
|
|
15
|
+
|
|
16
|
+
from docvortex.analyzers import pdf as analysis
|
|
17
|
+
from docvortex.analyzers.native.pdf import line_merging as merging
|
|
18
|
+
from docvortex.analyzers.native.pdf.models import _LineItem
|
|
19
|
+
from docvortex.analyzers.native.pdf.native_text import _build_native_line_items
|
|
20
|
+
from docvortex.document.pdf import Bbox, PDFDocument, PDFPageVectorGeometry, get_lines_from_chars
|
|
21
|
+
from docvortex.document.pdf import _document
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _pdf() -> bytes:
|
|
25
|
+
"""生成含链接、旋转文本、上下标和矢量线的独立 PDF。"""
|
|
26
|
+
buffer = BytesIO()
|
|
27
|
+
canvas = Canvas(buffer, pagesize=(400, 600))
|
|
28
|
+
for index in range(25):
|
|
29
|
+
canvas.setFont("Helvetica", 12)
|
|
30
|
+
canvas.drawString(30, 570 - index * 20, f"Row {index}: x")
|
|
31
|
+
canvas.setFont("Helvetica", 7)
|
|
32
|
+
canvas.drawString(130, 574 - index * 20, "2")
|
|
33
|
+
canvas.line(20, 566 - index * 20, 180, 566 - index * 20)
|
|
34
|
+
canvas.linkURL("https://example.com", (30, 550, 90, 565), relative=0)
|
|
35
|
+
canvas.saveState()
|
|
36
|
+
canvas.translate(300, 200)
|
|
37
|
+
canvas.rotate(90)
|
|
38
|
+
canvas.drawString(0, 0, "Rotated text")
|
|
39
|
+
canvas.restoreState()
|
|
40
|
+
canvas.rect(20, 50, 170, 540)
|
|
41
|
+
canvas.save()
|
|
42
|
+
return buffer.getvalue()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_vector_snapshot_matches_independent_queries_and_outlives_document(monkeypatch: pytest.MonkeyPatch) -> None:
|
|
46
|
+
"""一次组合遍历与旧查询逐值一致,文档关闭后仍可安全使用。"""
|
|
47
|
+
with PDFDocument(_pdf()) as document:
|
|
48
|
+
page = document[0]
|
|
49
|
+
drawings, paths = page.get_drawing_lines(), page.get_path_infos()
|
|
50
|
+
extract = MagicMock(wraps=_document._extract_page_paths_and_lines)
|
|
51
|
+
monkeypatch.setattr(_document, "_extract_page_paths_and_lines", extract)
|
|
52
|
+
vectors = page.get_vector_geometry()
|
|
53
|
+
assert vectors == PDFPageVectorGeometry(tuple(drawings), tuple(paths))
|
|
54
|
+
extract.assert_called_once()
|
|
55
|
+
assert pickle.loads(pickle.dumps(vectors)) == vectors
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def test_shared_primitives_preserve_characters_and_text_evidence() -> None:
|
|
59
|
+
"""共享字符与矢量几何不改动源对象,并保留区域相关的最终证据。"""
|
|
60
|
+
with PDFDocument(_pdf()) as document:
|
|
61
|
+
page = document[0]
|
|
62
|
+
geometry = page.get_chars_with_geometry()
|
|
63
|
+
vectors = page.get_vector_geometry()
|
|
64
|
+
before = pickle.dumps(geometry)
|
|
65
|
+
expected = analysis.prepare_text_evidence(page, geometry=geometry, table_regions=[(20, 30, 190, 300)])
|
|
66
|
+
materialized_page = MagicMock(size=page.size, rotation=page.rotation)
|
|
67
|
+
materialized_page.get_link_annotations.return_value = page.get_link_annotations()
|
|
68
|
+
actual = analysis.prepare_text_evidence(
|
|
69
|
+
materialized_page, geometry=geometry, vector_geometry=vectors, table_regions=[(20, 30, 190, 300)]
|
|
70
|
+
)
|
|
71
|
+
assert (actual.styles, actual.links, actual.scripts) == (expected.styles, expected.links, expected.scripts)
|
|
72
|
+
assert actual.geometry is geometry
|
|
73
|
+
analysis.prepare_table_page(materialized_page, geometry=geometry, vector_geometry=vectors)
|
|
74
|
+
materialized_page.get_chars_with_geometry.assert_not_called()
|
|
75
|
+
materialized_page.get_vector_geometry.assert_not_called()
|
|
76
|
+
materialized_page.get_drawing_lines.assert_not_called()
|
|
77
|
+
materialized_page.get_path_infos.assert_not_called()
|
|
78
|
+
assert pickle.dumps(geometry) == before
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _groups(lines: list[_LineItem]) -> dict[tuple[int, bool, str | None], list[int]]:
|
|
82
|
+
"""按原合并规则的必要分类条件建立索引。"""
|
|
83
|
+
groups: dict[tuple[int, bool, str | None], list[int]] = {}
|
|
84
|
+
for index, line in enumerate(lines):
|
|
85
|
+
groups.setdefault((line.angle, line.formula_candidate_only, line.semantic_type), []).append(index)
|
|
86
|
+
return groups
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_candidate_screening_never_drops_original_acceptance() -> None:
|
|
90
|
+
"""覆盖来源框偏移和字体尺度大于可见框的情况,逐对验证原判定的接受超集。"""
|
|
91
|
+
rng = random.Random(918)
|
|
92
|
+
accepted = 0
|
|
93
|
+
for _ in range(30):
|
|
94
|
+
lines = []
|
|
95
|
+
for index in range(80):
|
|
96
|
+
x, y = rng.uniform(0, 200), rng.uniform(0, 200)
|
|
97
|
+
width, height = rng.uniform(0.1, 30), rng.uniform(0.1, 25)
|
|
98
|
+
box = (x, y, x + width, y + height)
|
|
99
|
+
lines.append(
|
|
100
|
+
_LineItem(
|
|
101
|
+
"x",
|
|
102
|
+
box,
|
|
103
|
+
0,
|
|
104
|
+
index,
|
|
105
|
+
source_bbox=(x - 5, y - 10, x + width + 5, y + height + 10),
|
|
106
|
+
baseline=y + height,
|
|
107
|
+
chars=[{"char_idx": index, "source_indices": (index,), "bbox": Bbox(list(box)), "char": "x"}],
|
|
108
|
+
visual_row_id=index,
|
|
109
|
+
effective_height=rng.uniform(0.1, 80),
|
|
110
|
+
font_signature=("test", 0),
|
|
111
|
+
font_coverage=1,
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
candidates = merging._same_baseline_candidate_pairs(lines, [line.bbox for line in lines], _groups(lines))
|
|
115
|
+
assert candidates is not None
|
|
116
|
+
for left, first in enumerate(lines):
|
|
117
|
+
assert candidates[left] == sorted(set(candidates[left]))
|
|
118
|
+
for right in range(left + 1, len(lines)):
|
|
119
|
+
second = lines[right]
|
|
120
|
+
if merging._can_merge_same_baseline_pair(first, first.bbox, second, second.bbox, []):
|
|
121
|
+
accepted += 1
|
|
122
|
+
assert right in candidates[left]
|
|
123
|
+
assert accepted > 100
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@pytest.mark.parametrize("invalid", [float("nan"), float("inf"), -float("inf")])
|
|
127
|
+
def test_invalid_geometry_uses_exhaustive_fallback(invalid: float) -> None:
|
|
128
|
+
"""异常源框不能悄悄缩小候选,交回已有算法处理。"""
|
|
129
|
+
lines = [_LineItem("a", (0, 0, 20, 10), 0, 0), _LineItem("b", (21, 0, 40, 10), 0, 1)]
|
|
130
|
+
lines[1].source_bbox = (0, invalid, 40, 10)
|
|
131
|
+
assert merging._same_baseline_candidate_pairs(lines, [line.bbox for line in lines], _groups(lines)) is None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_dense_page_bounds_candidate_storage() -> None:
|
|
135
|
+
"""候选数量超过线性预算时回退,不分配整个平方级行对集合。"""
|
|
136
|
+
lines = [_LineItem("a", (0, 0, 20, 10), 0, index) for index in range(128)]
|
|
137
|
+
assert merging._same_baseline_candidate_pairs(lines, [line.bbox for line in lines], _groups(lines)) is None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_bottom_edge_tolerance_is_included() -> None:
|
|
141
|
+
"""可见框不交叠但有效字体尺度允许底边对齐时仍保留原规则候选。"""
|
|
142
|
+
lines = [
|
|
143
|
+
_LineItem("a", (0, 0, 10, 1), 0, 0, effective_height=40, font_signature=("font", 0), font_coverage=1),
|
|
144
|
+
_LineItem("b", (11, 10, 21, 11), 0, 1, effective_height=40, font_signature=("font", 0), font_coverage=1),
|
|
145
|
+
]
|
|
146
|
+
assert merging._can_merge_same_baseline_pair(lines[0], lines[0].bbox, lines[1], lines[1].bbox, [])
|
|
147
|
+
assert merging._same_baseline_candidate_pairs(lines, [line.bbox for line in lines], _groups(lines)) == [[1], []]
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
@pytest.mark.parametrize("angle", [0, 90, 180, 270])
|
|
151
|
+
@pytest.mark.parametrize("tables", [[], [(0, 100, 400, 180)]])
|
|
152
|
+
def test_merged_output_matches_exhaustive_order(monkeypatch: pytest.MonkeyPatch, angle: int, tables: list) -> None:
|
|
153
|
+
"""比较完整行对象,确认筛选不会改变并查集认领、字符或结果排序。"""
|
|
154
|
+
with PDFDocument(_pdf()) as document:
|
|
155
|
+
page = document[0]
|
|
156
|
+
lines = _build_native_line_items(get_lines_from_chars(page.get_chars_with_geometry().chars), page.size)
|
|
157
|
+
for line in lines:
|
|
158
|
+
line.angle = angle
|
|
159
|
+
actual = merging.merge_text_line_clusters(deepcopy(lines), page.size, tables)
|
|
160
|
+
monkeypatch.setattr(merging, "_same_baseline_candidate_pairs", lambda *_args: None)
|
|
161
|
+
expected = merging.merge_text_line_clusters(deepcopy(lines), page.size, tables)
|
|
162
|
+
assert json.dumps([asdict(line) for line in actual], default=repr, sort_keys=True) == json.dumps(
|
|
163
|
+
[asdict(line) for line in expected], default=repr, sort_keys=True
|
|
164
|
+
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|