docvortex 0.5.2__tar.gz → 0.5.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.5.2 → docvortex-0.5.4}/PKG-INFO +16 -2
- {docvortex-0.5.2 → docvortex-0.5.4}/README.md +15 -1
- docvortex-0.5.4/docs/pdf-render-worker-leases.md +38 -0
- docvortex-0.5.4/docs/pdf-tight-spacing-2026-09-28.md +50 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/lib.rs +2 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/text_content.rs +26 -8
- docvortex-0.5.4/rust/docvortex-core/src/text_spacing.rs +118 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/snapshot.rs +67 -4
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/_compute_backend.py +1 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +48 -2
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/resources.py +26 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/text.py +9 -2
- docvortex-0.5.4/src/docvortex/analyzers/native/office/opc.py +272 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +34 -47
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +7 -2
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/resources.py +25 -8
- docvortex-0.5.4/src/docvortex/analyzers/native/pdf/inline/spacing.py +92 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/pipeline.py +17 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/spatial_text.py +14 -5
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_text_styles.py +39 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/pdf.py +3 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/detection.py +117 -9
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/render_session.py +170 -71
- docvortex-0.5.4/src/docvortex/document/pdf/text/spacing.py +122 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/public_api.py +8 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/version.py +1 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/PKG-INFO +16 -2
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/SOURCES.txt +10 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_reviewed_history.json +42 -42
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/native_pdf_table_demo_manifest.json +2 -2
- docvortex-0.5.4/tests/fixtures/pdf_tight_spacing_review_decisions.json +216 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_parity.py +1 -1
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_render_session.py +434 -37
- docvortex-0.5.4/tests/test_pdf_tight_spacing.py +217 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_title_types.py +6 -2
- docvortex-0.5.4/tests/unittest/test_guess_suffix_ooxml.py +155 -0
- docvortex-0.5.4/tests/unittest/test_office_image_alt_text.py +117 -0
- docvortex-0.5.4/tests/unittest/test_office_robust_fixtures.py +109 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/verify_native_abi.py +10 -1
- docvortex-0.5.2/src/docvortex/analyzers/native/office/opc.py +0 -38
- {docvortex-0.5.2 → docvortex-0.5.4}/Cargo.lock +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/Cargo.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/LICENSE.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/MANIFEST.in +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/README.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/demo.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ebook/epub_01.epub +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ebook/epub_02.epub +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/README.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/docx_01.doc +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/docx_01.docx +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/pptx_01.ppt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/pptx_01.pptx +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/rtf_01.rtf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/xlsx_01.xls +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ms_office_docs/xlsx_01.xlsx +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/ofd/ofd_01.ofd +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/open_office_docs/docx_01.odt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/open_office_docs/pptx_01.odp +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/open_office_docs/xlsx_01.ods +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/caibao1.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/demo1.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/demo2.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/demo3.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/demo4.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/demo6.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs/small_ocr.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/web_docs/html_01.html +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/demo/web_docs/mhtml_01.mhtml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/ARCHITECTURE.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/HTML_PROTOCOL.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/JSON_PROTOCOL.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/METADATA.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/PDF_FONTS.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/RENDER_OWNERSHIP.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/USAGE.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-manual-annotations-2026-09-15.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-round2-annotations-2026-09-15.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-rule-generalization-2026-09-15.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-spatial-layout-followup-2026-09-16.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-spatial-layout-round3-2026-09-16.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/flash-title-coverage-2026-09-16.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/pdf-native-kernel-next.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/pdf-native-kernel-p4-execution.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/pdf-native-kernel.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-acceleration.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-round7.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage11-classification-render.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage12-geometry.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage13-owned-geometry.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage14-line-metrics.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage15-table-candidates.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage16-bitmap-crops.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage17-inline-styles.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage5-render.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage6-text.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage7-content.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/rust-pdf-stage9-inline.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/docs/sdk-0.4.md +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/pyproject.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/Cargo.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/annotation_geometry.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/columns.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/dedup.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/extraction.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/geometry.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/geometry_lines.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/geometry_risk.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/geometry_runs.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/geometry_style.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/inline_pairs.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/inline_styles.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/note_index.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/pixels.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/row_geometry.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/scripts.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/spatial.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/statistics.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/table_candidates.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/table_merge.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/tables.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/text_assignment.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/text_classification.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/text_pipeline.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/src/text_snapshot.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-core/tests/contracts.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/Cargo.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/classification.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/fonts.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/lib.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/objects.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/paths.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-pdfium/src/text_colors.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/Cargo.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/classification.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/conversion.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/dedup.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/fonts.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/geometry.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/geometry_document.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/geometry_risk.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/geometry_runs.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/inline_styles.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/lib.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/pdfium.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/pixels.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/script_snapshot.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/scripts.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/spatial.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/statistics.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/table_candidates.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/table_merge.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/tables.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust/docvortex-python/src/text_pipeline.rs +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/rust-toolchain.toml +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/schemas/middle-2.0.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/schemas/model-2.0.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/setup.cfg +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/setup.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/image.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/names.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/csv.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/package.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/properties.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/anchors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/document.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/resources.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/html/selector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/mhtml/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/mhtml/converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/mhtml/resources.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/package.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/path.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/image.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/limits.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/spreadsheet/region_discovery.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/streams.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_interval_candidates.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_native_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_native_table_merge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_ordered_statistics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_script_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/annotation_bands.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/owned_styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/layout_evidence.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/continuity.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/text_roles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/compact_titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/assets/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/assets/images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/assets/store.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/cli.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/html/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/html/contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/html/materializer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/html/parser.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/html/resources.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/codecs/json.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/links.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/markup/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/markup/anchors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/markup/formula.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/markup/projector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/markup/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/mathml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/normalization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/spans.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/content.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/document.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/html.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/rules.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/table/structure.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/content/tree.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/filetypes.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/mhtml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/page_range.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/_document.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/_object_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/classification_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/classify.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/constants.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/font_runtime.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_coordinates.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_objects.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/pdfium.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/raster.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/snapshot.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/snapshot_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/_contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/_pdfium_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/dedup.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/extract.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/text/groups.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/pdf/visuals.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/properties.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/document/source.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/errors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/export/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/export/_images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/export/bundle.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/export/files.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/export/middle.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_coordinates.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_hyperlink.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_image.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_image_operations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_image_payload.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_svg_raster.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/image_encoding.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/language.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/magika.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/type_identity.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/foundation/xml_names.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/options.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/content.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/document.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/lists.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/page_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/pages.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/paragraphs.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/postprocess/visual.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/context.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/html_table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/index.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/list_items.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/common/planner.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/math.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/docx/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/epub/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/epub/assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/epub/package.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/epub/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/html/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/html/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/html/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/html/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/latex/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/latex/assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/latex/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/latex/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/latex/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/markdown/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/formula.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/inline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/original.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/contracts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/docx.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/epub.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/fragments.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/html.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/latex.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/markdown.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/pdf.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/render/structured_content.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/epub/docvortex.css +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/fonts/NOTICE +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/fonts/manifest.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/html/docvortex.css +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/html/docvortex.min.css +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/result.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/schema.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/visualization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/dependency_links.txt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/entry_points.txt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/not-zip-safe +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/requires.txt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex.egg-info/top_level.txt +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/compare_native_corpus.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/compare_pdf_revisions.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/flash_pdf.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/native_pdf_table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/pdf_corpus.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/pdf_input.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/pdf_memory.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/pdf_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/benchmarks/rust_pdf.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_layout_block_expectations.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_manual_annotations.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_manual_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_round2_annotations.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_round2_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_round3_annotations.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_round3_followup_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_round3_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_rule_generalization_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/flash_title_coverage_review_decisions.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/pdf_char_dedup.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/pdf_numeric_citations_review.json +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/fixtures/rtf/semantic.rtf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_architecture.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_benchmark_entrypoint.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_brand_protocol.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_cli_logging.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_complete_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_compute_backend.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_converter_lifecycle.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_document_envelope.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_document_metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_export_image_names.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_format_matrix.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_geometry_api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_history_geometry_tools.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_html_namespace.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_magika_runtime.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_mixed_font_script_reference.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_model_tape.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_bitmap_crops.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_classification.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_font_runtime.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_inline_styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_round3.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_round4.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_round5.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_round6.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_round7.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_statistics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_table_candidates.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_text_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_native_text_snapshot.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_analysis_api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_cpu_evidence.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_font_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_font_runtime.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_model_text_normalization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_numeric_citations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_object_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_output_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_render_pool.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_snapshot.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_source_row_merging.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdf_symbol_normalization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_pdfium_bridge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_public_export_api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_public_image_api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_public_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_refactor_raster.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_refactor_rendering.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_refactor_resources.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_release_ci_gate.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_render_ownership.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_renderer_branding.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_shared_boundaries.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_system_font_pdf_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/test_validated_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_epub_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_flash_pdf_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_image_mtef_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_legacy_doc_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_legacy_xls_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_metafile_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_mhtml_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_mtef_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_mtef_v5_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_native_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_odf_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_ofd_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/_span_test_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/connexin.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/fornax.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/frames_v1.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/frames_v2.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/k2_treap.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/mmlu_redux.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/nash_review.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/annotated/nougat.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/journal_dual_caption.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_layout/quantum_appendix_layout.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/numeric_citations_introduction.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/pdfs/test.pdf +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_backend_architecture.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_backend_block_object_regressions.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_assets.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_complex_fields.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_math.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_special_char_tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_table_context.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_docx_table_metafiles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_emfplus_integration.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_epub_backlinks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_epub_quoted_note_types.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_epub_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_bbox_grid_comparison.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_csv.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_docx_equationxml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_epub.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_html.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_image_mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_doc.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_ppt.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_xls.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_manual_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_markup_anchors.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_mhtml.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_model.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_mtef_v5.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_odf.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_ofd.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_image_mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_metafile.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_extractor.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_formulas.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_graphics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_layout_repairs.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_native_text.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_reviewed_history.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_samples.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_scripts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_semantics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_short_tails.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_text_visibility.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_titles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_round2_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_round3_annotations.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_rtf.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_rule_generalization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_shared_helpers.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_spatial_evidence.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_guess_suffix_ole2.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_html_css_build.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_html_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_html_security.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_latex_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_markdown_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_middle_json_block_models.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_middle_json_export.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_middle_json_validator.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_model_json.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_pdf_table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_ofd_assembly.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_ofd_vector_tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_office_demo_exports.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_office_demo_pages.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_office_parser_regressions.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_cjk_objects.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_cjk_style.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_classify.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_demo_links.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_document.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_formula_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_object_clipping.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_original_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_pagination.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_structured_tables.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_table_cache.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_table_round2.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_text_dedup.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_text_styles.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_title_font_plan.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_title_space.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_pdf_visualization.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_postprocess_page_blocks.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_postprocess_pages.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_postprocess_paragraphs.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_postprocess_visual.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_render_api.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_render_html_table.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_render_image_renderer.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_render_list_index_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_structured_content_render.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_svg_raster.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_table_merge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_table_merge_cell_merge.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_text_block_anchor.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_text_boundary_rules.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tests/unittest/test_text_utils.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/__init__.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/build_html_css.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/calibrate_pdf_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/capture_baseline.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/capture_platform_layout.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/compare_font_platforms.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/font_geometry.py +0 -0
- {docvortex-0.5.2 → docvortex-0.5.4}/tools/verify_native_wheel.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: docvortex
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.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
|
|
@@ -62,12 +62,14 @@ Dynamic: license-file
|
|
|
62
62
|
|
|
63
63
|
[](https://pypi.org/project/docvortex/)
|
|
64
64
|
[](https://pypi.org/project/docvortex/)
|
|
65
|
+
[](https://pepy.tech/project/docvortex)
|
|
66
|
+
[](https://pepy.tech/project/docvortex)
|
|
65
67
|
[](https://github.com/myhloli/DocVortex/actions/workflows/ci.yml)
|
|
66
68
|
[](https://github.com/myhloli/DocVortex/blob/main/LICENSE.md)
|
|
67
69
|
|
|
68
70
|
**English** · [简体中文](https://github.com/myhloli/DocVortex/blob/main/README_zh-CN.md)
|
|
69
71
|
|
|
70
|
-
[Quick start](#quick-start) · [Formats](#supported-formats) · [Documentation](#documentation)
|
|
72
|
+
[Performance](#pdf-performance) · [Quick start](#quick-start) · [Formats](#supported-formats) · [Documentation](#documentation)
|
|
71
73
|
|
|
72
74
|
</div>
|
|
73
75
|
|
|
@@ -86,6 +88,18 @@ Native parsing works without an OCR or VLM inference service. Use DocVortex dire
|
|
|
86
88
|
|
|
87
89
|

|
|
88
90
|
|
|
91
|
+
## PDF performance
|
|
92
|
+
|
|
93
|
+
**The 0.5 series brings a major boost to PDF processing with Rust acceleration: public parsing is 2.76× as fast as 0.4.25 on the tested corpus.**
|
|
94
|
+
|
|
95
|
+
| Pipeline | 0.4.25 | 0.5.2 (Rust + session) | Speedup | Time reduction | Peak RSS reduction |
|
|
96
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
97
|
+
| DocVortex public `parse()` | 42.36 s | 15.35 s | **2.76×** | **63.77%** | **33.45%** |
|
|
98
|
+
| MinerU Flash | 44.50 s | 15.78 s | **2.82×** | **64.53%** | **32.78%** |
|
|
99
|
+
| MinerU shared PDF processing | 76.28 s | 14.91 s | **5.12×** | **80.45%** | **36.25%** |
|
|
100
|
+
|
|
101
|
+
Same-machine warm-run comparison on 32 PDFs / 299 pages (31 PDFs for Flash); times are sums of per-document medians. RSS reductions are medians of per-document process-tree peak RSS reductions. MinerU results include improvements in both projects. The shared pipeline excludes model computation; excluding the extreme dense-table sample, its speedup is **2.46×**.
|
|
102
|
+
|
|
89
103
|
## Quick start
|
|
90
104
|
|
|
91
105
|
Requires **Python 3.10–3.14**.
|
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
|
|
9
9
|
[](https://pypi.org/project/docvortex/)
|
|
10
10
|
[](https://pypi.org/project/docvortex/)
|
|
11
|
+
[](https://pepy.tech/project/docvortex)
|
|
12
|
+
[](https://pepy.tech/project/docvortex)
|
|
11
13
|
[](https://github.com/myhloli/DocVortex/actions/workflows/ci.yml)
|
|
12
14
|
[](https://github.com/myhloli/DocVortex/blob/main/LICENSE.md)
|
|
13
15
|
|
|
14
16
|
**English** · [简体中文](https://github.com/myhloli/DocVortex/blob/main/README_zh-CN.md)
|
|
15
17
|
|
|
16
|
-
[Quick start](#quick-start) · [Formats](#supported-formats) · [Documentation](#documentation)
|
|
18
|
+
[Performance](#pdf-performance) · [Quick start](#quick-start) · [Formats](#supported-formats) · [Documentation](#documentation)
|
|
17
19
|
|
|
18
20
|
</div>
|
|
19
21
|
|
|
@@ -32,6 +34,18 @@ Native parsing works without an OCR or VLM inference service. Use DocVortex dire
|
|
|
32
34
|
|
|
33
35
|

|
|
34
36
|
|
|
37
|
+
## PDF performance
|
|
38
|
+
|
|
39
|
+
**The 0.5 series brings a major boost to PDF processing with Rust acceleration: public parsing is 2.76× as fast as 0.4.25 on the tested corpus.**
|
|
40
|
+
|
|
41
|
+
| Pipeline | 0.4.25 | 0.5.2 (Rust + session) | Speedup | Time reduction | Peak RSS reduction |
|
|
42
|
+
| --- | ---: | ---: | ---: | ---: | ---: |
|
|
43
|
+
| DocVortex public `parse()` | 42.36 s | 15.35 s | **2.76×** | **63.77%** | **33.45%** |
|
|
44
|
+
| MinerU Flash | 44.50 s | 15.78 s | **2.82×** | **64.53%** | **32.78%** |
|
|
45
|
+
| MinerU shared PDF processing | 76.28 s | 14.91 s | **5.12×** | **80.45%** | **36.25%** |
|
|
46
|
+
|
|
47
|
+
Same-machine warm-run comparison on 32 PDFs / 299 pages (31 PDFs for Flash); times are sums of per-document medians. RSS reductions are medians of per-document process-tree peak RSS reductions. MinerU results include improvements in both projects. The shared pipeline excludes model computation; excluding the extreme dense-table sample, its speedup is **2.46×**.
|
|
48
|
+
|
|
35
49
|
## Quick start
|
|
36
50
|
|
|
37
51
|
Requires **Python 3.10–3.14**.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# PDF 渲染任务租约与空闲文档缓存
|
|
2
|
+
|
|
3
|
+
`PDFRenderSession` 保存共享输入文件、参数和取消状态;worker 使用权只持续到一次 `render()` 完成。进程池继续受既有全局预算约束,默认最多三个 worker,池的范围是当前宿主进程。
|
|
4
|
+
|
|
5
|
+
## 调度与缓存
|
|
6
|
+
|
|
7
|
+
- 等待请求按 FIFO 获取租约,归还、取消和池关闭通过条件变量唤醒等待者。有其他请求排队时先分配一个 worker;请求不会持有部分 worker 再等待更多额度。
|
|
8
|
+
- 空闲 worker 优先按文档身份复用,其次选择无缓存的 worker,最后替换其他文档的缓存。每个 worker 最多保留一个 PDFium 文档。
|
|
9
|
+
- 渲染结果全部收到并物化为独立图片后,归还所有任务租约。空闲缓存不阻止其他文档使用进程;模型推理不持有渲染租约。
|
|
10
|
+
- 跨文档切换先发送 `close` 并确认旧输入释放,再发送 `open`。输入文件、常驻进程、原始像素传输和裁图算法继续复用。
|
|
11
|
+
|
|
12
|
+
## 关闭与异常
|
|
13
|
+
|
|
14
|
+
缓存归属和任务租约归属分别登记。A 的缓存正由 B 替换时,A 关闭会等待旧输入释放确认;它不会取消 B,也不会在确认前删除输入文件。B 已经打开自己的输入后,A 的关闭不再触碰该 worker。
|
|
15
|
+
|
|
16
|
+
任务取消、打开或切换失败、活动进程崩溃会终止对应 worker 并归还额度。空闲进程崩溃只使缓存失效,下次请求可以重建。全池关闭直接回收活动进程,不向另一个线程正在读取的活动管道插入关闭命令。
|
|
17
|
+
|
|
18
|
+
legacy 后端仍不得与活动 session 渲染并行叠加进程预算,但可以替换空闲缓存;未关闭的 session 随后可重新加载输入。等待预算的请求在真正取得额度后再次检查后端互斥状态。
|
|
19
|
+
|
|
20
|
+
## 接口与诊断
|
|
21
|
+
|
|
22
|
+
公开调用签名不变,`auto` 后端选择不变。`worker_diagnostics` 继续累计实际打开输入的记录,同文档命中缓存不增加打开次数。`close_diagnostics` 记录缓存被替换或文档关闭时的输入释放;强制进程回收记录额外包含 `worker_terminated: true`。
|
|
23
|
+
|
|
24
|
+
内部 `_workers` 仅表示该 session 当前任务的租约,正常 `render()` 返回后为空;worker 进程仍可在全局空闲池中存活。文档关闭仍确认自己的所有输入句柄已释放,然后删除临时文件。
|
|
25
|
+
|
|
26
|
+
## 回归覆盖
|
|
27
|
+
|
|
28
|
+
测试覆盖同文档缓存亲和性、五份打开文档共享三个进程、FIFO 与队首取消、等待超时、活动和空闲进程崩溃、切换失败、旧会话关闭与缓存替换竞态、新旧后端切换,以及完整页像素、旋转、透明度、裁图编码和图像所有权。
|
|
29
|
+
|
|
30
|
+
性能验证分别检查无竞争时的缓存收益、真实 PDF 输出摘要和连续处理的进程树 RSS。模型调用未参与这些渲染基准,不能将其耗时直接解释为完整解析或在线服务的吞吐。
|
|
31
|
+
|
|
32
|
+
### 本地验证(2026-09-28)
|
|
33
|
+
|
|
34
|
+
- PDF 相关回归(含真实 MinerU 五文档推理屏障):386 passed;MinerU session 与窗口专项:21 passed。五文档均能在任一解析结束前进入推理等待,此时渲染租约为零。
|
|
35
|
+
- 冻结基线为 `31654b8` 的原渲染模块,其余代码与原生扩展保持相同。32 PDF/299 页、4 页窗口,以及额外 64 页和逐页窗口,输出像素摘要全等,同文档打开次数保持一致。
|
|
36
|
+
- 32 份样本预热后各测五次,渲染 CPU 时间中位数之和为基线 4.749384 秒、候选 4.749379 秒。独立进程墙钟计时有明显噪声;一份两页财务表在初测和反序复测仍超过 5%,同渲染实现与资源路径下交替配对 31 次后为 +0.15%,不将初测或复测结果删除,也不据此声称完整解析提速。
|
|
37
|
+
- 两份真实 PDF 各连续五轮、16 页窗口、三个 worker:进程树峰值 RSS 中位数比例分别为 114.27% 和 82.67%,中位与最大峰值均通过既有 130% 门槛。进程身份稳定、输入释放通过,关闭池后渲染进程全部退出。有限回放不代表无限运行无泄漏。
|
|
38
|
+
- 原始报告保存在本地 `output/pdf/render-worker-leases-20260928/`,入口为 `summary.json`。没有运行真实模型端到端吞吐或跨平台 CI。
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# 非 CJK 原生文本词距修复(2026-09-28)
|
|
2
|
+
|
|
3
|
+
## 行为与边界
|
|
4
|
+
|
|
5
|
+
相邻普通非 CJK 字符在同一方向和基线上、源编号连续、字号与页面墨迹尺度可信时,若 tight bbox 间隙严格大于两侧较大字号的 0.25 倍,则补一个 ASCII 空格。任意一侧为 CJK、标点或符号时不新增词界;已有空白及原有补空格规则保持不变。没有行长或样本数量门槛,不使用字距统计或词典。
|
|
6
|
+
|
|
7
|
+
完整语料实际发现的反例决定了三个保守限制:
|
|
8
|
+
|
|
9
|
+
- 部分 PDF 用 1pt 字号配合文字矩阵放大;墨迹高度超过自身字号 1.5 倍时不进行新增推断。
|
|
10
|
+
- 连续数字中的窄字形(例如 Arial 的 `11`)有自然大留白,数字内部不新增空格。
|
|
11
|
+
- 等宽字体中的 `i` 等窄字形不能仅靠墨迹留白判词界,固定宽度标志或通用等宽字体元数据命中时跳过。
|
|
12
|
+
|
|
13
|
+
同时排除显著字号变化、上下标位移、不可靠方向和跨行几何。这些边界有意牺牲召回率,避免误拆正常文本。
|
|
14
|
+
|
|
15
|
+
## 接入与兼容
|
|
16
|
+
|
|
17
|
+
- Flash 从视觉行建立紧凑词界证据,在自然语言块归属和分类完成后、链接及样式物化前应用;代码、公式与原始字符不改写。复用现有去行末连字符的对齐规则。
|
|
18
|
+
- Rust 快照直接批量返回源词界编号;Python 回退使用同一判据。不会为补空格额外持有整页字符副本。
|
|
19
|
+
- MinerU Basic/Standard/Advanced 的 TXT 字符回填、Rust span 内容物化和旋转 line/span 回填均接入。实际代码区域的禁用标记会穿过整页虚拟文本框。
|
|
20
|
+
- Flash/Basic/Standard 的原生表格在单元格内部物化空格;表格恢复失败后的文本投影也接入。通用代码空间投影、OCR 和模型内容保持原行为。
|
|
21
|
+
- 公共 parse 参数及 MiddleJson schema 不变。新增 Rust span 参数可省略,旧宿主省略参数时保持原行为;内部 native protocol 升至 23,防止混用旧扩展。
|
|
22
|
+
- DocVortex 本地版本为 0.5.4;MinerU 最低依赖同步为 `docvortex>=0.5.4,<1`。本次未提交、推送或发布。
|
|
23
|
+
|
|
24
|
+
## 质量验证
|
|
25
|
+
|
|
26
|
+
输入 `demo/pdfs/中文论文2.pdf`,SHA256 为 `937cfb51e9e8abc6b3a2d8c46d38003cd2ad795a0692eab3f9e92ac604fcc9ad`。
|
|
27
|
+
|
|
28
|
+
完整重放 41 份 PDF、457 页:40 份输出完全不变。目标论文的 21 页、187 个块新增 2,095 个空格;非空格字符、块数量、类型、顺序和坐标保持不变。原件全部 23 页已打开审阅,包括两个无变化页;第 2 页表格的 `ChatbotArena` 修复为 `Chatbot Arena`。
|
|
29
|
+
|
|
30
|
+
Python/Rust 的 41 份完整 ModelJson/MiddleJson 输出全部一致。四档均通过公共 `mineru.parser.parse()` 完整解析 23 页并导出 ModelJson、MiddleJson、Markdown、HTML 和素材;Basic/Standard/Advanced 的原生内容调用计数证明实际进入 Rust 路径。四档均恢复 `Large Language Models`、`Natural Language Processing`、`School of Computer Science`、`Pre-training of deep bidirectional transformers` 和参考文献会议名称,且不再出现 `LargeLanguageModels`。四档 HTML 已在本地浏览器检查。
|
|
31
|
+
|
|
32
|
+
测试日志保存在本次运行目录:
|
|
33
|
+
|
|
34
|
+
- `docvortex-final.log`:2,593 项通过,3 条既有 Office 依赖警告。
|
|
35
|
+
- `mineru-final.log`:172 项通过。
|
|
36
|
+
- `python-final.log`:68 项通过,3 个仅用于 Rust 的测试按预期跳过。
|
|
37
|
+
- `final-focused.log`:220 项通过。
|
|
38
|
+
- `final-boundaries-02.log`:128 项通过,含代码空间投影隔离。
|
|
39
|
+
- `rust-final.log`:15 项 Rust 测试通过。
|
|
40
|
+
- Ruff 与两个仓库的 `git diff --check` 通过。
|
|
41
|
+
|
|
42
|
+
仅更新 `flash_reviewed_history.json` 中目标论文的 21 页内容指纹,以及 `native_pdf_table_demo_manifest.json` 中一处单元格文字和对应 HTML 指纹。逐页裁决见 `tests/fixtures/pdf_tight_spacing_review_decisions.json`;其余基线保留。
|
|
43
|
+
|
|
44
|
+
## 性能与证据
|
|
45
|
+
|
|
46
|
+
冻结旧源码和扩展,在没有模型推理并发的阶段,以独立进程逐份交错测量基线与候选,各预热后计时 3 次。41 份语料中位耗时之和增加约 1.31%;目标论文由 1.6792s 到 1.7251s(+2.74%),RSS +0.14%。峰值 RSS 最大增幅约 0.80%。
|
|
47
|
+
|
|
48
|
+
一份约 42ms 的短文档首次测得 +9.90%;反转先后顺序、各测 7 次后为 41.656ms → 43.727ms(+4.97%),没有复现持续超过 5% 的退化。模型档位单次全文耗时受模型缓存和推理影响,不用来证明原生规则性能。
|
|
49
|
+
|
|
50
|
+
完整日志、源码快照、逐页对比和四档输出位于 `output/pdf/tight-spacing-20260928/`。主要证据:`final-tiers/`、`final-corpus-diff.json`、`review-final/`、`python-corpus/report.json`、`performance/report.json`、`performance-retest/report.json`。拒绝的早期候选保留,未作为最终输出交付。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
//! 不访问 Python 对象或 PDFium 的单线程批量计算内核。
|
|
2
2
|
|
|
3
|
-
pub const PROTOCOL_VERSION: u32 =
|
|
3
|
+
pub const PROTOCOL_VERSION: u32 = 23;
|
|
4
4
|
pub mod columns;
|
|
5
5
|
pub mod note_index;
|
|
6
6
|
pub mod row_geometry;
|
|
@@ -47,6 +47,7 @@ pub mod text_pipeline;
|
|
|
47
47
|
pub mod text_assignment;
|
|
48
48
|
pub mod text_content;
|
|
49
49
|
pub mod text_snapshot;
|
|
50
|
+
pub mod text_spacing;
|
|
50
51
|
|
|
51
52
|
pub mod geometry_risk;
|
|
52
53
|
pub mod geometry_runs;
|
|
@@ -85,6 +85,9 @@ fn clean(text: &str) -> String {
|
|
|
85
85
|
|
|
86
86
|
/// 连续执行 PUA 信号、重叠附加符合成、词间空格及正文组装;空组保留调用方原文本。
|
|
87
87
|
pub struct Rules<'a> {
|
|
88
|
+
pub ordinary: &'a HashSet<char>,
|
|
89
|
+
pub decimals: &'a HashSet<char>,
|
|
90
|
+
pub tight_spacing: &'a [bool],
|
|
88
91
|
pub modifiers: &'a HashMap<String, String>,
|
|
89
92
|
pub threshold: f64,
|
|
90
93
|
pub compositions: &'a HashMap<(String, String), String>,
|
|
@@ -96,6 +99,9 @@ pub struct Rules<'a> {
|
|
|
96
99
|
/// 使用本次调用固定的字符规则构造所有片段,避免重新读取可变 Python 配置。
|
|
97
100
|
pub fn build(data: &TextSnapshot, groups: &[Vec<usize>], rules: &Rules<'_>) -> Vec<Content> {
|
|
98
101
|
let Rules {
|
|
102
|
+
ordinary,
|
|
103
|
+
decimals,
|
|
104
|
+
tight_spacing,
|
|
99
105
|
modifiers,
|
|
100
106
|
threshold,
|
|
101
107
|
compositions,
|
|
@@ -105,7 +111,8 @@ pub fn build(data: &TextSnapshot, groups: &[Vec<usize>], rules: &Rules<'_>) -> V
|
|
|
105
111
|
} = rules;
|
|
106
112
|
groups
|
|
107
113
|
.iter()
|
|
108
|
-
.
|
|
114
|
+
.enumerate()
|
|
115
|
+
.map(|(group_index, group)| {
|
|
109
116
|
let mut result = Content {
|
|
110
117
|
text: None,
|
|
111
118
|
private_count: 0,
|
|
@@ -133,7 +140,7 @@ pub fn build(data: &TextSnapshot, groups: &[Vec<usize>], rules: &Rules<'_>) -> V
|
|
|
133
140
|
return result;
|
|
134
141
|
}
|
|
135
142
|
let members = ordered(data, group);
|
|
136
|
-
let mut chars: Vec<(&str, Box4)> = Vec::with_capacity(members.len());
|
|
143
|
+
let mut chars: Vec<(&str, Box4, usize)> = Vec::with_capacity(members.len());
|
|
137
144
|
let mut cursor = 0;
|
|
138
145
|
while cursor < members.len() {
|
|
139
146
|
if cursor + 1 < members.len() {
|
|
@@ -148,17 +155,17 @@ pub fn build(data: &TextSnapshot, groups: &[Vec<usize>], rules: &Rules<'_>) -> V
|
|
|
148
155
|
let b = &data.chars[modifier];
|
|
149
156
|
if let Some(composed) = compositions.get(&(a.text.clone(), b.text.clone()))
|
|
150
157
|
{
|
|
151
|
-
chars.push((composed, a.bbox));
|
|
158
|
+
chars.push((composed, a.bbox, base));
|
|
152
159
|
cursor += 2;
|
|
153
160
|
continue;
|
|
154
161
|
}
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
164
|
let ch = &data.chars[members[cursor]];
|
|
158
|
-
chars.push((&ch.text, ch.bbox));
|
|
165
|
+
chars.push((&ch.text, ch.bbox, members[cursor]));
|
|
159
166
|
cursor += 1;
|
|
160
167
|
}
|
|
161
|
-
let mut widths: Vec<_> = chars.iter().map(|(_, b)| b[2] - b[0]).collect();
|
|
168
|
+
let mut widths: Vec<_> = chars.iter().map(|(_, b, _)| b[2] - b[0]).collect();
|
|
162
169
|
widths.sort_by(|a, b| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal));
|
|
163
170
|
let median = if widths.len() % 2 == 1 {
|
|
164
171
|
widths[widths.len() / 2]
|
|
@@ -166,13 +173,24 @@ pub fn build(data: &TextSnapshot, groups: &[Vec<usize>], rules: &Rules<'_>) -> V
|
|
|
166
173
|
(widths[widths.len() / 2 - 1] + widths[widths.len() / 2]) / 2.0
|
|
167
174
|
};
|
|
168
175
|
let mut text = String::new();
|
|
169
|
-
for (index, &(value, bbox)) in chars.iter().enumerate() {
|
|
176
|
+
for (index, &(value, bbox, source)) in chars.iter().enumerate() {
|
|
170
177
|
if breaks.contains(value) {
|
|
171
178
|
continue;
|
|
172
179
|
}
|
|
173
180
|
text.push_str(value);
|
|
174
|
-
if let Some(&(next, next_box)) = chars.get(index + 1) {
|
|
175
|
-
if next_box[0] - bbox[2] > median * 0.25
|
|
181
|
+
if let Some(&(next, next_box, next_source)) = chars.get(index + 1) {
|
|
182
|
+
if (next_box[0] - bbox[2] > median * 0.25
|
|
183
|
+
|| (tight_spacing.get(group_index).copied().unwrap_or(false)
|
|
184
|
+
&& crate::text_spacing::needs_space(
|
|
185
|
+
data,
|
|
186
|
+
source,
|
|
187
|
+
next_source,
|
|
188
|
+
ordinary,
|
|
189
|
+
decimals,
|
|
190
|
+
)))
|
|
191
|
+
&& value != " "
|
|
192
|
+
&& next != " "
|
|
193
|
+
{
|
|
176
194
|
text.push(' ');
|
|
177
195
|
}
|
|
178
196
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
//! 与 Python 参考实现相同的相邻非 CJK 字形词界判定。
|
|
2
|
+
use crate::{geometry::Box4, text_snapshot::TextSnapshot};
|
|
3
|
+
use std::collections::HashSet;
|
|
4
|
+
|
|
5
|
+
/// 排除汉字扩展、假名、韩文及兼容字形,不以所在整行的语言决定词界。
|
|
6
|
+
pub fn is_cjk(ch: char) -> bool {
|
|
7
|
+
matches!(ch as u32,
|
|
8
|
+
0x1100..=0x11ff | 0x2e80..=0xa4cf | 0xa960..=0xa97f | 0xac00..=0xd7ff |
|
|
9
|
+
0xf900..=0xfaff | 0xff66..=0xff9f | 0x1aff0..=0x1b16f | 0x20000..=0x323af)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// 墨迹框只转换坐标轴;相邻间隙与页面原点平移无关。
|
|
13
|
+
fn local(b: Box4, angle: i32) -> Box4 {
|
|
14
|
+
match angle {
|
|
15
|
+
90 => [b[1], -b[2], b[3], -b[0]],
|
|
16
|
+
180 => [-b[2], -b[3], -b[0], -b[1]],
|
|
17
|
+
270 => [-b[3], b[0], -b[1], b[2]],
|
|
18
|
+
_ => b,
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// 只接受解释器确认的普通单字形,避免两端标点或连字展开改变语义。
|
|
23
|
+
fn ordinary(text: &str, letters: &HashSet<char>) -> bool {
|
|
24
|
+
let mut chars = text.chars();
|
|
25
|
+
let Some(ch) = chars.next() else { return false };
|
|
26
|
+
chars.next().is_none() && !is_cjk(ch) && (ch.is_ascii_alphanumeric() || letters.contains(&ch))
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// 使用真实源编号、方向和基线保护,只为可靠的大墨迹间隙返回一个词界。
|
|
30
|
+
pub fn needs_space(
|
|
31
|
+
data: &TextSnapshot,
|
|
32
|
+
first: usize,
|
|
33
|
+
second: usize,
|
|
34
|
+
letters: &HashSet<char>,
|
|
35
|
+
decimals: &HashSet<char>,
|
|
36
|
+
) -> bool {
|
|
37
|
+
let a = &data.chars[first];
|
|
38
|
+
let b = &data.chars[second];
|
|
39
|
+
if !ordinary(&a.text, letters)
|
|
40
|
+
|| !ordinary(&b.text, letters)
|
|
41
|
+
|| a.index.checked_add(1) != Some(b.index)
|
|
42
|
+
{
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if a.text
|
|
46
|
+
.chars()
|
|
47
|
+
.all(|c| c.is_ascii_digit() || decimals.contains(&c))
|
|
48
|
+
&& b.text
|
|
49
|
+
.chars()
|
|
50
|
+
.all(|c| c.is_ascii_digit() || decimals.contains(&c))
|
|
51
|
+
{
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
for font in [&data.fonts[a.font], &data.fonts[b.font]] {
|
|
55
|
+
let name = font.name.to_lowercase();
|
|
56
|
+
if font.flags & 1 != 0
|
|
57
|
+
|| [
|
|
58
|
+
"mono",
|
|
59
|
+
"courier",
|
|
60
|
+
"consolas",
|
|
61
|
+
"menlo",
|
|
62
|
+
"typewriter",
|
|
63
|
+
"fixed",
|
|
64
|
+
]
|
|
65
|
+
.iter()
|
|
66
|
+
.any(|hint| name.contains(hint))
|
|
67
|
+
{
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let ls = data.fonts[a.font].size;
|
|
72
|
+
let rs = data.fonts[b.font].size;
|
|
73
|
+
let em = ls.max(rs);
|
|
74
|
+
if !ls.is_finite() || !rs.is_finite() || ls.min(rs) <= 0.0 || ls.min(rs) < 0.8 * em {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if !a.writing_angle.is_finite() || !b.writing_angle.is_finite() {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
let degrees = a.writing_angle.to_degrees().rem_euclid(360.0);
|
|
81
|
+
let angle = ((degrees / 90.0).round_ties_even() as i32 * 90) % 360;
|
|
82
|
+
if ((degrees - angle as f64 + 180.0).rem_euclid(360.0) - 180.0).abs() > 0.1
|
|
83
|
+
|| ((b.writing_angle.to_degrees() - angle as f64 + 180.0).rem_euclid(360.0) - 180.0).abs()
|
|
84
|
+
> 0.1
|
|
85
|
+
{
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
let (Some(ab), Some(bb)) = (a.tight, b.tight) else {
|
|
89
|
+
return false;
|
|
90
|
+
};
|
|
91
|
+
if ab.iter().chain(bb.iter()).any(|v| !v.is_finite()) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
let ab = local(ab, angle);
|
|
95
|
+
let bb = local(bb, angle);
|
|
96
|
+
if ab[2] <= ab[0]
|
|
97
|
+
|| bb[2] <= bb[0]
|
|
98
|
+
|| ab[3] <= ab[1]
|
|
99
|
+
|| bb[3] <= bb[1]
|
|
100
|
+
|| ab[3] - ab[1] > 1.5 * ls
|
|
101
|
+
|| bb[3] - bb[1] > 1.5 * rs
|
|
102
|
+
|| bb[0] - ab[2] <= 0.25 * em
|
|
103
|
+
|| ab[3].min(bb[3]) - ab[1].max(bb[1]) < 0.5 * (ab[3] - ab[1]).min(bb[3] - bb[1])
|
|
104
|
+
{
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
if let (Some(ao), Some(bo)) = (a.origin, b.origin) {
|
|
108
|
+
let axis = usize::from(angle != 90 && angle != 270);
|
|
109
|
+
if ao.iter().chain(bo.iter()).any(|v| !v.is_finite())
|
|
110
|
+
|| (ao[axis] - bo[axis]).abs() > 0.15 * em
|
|
111
|
+
{
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
} else if (ab[3] - bb[3]).abs() > 0.15 * em {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
true
|
|
118
|
+
}
|
|
@@ -620,6 +620,7 @@ impl NativeTextSnapshot {
|
|
|
620
620
|
Ok(Some(result))
|
|
621
621
|
}
|
|
622
622
|
/// 正文已有共享上下标侧车时,字符归属及内容构造连续完成,仅输出每个 span 的文本和 PUA 计数。
|
|
623
|
+
#[pyo3(signature = (span_bboxes, median_height, stop_flags, start_flags, height_ratio, break_flags, modifiers, overlap_threshold, private_range, tight_spacing=None))]
|
|
623
624
|
fn prepare_span_texts<'py>(
|
|
624
625
|
&self,
|
|
625
626
|
py: Python<'py>,
|
|
@@ -632,6 +633,7 @@ impl NativeTextSnapshot {
|
|
|
632
633
|
modifiers: HashMap<String, String>,
|
|
633
634
|
overlap_threshold: f64,
|
|
634
635
|
private_range: (u32, u32),
|
|
636
|
+
tight_spacing: Option<Vec<bool>>,
|
|
635
637
|
) -> PyResult<Option<Bound<'py, PyList>>> {
|
|
636
638
|
if !overlap_threshold.is_finite()
|
|
637
639
|
|| self
|
|
@@ -643,6 +645,13 @@ impl NativeTextSnapshot {
|
|
|
643
645
|
return Ok(None);
|
|
644
646
|
}
|
|
645
647
|
let count = span_bboxes.len();
|
|
648
|
+
// 旧宿主没有代码区域掩码,省略新增参数时保持历史文本组装行为。
|
|
649
|
+
let tight_spacing = tight_spacing.unwrap_or_else(|| vec![false; count]);
|
|
650
|
+
if tight_spacing.len() != count {
|
|
651
|
+
return Err(pyo3::exceptions::PyValueError::new_err(
|
|
652
|
+
"Tight spacing mask must match span count",
|
|
653
|
+
));
|
|
654
|
+
}
|
|
646
655
|
let Some(assigned) = self.assign_spans(
|
|
647
656
|
py,
|
|
648
657
|
span_bboxes,
|
|
@@ -660,16 +669,29 @@ impl NativeTextSnapshot {
|
|
|
660
669
|
let category = unicode.getattr("category")?;
|
|
661
670
|
let normalize = unicode.getattr("normalize")?;
|
|
662
671
|
let mut spaces = HashSet::new();
|
|
672
|
+
let mut ordinary = HashSet::new();
|
|
673
|
+
let mut decimals = HashSet::new();
|
|
663
674
|
let mut seen_chars = HashSet::new();
|
|
664
675
|
for ch in &self.data.chars {
|
|
665
676
|
for value in ch.text.chars() {
|
|
666
|
-
if seen_chars.insert(value)
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
677
|
+
if !seen_chars.insert(value) {
|
|
678
|
+
continue;
|
|
679
|
+
}
|
|
680
|
+
if pyo3::types::PyString::new(py, &value.to_string())
|
|
681
|
+
.call_method0("isspace")?
|
|
682
|
+
.extract::<bool>()?
|
|
670
683
|
{
|
|
671
684
|
spaces.insert(value);
|
|
672
685
|
}
|
|
686
|
+
if !value.is_ascii() && !docvortex_core::text_spacing::is_cjk(value) {
|
|
687
|
+
let kind: String = category.call1((value.to_string(),))?.extract()?;
|
|
688
|
+
if kind.starts_with('L') || kind == "Nd" {
|
|
689
|
+
ordinary.insert(value);
|
|
690
|
+
}
|
|
691
|
+
if kind == "Nd" {
|
|
692
|
+
decimals.insert(value);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
673
695
|
}
|
|
674
696
|
}
|
|
675
697
|
let mut compositions = HashMap::new();
|
|
@@ -709,6 +731,9 @@ impl NativeTextSnapshot {
|
|
|
709
731
|
&self.data,
|
|
710
732
|
&groups,
|
|
711
733
|
&text_content::Rules {
|
|
734
|
+
ordinary: &ordinary,
|
|
735
|
+
decimals: &decimals,
|
|
736
|
+
tight_spacing: &tight_spacing,
|
|
712
737
|
modifiers: &modifiers,
|
|
713
738
|
threshold: overlap_threshold,
|
|
714
739
|
compositions: &compositions,
|
|
@@ -734,6 +759,44 @@ impl NativeTextSnapshot {
|
|
|
734
759
|
SPAN_CONTENT_CALLS.fetch_add(1, Ordering::Relaxed);
|
|
735
760
|
Ok(Some(output))
|
|
736
761
|
}
|
|
762
|
+
/// 在自有字符上计算可靠词界,仅返回源编号,避免 Flash 逐字符重复跨语言判定。
|
|
763
|
+
fn tight_space_indices(&self, py: Python<'_>) -> PyResult<Vec<usize>> {
|
|
764
|
+
let category = py.import("unicodedata")?.getattr("category")?;
|
|
765
|
+
let mut ordinary = HashSet::new();
|
|
766
|
+
let mut decimals = HashSet::new();
|
|
767
|
+
let mut seen = HashSet::new();
|
|
768
|
+
for ch in &self.data.chars {
|
|
769
|
+
for value in ch.text.chars() {
|
|
770
|
+
if !value.is_ascii()
|
|
771
|
+
&& !docvortex_core::text_spacing::is_cjk(value)
|
|
772
|
+
&& seen.insert(value)
|
|
773
|
+
{
|
|
774
|
+
let kind: String = category.call1((value.to_string(),))?.extract()?;
|
|
775
|
+
if kind.starts_with('L') || kind == "Nd" {
|
|
776
|
+
ordinary.insert(value);
|
|
777
|
+
}
|
|
778
|
+
if kind == "Nd" {
|
|
779
|
+
decimals.insert(value);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
Ok(py.detach(|| {
|
|
785
|
+
(1..self.data.chars.len())
|
|
786
|
+
.filter(|&index| {
|
|
787
|
+
docvortex_core::text_spacing::needs_space(
|
|
788
|
+
&self.data,
|
|
789
|
+
index - 1,
|
|
790
|
+
index,
|
|
791
|
+
&ordinary,
|
|
792
|
+
&decimals,
|
|
793
|
+
)
|
|
794
|
+
})
|
|
795
|
+
.map(|index| self.data.chars[index].index)
|
|
796
|
+
.collect()
|
|
797
|
+
}))
|
|
798
|
+
}
|
|
799
|
+
|
|
737
800
|
/// 为新鲜同源页面证据准备独立上下标记录,后续批次只传整数成员索引。
|
|
738
801
|
fn prepare_script_evidence(
|
|
739
802
|
&self,
|
{docvortex-0.5.2 → docvortex-0.5.4}/src/docvortex/analyzers/native/office/docx/package_normalizer.py
RENAMED
|
@@ -7,7 +7,16 @@ from zipfile import BadZipFile, ZipFile, ZipInfo
|
|
|
7
7
|
from loguru import logger
|
|
8
8
|
from lxml import etree
|
|
9
9
|
|
|
10
|
-
from ..opc import
|
|
10
|
+
from ..opc import (
|
|
11
|
+
CONTENT_TYPES_MEMBER,
|
|
12
|
+
STRICT_OOXML_COMMON_REPLACEMENTS,
|
|
13
|
+
STRICT_WORDPROCESSINGML_NS,
|
|
14
|
+
WORDPROCESSINGML_NS,
|
|
15
|
+
relationship_source_base_dir,
|
|
16
|
+
repair_content_type_overrides,
|
|
17
|
+
translate_strict_ooxml_uris,
|
|
18
|
+
write_zip_package,
|
|
19
|
+
)
|
|
11
20
|
|
|
12
21
|
|
|
13
22
|
PACKAGE_RELATIONSHIPS_NS = "http://schemas.openxmlformats.org/package/2006/relationships"
|
|
@@ -15,6 +24,27 @@ RELATIONSHIP_TAG = f"{{{PACKAGE_RELATIONSHIPS_NS}}}Relationship"
|
|
|
15
24
|
ZIP_MEMBER_READ_ERRORS = (BadZipFile, RuntimeError, NotImplementedError, zlib.error)
|
|
16
25
|
DOCX_EMBEDDED_OFFICE_PREFIX = "word/embeddings/"
|
|
17
26
|
|
|
27
|
+
STRICT_DOCX_REPLACEMENTS = STRICT_OOXML_COMMON_REPLACEMENTS + (
|
|
28
|
+
(
|
|
29
|
+
STRICT_WORDPROCESSINGML_NS.encode("utf-8"),
|
|
30
|
+
WORDPROCESSINGML_NS.encode("utf-8"),
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# 关系类型尾段到 part 内容类型的映射,用于按关系图补全 [Content_Types].xml Override。
|
|
35
|
+
DOCX_REL_CONTENT_TYPES = {
|
|
36
|
+
"officeDocument": "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
|
|
37
|
+
"styles": "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml",
|
|
38
|
+
"numbering": "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml",
|
|
39
|
+
"footnotes": "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
|
|
40
|
+
"endnotes": "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml",
|
|
41
|
+
"comments": "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml",
|
|
42
|
+
"settings": "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml",
|
|
43
|
+
"webSettings": "application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml",
|
|
44
|
+
"fontTable": "application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml",
|
|
45
|
+
"theme": "application/vnd.openxmlformats-officedocument.theme+xml",
|
|
46
|
+
}
|
|
47
|
+
|
|
18
48
|
|
|
19
49
|
def normalize_docx_package(file_bytes: bytes) -> bytes:
|
|
20
50
|
"""在进入 python-docx 前修复 DOCX 包级容错问题。"""
|
|
@@ -41,10 +71,15 @@ def normalize_docx_package(file_bytes: bytes) -> bytes:
|
|
|
41
71
|
rewritten_members: list[tuple[ZipInfo, bytes]] = []
|
|
42
72
|
for info, member_data in loaded_members:
|
|
43
73
|
normalized_data = member_data
|
|
74
|
+
if info.filename.endswith(".xml") or info.filename.endswith(".rels"):
|
|
75
|
+
# ISO Strict 命名空间与关系类型统一改写为 Transitional,python-docx 才能识别。
|
|
76
|
+
normalized_data = translate_strict_ooxml_uris(normalized_data, STRICT_DOCX_REPLACEMENTS)
|
|
77
|
+
if normalized_data != member_data:
|
|
78
|
+
changed = True
|
|
44
79
|
if info.filename.endswith(".rels"):
|
|
45
80
|
normalized_data = _remove_missing_internal_relationships(
|
|
46
81
|
info.filename,
|
|
47
|
-
|
|
82
|
+
normalized_data,
|
|
48
83
|
package_members,
|
|
49
84
|
skipped_members,
|
|
50
85
|
)
|
|
@@ -52,6 +87,17 @@ def normalize_docx_package(file_bytes: bytes) -> bytes:
|
|
|
52
87
|
changed = True
|
|
53
88
|
rewritten_members.append((info, normalized_data))
|
|
54
89
|
|
|
90
|
+
repaired_content_types = repair_content_type_overrides(
|
|
91
|
+
{info.filename: member_data for info, member_data in rewritten_members},
|
|
92
|
+
DOCX_REL_CONTENT_TYPES,
|
|
93
|
+
)
|
|
94
|
+
if repaired_content_types is not None:
|
|
95
|
+
rewritten_members = [
|
|
96
|
+
(info, repaired_content_types if info.filename == CONTENT_TYPES_MEMBER else member_data)
|
|
97
|
+
for info, member_data in rewritten_members
|
|
98
|
+
]
|
|
99
|
+
changed = True
|
|
100
|
+
|
|
55
101
|
if not changed:
|
|
56
102
|
return file_bytes
|
|
57
103
|
|
|
@@ -286,8 +286,34 @@ class _DocxResources:
|
|
|
286
286
|
"type": BlockType.IMAGE,
|
|
287
287
|
"image_base64": img_base64,
|
|
288
288
|
}
|
|
289
|
+
alt_text = self._docx_image_alt_text(image)
|
|
290
|
+
if alt_text:
|
|
291
|
+
image_block["content"] = alt_text
|
|
289
292
|
self.cur_page.append(image_block)
|
|
290
293
|
|
|
294
|
+
@staticmethod
|
|
295
|
+
def _docx_image_alt_text(image: Any) -> str:
|
|
296
|
+
"""读取 DrawingML wp:docPr 的 descr 或 VML v:shape 的 alt 替代文本。"""
|
|
297
|
+
element = image
|
|
298
|
+
while element is not None:
|
|
299
|
+
tag = str(getattr(element, "tag", ""))
|
|
300
|
+
local_name = tag.rsplit("}", 1)[-1]
|
|
301
|
+
if local_name in {"inline", "anchor"}:
|
|
302
|
+
for child in element:
|
|
303
|
+
child_tag = str(getattr(child, "tag", ""))
|
|
304
|
+
if child_tag.rsplit("}", 1)[-1] == "docPr":
|
|
305
|
+
descr = (child.get("descr") or "").strip()
|
|
306
|
+
if descr:
|
|
307
|
+
return descr
|
|
308
|
+
return ""
|
|
309
|
+
if local_name == "shape" and "urn:schemas-microsoft-com:vml" in tag:
|
|
310
|
+
alt = (element.get("alt") or "").strip()
|
|
311
|
+
if alt:
|
|
312
|
+
return alt
|
|
313
|
+
return ""
|
|
314
|
+
element = element.getparent()
|
|
315
|
+
return ""
|
|
316
|
+
|
|
291
317
|
def _handle_drawingml(self, elements: list[BaseOxmlElement]):
|
|
292
318
|
"""
|
|
293
319
|
处理 DrawingML 元素,目前先处理 chart 元素。
|