docvortex 0.4.4__tar.gz → 0.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. {docvortex-0.4.4/src/docvortex.egg-info → docvortex-0.4.6}/PKG-INFO +5 -5
  2. {docvortex-0.4.4 → docvortex-0.4.6}/README.md +3 -3
  3. {docvortex-0.4.4 → docvortex-0.4.6}/docs/JSON_PROTOCOL.md +3 -2
  4. {docvortex-0.4.4 → docvortex-0.4.6}/docs/USAGE.md +19 -4
  5. {docvortex-0.4.4 → docvortex-0.4.6}/pyproject.toml +1 -1
  6. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_script_geometry.py +92 -24
  7. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +8 -0
  8. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +11 -3
  9. docvortex-0.4.6/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +135 -0
  10. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +25 -14
  11. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +121 -38
  12. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +15 -1
  13. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/formulas.py +123 -0
  14. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/graphics.py +18 -5
  15. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/detection.py +7 -0
  16. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/scripts.py +2 -2
  17. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_merging.py +27 -2
  18. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/models.py +1 -0
  19. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/pipeline.py +8 -1
  20. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_geometry.py +8 -2
  21. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_text_styles.py +5 -1
  22. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +11 -0
  23. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +16 -1
  24. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/_document.py +0 -34
  25. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_contracts.py +0 -12
  26. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_objects.py +11 -1
  27. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_text_geometry.py +4 -158
  28. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/_contracts.py +4 -0
  29. docvortex-0.4.6/src/docvortex/document/pdf/text/dedup.py +475 -0
  30. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/extract.py +81 -48
  31. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -1
  32. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula.py +128 -30
  33. docvortex-0.4.6/src/docvortex/render/_internal/pdf/formula_layout.py +98 -0
  34. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/inline.py +18 -1
  35. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/original.py +105 -5
  36. docvortex-0.4.6/src/docvortex/render/_internal/pdf/paragraph.py +123 -0
  37. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/renderer.py +41 -7
  38. docvortex-0.4.6/src/docvortex/render/_internal/pdf/table.py +485 -0
  39. docvortex-0.4.6/src/docvortex/render/_internal/pdf/table_content.py +251 -0
  40. docvortex-0.4.6/src/docvortex/render/_internal/pdf/table_layout.py +319 -0
  41. docvortex-0.4.6/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +410 -0
  42. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/version.py +1 -1
  43. {docvortex-0.4.4 → docvortex-0.4.6/src/docvortex.egg-info}/PKG-INFO +5 -5
  44. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/SOURCES.txt +22 -0
  45. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/requires.txt +1 -1
  46. docvortex-0.4.6/tests/benchmarks/native_pdf_table.py +155 -0
  47. docvortex-0.4.6/tests/benchmarks/pdf_render.py +280 -0
  48. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/flash_layout_geometry_manifest.json +1 -1
  49. docvortex-0.4.6/tests/fixtures/pdf_char_dedup.json +2142 -0
  50. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_benchmark_entrypoint.py +28 -0
  51. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
  52. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
  53. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
  54. docvortex-0.4.6/tests/unittest/test_flash_pdf_layout_repairs.py +279 -0
  55. docvortex-0.4.6/tests/unittest/test_native_table_performance_equivalence.py +211 -0
  56. docvortex-0.4.6/tests/unittest/test_pdf_cjk_style.py +178 -0
  57. docvortex-0.4.6/tests/unittest/test_pdf_formula_layout.py +272 -0
  58. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_original_layout.py +7 -6
  59. docvortex-0.4.6/tests/unittest/test_pdf_paragraph_cache.py +107 -0
  60. docvortex-0.4.6/tests/unittest/test_pdf_structured_tables.py +367 -0
  61. docvortex-0.4.6/tests/unittest/test_pdf_table_cache.py +77 -0
  62. docvortex-0.4.6/tests/unittest/test_pdf_table_round2.py +305 -0
  63. docvortex-0.4.6/tests/unittest/test_pdf_text_dedup.py +309 -0
  64. docvortex-0.4.4/src/docvortex/render/_internal/pdf/table.py +0 -293
  65. {docvortex-0.4.4 → docvortex-0.4.6}/LICENSE.md +0 -0
  66. {docvortex-0.4.4 → docvortex-0.4.6}/MANIFEST.in +0 -0
  67. {docvortex-0.4.4 → docvortex-0.4.6}/demo/README.md +0 -0
  68. {docvortex-0.4.4 → docvortex-0.4.6}/demo/demo.py +0 -0
  69. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/README.md +0 -0
  70. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/docx_01.doc +0 -0
  71. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/docx_01.docx +0 -0
  72. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/pptx_01.ppt +0 -0
  73. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/pptx_01.pptx +0 -0
  74. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/rtf_01.rtf +0 -0
  75. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xls +0 -0
  76. {docvortex-0.4.4 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xlsx +0 -0
  77. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  78. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  79. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/caibao1.pdf +0 -0
  80. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo1.pdf +0 -0
  81. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo2.pdf +0 -0
  82. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo3.pdf +0 -0
  83. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo4.pdf +0 -0
  84. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/demo6.pdf +0 -0
  85. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  86. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  87. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  88. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  89. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs/small_ocr.pdf +0 -0
  90. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  91. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  92. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  93. {docvortex-0.4.4 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  94. {docvortex-0.4.4 → docvortex-0.4.6}/docs/HTML_PROTOCOL.md +0 -0
  95. {docvortex-0.4.4 → docvortex-0.4.6}/docs/METADATA.md +0 -0
  96. {docvortex-0.4.4 → docvortex-0.4.6}/docs/PDF_FONTS.md +0 -0
  97. {docvortex-0.4.4 → docvortex-0.4.6}/docs/RENDER_OWNERSHIP.md +0 -0
  98. {docvortex-0.4.4 → docvortex-0.4.6}/docs/sdk-0.4.md +0 -0
  99. {docvortex-0.4.4 → docvortex-0.4.6}/schemas/middle-2.0.json +0 -0
  100. {docvortex-0.4.4 → docvortex-0.4.6}/schemas/model-2.0.json +0 -0
  101. {docvortex-0.4.4 → docvortex-0.4.6}/setup.cfg +0 -0
  102. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/__init__.py +0 -0
  103. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/__init__.py +0 -0
  104. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/__init__.py +0 -0
  105. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  106. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  107. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  108. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  109. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  110. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  111. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  112. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  113. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  114. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  115. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  116. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/contracts.py +0 -0
  117. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/csv.py +0 -0
  118. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  119. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  120. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  121. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  122. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  123. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/package.py +0 -0
  124. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/properties.py +0 -0
  125. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  126. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  127. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  128. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/constants.py +0 -0
  129. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/converter.py +0 -0
  130. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/document.py +0 -0
  131. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/errors.py +0 -0
  132. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/metadata.py +0 -0
  133. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/resources.py +0 -0
  134. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/selector.py +0 -0
  135. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/models.py +0 -0
  136. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  137. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
  138. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  139. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
  140. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  141. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  142. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  143. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  144. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/models.py +0 -0
  145. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/package.py +0 -0
  146. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/path.py +0 -0
  147. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
  148. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
  149. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
  150. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/table.py +0 -0
  151. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  152. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
  153. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  154. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  155. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  156. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  157. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  158. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  159. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  160. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  161. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  162. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  163. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  164. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  165. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  166. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  167. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  168. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  169. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  170. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  171. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  172. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  173. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  174. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  175. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  176. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  177. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  178. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  179. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  180. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  181. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  182. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  183. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  184. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  185. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  186. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  187. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  188. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/errors.py +0 -0
  189. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/image.py +0 -0
  190. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  191. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  192. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  193. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  194. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/limits.py +0 -0
  195. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/metadata.py +0 -0
  196. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  197. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  198. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  199. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  200. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  201. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  202. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  203. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  204. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  205. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  206. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  207. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  208. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/opc.py +0 -0
  209. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  210. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  211. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  212. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  213. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  214. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  215. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  216. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  217. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  218. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  219. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  220. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  221. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  222. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  223. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  224. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  225. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  226. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  227. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  228. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  229. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  230. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
  231. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  232. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  233. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  234. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  235. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  236. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  237. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/streams.py +0 -0
  238. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  239. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  240. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  241. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  242. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  243. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  244. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  245. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  246. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  247. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  248. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  249. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  250. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  251. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  252. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  253. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
  254. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
  255. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
  256. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
  257. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
  258. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
  259. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
  260. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  261. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  262. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  263. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  264. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  265. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  266. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  267. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  268. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  269. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  270. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  271. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  272. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  273. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  274. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  275. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  276. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  277. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  278. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  279. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  280. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  281. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  282. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  283. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  284. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  285. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  286. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  287. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  288. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  289. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  290. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  291. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  292. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  293. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  294. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  295. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  296. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  297. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/analyzers/pdf.py +0 -0
  298. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/api.py +0 -0
  299. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/__init__.py +0 -0
  300. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/images.py +0 -0
  301. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/assets/store.py +0 -0
  302. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/cli.py +0 -0
  303. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/__init__.py +0 -0
  304. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/__init__.py +0 -0
  305. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/contracts.py +0 -0
  306. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/materializer.py +0 -0
  307. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/parser.py +0 -0
  308. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/html/resources.py +0 -0
  309. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/codecs/json.py +0 -0
  310. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/__init__.py +0 -0
  311. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/inline.py +0 -0
  312. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/links.py +0 -0
  313. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/__init__.py +0 -0
  314. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/anchors.py +0 -0
  315. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/formula.py +0 -0
  316. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/projector.py +0 -0
  317. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/markup/styles.py +0 -0
  318. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/mathml.py +0 -0
  319. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/normalization.py +0 -0
  320. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/spans.py +0 -0
  321. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/__init__.py +0 -0
  322. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/blocks.py +0 -0
  323. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/content.py +0 -0
  324. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/document.py +0 -0
  325. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/html.py +0 -0
  326. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/models.py +0 -0
  327. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/rules.py +0 -0
  328. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/table/structure.py +0 -0
  329. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/text.py +0 -0
  330. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/content/tree.py +0 -0
  331. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/__init__.py +0 -0
  332. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/contracts.py +0 -0
  333. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/detection.py +0 -0
  334. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/filetypes.py +0 -0
  335. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/page_range.py +0 -0
  336. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/__init__.py +0 -0
  337. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/classify.py +0 -0
  338. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/constants.py +0 -0
  339. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/font_runtime.py +0 -0
  340. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/images.py +0 -0
  341. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/layout.py +0 -0
  342. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/metadata.py +0 -0
  343. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_annotations.py +0 -0
  344. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  345. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  346. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/pdfium.py +0 -0
  347. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/raster.py +0 -0
  348. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/__init__.py +0 -0
  349. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/geometry.py +0 -0
  350. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/text/groups.py +0 -0
  351. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/pdf/visuals.py +0 -0
  352. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/properties.py +0 -0
  353. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/document/source.py +0 -0
  354. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/errors.py +0 -0
  355. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/__init__.py +0 -0
  356. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/bundle.py +0 -0
  357. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/files.py +0 -0
  358. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/export/middle.py +0 -0
  359. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/__init__.py +0 -0
  360. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_coordinates.py +0 -0
  361. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_geometry.py +0 -0
  362. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_hyperlink.py +0 -0
  363. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image.py +0 -0
  364. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image_operations.py +0 -0
  365. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_image_payload.py +0 -0
  366. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/_text.py +0 -0
  367. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/image_encoding.py +0 -0
  368. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/language.py +0 -0
  369. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/type_identity.py +0 -0
  370. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/foundation/xml_names.py +0 -0
  371. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/geometry.py +0 -0
  372. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/metadata.py +0 -0
  373. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/options.py +0 -0
  374. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/__init__.py +0 -0
  375. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/content.py +0 -0
  376. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/document.py +0 -0
  377. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/lists.py +0 -0
  378. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/page_blocks.py +0 -0
  379. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/pages.py +0 -0
  380. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/paragraphs.py +0 -0
  381. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/postprocess/visual.py +0 -0
  382. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/public_api.py +0 -0
  383. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/__init__.py +0 -0
  384. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/__init__.py +0 -0
  385. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/__init__.py +0 -0
  386. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/context.py +0 -0
  387. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/html_table.py +0 -0
  388. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/index.py +0 -0
  389. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/list_items.py +0 -0
  390. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/common/planner.py +0 -0
  391. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  392. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/assets.py +0 -0
  393. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/inline.py +0 -0
  394. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/math.py +0 -0
  395. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  396. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/styles.py +0 -0
  397. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/table.py +0 -0
  398. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  399. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/assets.py +0 -0
  400. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/package.py +0 -0
  401. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  402. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/__init__.py +0 -0
  403. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/inline.py +0 -0
  404. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/renderer.py +0 -0
  405. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  406. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/html/table.py +0 -0
  407. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  408. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/assets.py +0 -0
  409. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/inline.py +0 -0
  410. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  411. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/table.py +0 -0
  412. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  413. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  414. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  415. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  416. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  417. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  418. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/table.py +0 -0
  419. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  420. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  421. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
  422. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
  423. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  424. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
  425. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  426. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  427. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/api.py +0 -0
  428. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/contracts.py +0 -0
  429. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/docx.py +0 -0
  430. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/epub.py +0 -0
  431. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/fragments.py +0 -0
  432. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/html.py +0 -0
  433. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/latex.py +0 -0
  434. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/markdown.py +0 -0
  435. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/pdf.py +0 -0
  436. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/render/structured_content.py +0 -0
  437. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/epub/docvortex.css +0 -0
  438. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  439. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  440. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/NOTICE +0 -0
  441. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/fonts/manifest.json +0 -0
  442. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.css +0 -0
  443. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.min.css +0 -0
  444. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/result.py +0 -0
  445. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/schema.py +0 -0
  446. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex/visualization.py +0 -0
  447. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/dependency_links.txt +0 -0
  448. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/entry_points.txt +0 -0
  449. {docvortex-0.4.4 → docvortex-0.4.6}/src/docvortex.egg-info/top_level.txt +0 -0
  450. {docvortex-0.4.4 → docvortex-0.4.6}/tests/benchmarks/flash_pdf.py +0 -0
  451. {docvortex-0.4.4 → docvortex-0.4.6}/tests/benchmarks/pipeline.py +0 -0
  452. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  453. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  454. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  455. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  456. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  457. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  458. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  459. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  460. {docvortex-0.4.4 → docvortex-0.4.6}/tests/fixtures/rtf/semantic.rtf +0 -0
  461. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_architecture.py +0 -0
  462. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_brand_protocol.py +0 -0
  463. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_cli_logging.py +0 -0
  464. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_complete_pipeline.py +0 -0
  465. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_converter_lifecycle.py +0 -0
  466. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_document_envelope.py +0 -0
  467. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_document_metadata.py +0 -0
  468. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_format_matrix.py +0 -0
  469. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_geometry_api.py +0 -0
  470. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_html_namespace.py +0 -0
  471. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_mixed_font_script_reference.py +0 -0
  472. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_analysis_api.py +0 -0
  473. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_font_geometry.py +0 -0
  474. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_font_runtime.py +0 -0
  475. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_model_text_normalization.py +0 -0
  476. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_output_text.py +0 -0
  477. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_render_pool.py +0 -0
  478. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_source_row_merging.py +0 -0
  479. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_pdf_symbol_normalization.py +0 -0
  480. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_export_api.py +0 -0
  481. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_image_api.py +0 -0
  482. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_public_pipeline.py +0 -0
  483. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_raster.py +0 -0
  484. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_rendering.py +0 -0
  485. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_refactor_resources.py +0 -0
  486. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_render_ownership.py +0 -0
  487. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_renderer_branding.py +0 -0
  488. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_shared_boundaries.py +0 -0
  489. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_system_font_pdf_pipeline.py +0 -0
  490. {docvortex-0.4.4 → docvortex-0.4.6}/tests/test_validated_geometry.py +0 -0
  491. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  492. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_epub_test_utils.py +0 -0
  493. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  494. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_image_mtef_test_utils.py +0 -0
  495. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  496. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  497. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  498. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_metafile_test_utils.py +0 -0
  499. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_mtef_test_utils.py +0 -0
  500. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  501. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_native_test_utils.py +0 -0
  502. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_odf_test_utils.py +0 -0
  503. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_ofd_test_utils.py +0 -0
  504. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  505. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  506. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/_span_test_utils.py +0 -0
  507. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  508. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  509. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  510. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  511. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  512. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  513. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  514. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  515. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  516. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  517. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  518. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  519. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  520. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  521. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  522. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  523. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/pdfs/test.pdf +0 -0
  524. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_backend_architecture.py +0 -0
  525. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  526. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_assets.py +0 -0
  527. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_complex_fields.py +0 -0
  528. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_math.py +0 -0
  529. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_render.py +0 -0
  530. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_special_char_tables.py +0 -0
  531. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_docx_table.py +0 -0
  532. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_emfplus_integration.py +0 -0
  533. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_backlinks.py +0 -0
  534. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  535. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_epub_render.py +0 -0
  536. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_csv.py +0 -0
  537. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  538. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_epub.py +0 -0
  539. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_html.py +0 -0
  540. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_image_mtef.py +0 -0
  541. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  542. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc.py +0 -0
  543. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  544. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  545. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls.py +0 -0
  546. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  547. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_markup_anchors.py +0 -0
  548. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_model.py +0 -0
  549. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_mtef_v5.py +0 -0
  550. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_odf.py +0 -0
  551. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_ofd.py +0 -0
  552. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  553. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_metafile.py +0 -0
  554. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_models.py +0 -0
  555. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  556. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  557. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_office_title_types.py +0 -0
  558. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  559. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  560. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  561. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  562. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  563. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
  564. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  565. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  566. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  567. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  568. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  569. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  570. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  571. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_samples.py +0 -0
  572. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  573. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  574. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_tables.py +0 -0
  575. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  576. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_titles.py +0 -0
  577. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  578. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_rtf.py +0 -0
  579. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_shared_helpers.py +0 -0
  580. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  581. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  582. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_css_build.py +0 -0
  583. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_render.py +0 -0
  584. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_html_security.py +0 -0
  585. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  586. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_latex_render.py +0 -0
  587. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_markdown_render.py +0 -0
  588. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_block_models.py +0 -0
  589. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_export.py +0 -0
  590. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_middle_json_validator.py +0 -0
  591. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_model_json.py +0 -0
  592. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table.py +0 -0
  593. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  594. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  595. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  596. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  597. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_ofd_assembly.py +0 -0
  598. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_ofd_vector_tables.py +0 -0
  599. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_demo_exports.py +0 -0
  600. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_demo_pages.py +0 -0
  601. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_office_parser_regressions.py +0 -0
  602. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
  603. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_classify.py +0 -0
  604. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_demo_links.py +0 -0
  605. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
  606. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_document.py +0 -0
  607. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_pagination.py +0 -0
  608. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_render.py +0 -0
  609. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  610. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_text_styles.py +0 -0
  611. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_title_font_plan.py +0 -0
  612. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_title_space.py +0 -0
  613. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_pdf_visualization.py +0 -0
  614. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  615. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_pages.py +0 -0
  616. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  617. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_postprocess_visual.py +0 -0
  618. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_api.py +0 -0
  619. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_html_table.py +0 -0
  620. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_image_renderer.py +0 -0
  621. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_render_list_index_utils.py +0 -0
  622. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_structured_content_render.py +0 -0
  623. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_table_merge.py +0 -0
  624. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  625. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_block_anchor.py +0 -0
  626. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_boundary_rules.py +0 -0
  627. {docvortex-0.4.4 → docvortex-0.4.6}/tests/unittest/test_text_utils.py +0 -0
  628. {docvortex-0.4.4 → docvortex-0.4.6}/tools/__init__.py +0 -0
  629. {docvortex-0.4.4 → docvortex-0.4.6}/tools/build_html_css.py +0 -0
  630. {docvortex-0.4.4 → docvortex-0.4.6}/tools/calibrate_pdf_geometry.py +0 -0
  631. {docvortex-0.4.4 → docvortex-0.4.6}/tools/capture_baseline.py +0 -0
  632. {docvortex-0.4.4 → docvortex-0.4.6}/tools/capture_platform_layout.py +0 -0
  633. {docvortex-0.4.4 → docvortex-0.4.6}/tools/compare_font_platforms.py +0 -0
  634. {docvortex-0.4.4 → docvortex-0.4.6}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: A fast, multi-format document parsing and conversion engine
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/myhloli/DocVortex
@@ -36,7 +36,7 @@ Requires-Dist: pylatexenc<3,>=2.10
36
36
  Requires-Dist: latex2mathml<4,>=3.81.0
37
37
  Requires-Dist: mathml2omml==0.0.2
38
38
  Requires-Dist: resvg_py<0.6,>=0.5.0
39
- Requires-Dist: reportlab
39
+ Requires-Dist: reportlab[accel]
40
40
  Requires-Dist: ziamath<0.14,>=0.13
41
41
  Requires-Dist: magika<1.1.0,>=0.6.2
42
42
  Requires-Dist: opencv-python>=4.11.0.86
@@ -54,7 +54,7 @@ Dynamic: license-file
54
54
 
55
55
  <div align="center">
56
56
 
57
- <img src="https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
57
+ <img src="https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
58
58
 
59
59
  # DocVortex
60
60
 
@@ -85,7 +85,7 @@ then exports the result in the formats your workflow needs.
85
85
  Native parsing works without an OCR or VLM inference service. Use DocVortex
86
86
  directly through its CLI or Python SDK, independently of MinerU.
87
87
 
88
- ![DocVortex pipeline: native documents become a unified representation, then Markdown, HTML, LaTeX, DOCX, EPUB, PDF or structured JSON.](https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-overview.jpg)
88
+ ![DocVortex pipeline: native documents become a unified representation, then Markdown, HTML, LaTeX, DOCX, EPUB, PDF or structured JSON.](https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-overview.jpg)
89
89
 
90
90
  ## Quick start
91
91
 
@@ -183,7 +183,7 @@ reads metadata without parsing the document body.
183
183
 
184
184
  - **Text PDFs:** native parsing uses the document's existing text and structure. Scanned pages requiring OCR need an external OCR or inference service.
185
185
  - **PDF classification:** `docvortex classify report.pdf` returns `txt` or `ocr`. Classification is explicit and does not start inference; parsing does not automatically switch backends.
186
- - **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and region images for tables/charts. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
186
+ - **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and HTML-based tables; charts retain region images. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
187
187
 
188
188
  ## Documentation
189
189
 
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- <img src="https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
3
+ <img src="https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-logo.jpg" alt="DocVortex logo" width="200">
4
4
 
5
5
  # DocVortex
6
6
 
@@ -31,7 +31,7 @@ then exports the result in the formats your workflow needs.
31
31
  Native parsing works without an OCR or VLM inference service. Use DocVortex
32
32
  directly through its CLI or Python SDK, independently of MinerU.
33
33
 
34
- ![DocVortex pipeline: native documents become a unified representation, then Markdown, HTML, LaTeX, DOCX, EPUB, PDF or structured JSON.](https://raw.githubusercontent.com/myhloli/DocVortex/main/docs/images/docvortex-overview.jpg)
34
+ ![DocVortex pipeline: native documents become a unified representation, then Markdown, HTML, LaTeX, DOCX, EPUB, PDF or structured JSON.](https://gcore.jsdelivr.net/gh/myhloli/DocVortex@main/docs/images/docvortex-overview.jpg)
35
35
 
36
36
  ## Quick start
37
37
 
@@ -129,7 +129,7 @@ reads metadata without parsing the document body.
129
129
 
130
130
  - **Text PDFs:** native parsing uses the document's existing text and structure. Scanned pages requiring OCR need an external OCR or inference service.
131
131
  - **PDF classification:** `docvortex classify report.pdf` returns `txt` or `ocr`. Classification is explicit and does not start inference; parsing does not automatically switch backends.
132
- - **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and region images for tables/charts. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
132
+ - **PDF export:** PDF sources with page geometry default to block layout restoration, with selectable text and HTML-based tables; charts retain region images. Other sources and older results use semantic reflow. Use `--pdf-layout original|reflow` to select explicitly; fonts, line breaks and drawing instructions are not reproduced losslessly. See [PDF output layout](docs/USAGE.md#pdf-output-layout).
133
133
 
134
134
  ## Documentation
135
135
 
@@ -113,8 +113,9 @@ when selecting a subset of an existing result.
113
113
  Pages may also contain `image_rotations`, such as `{"3":270}`: keys are source
114
114
  block indices encoded as strings, and values are the 0/90/180/270-degree angles
115
115
  used to turn region crops upright. The original-layout renderer reverses this
116
- crop transform when placing the image. This preserves rotated table images
117
- without duplicating image data or adding rotated-text reconstruction.
116
+ crop transform when placing the image. Structured HTML tables use the same angle
117
+ to restore the source orientation after layout in upright coordinates. No extra
118
+ image data or schema fields are required.
118
119
 
119
120
  This uses the existing JSON extension mechanism; Model/Middle/bundle schema
120
121
  versions remain 2.0. Older documents without this extension remain readable.
@@ -99,8 +99,22 @@ document and the original source file.
99
99
  PDF output defaults to `PdfLayout.AUTO`. Newly parsed PDF sources preserve their
100
100
  page dimensions, page boundaries, headers, footers, and block positions. Text is
101
101
  selectable and reflows inside each source block; original fonts and line breaks
102
- are approximate. Tables and charts prefer existing region images, and equations
103
- prefer vector rendering. Content absent from the parsed result cannot be restored.
102
+ are approximate. Tables prefer parsed HTML with selectable text and vector borders;
103
+ charts retain region images, and equations prefer vector rendering. Content absent
104
+ from the parsed result cannot be restored.
105
+
106
+ Original-layout tables use content-based column widths and compact cell padding.
107
+ They first fit their source box, then may use safe space in the same column while
108
+ preserving page margins and a 2 pt gap from other blocks. Existing spanning tables
109
+ retain their span. Rotation is restored after layout in upright coordinates;
110
+ tables do not move to another page. Captions and notes remain separate when their
111
+ own coordinates are available, or share the parent box when child coordinates
112
+ are missing. If 6 pt text still cannot fit, the table is scaled further and
113
+ `pdf_layout_small_text` is reported. Small text alone never triggers an image
114
+ fallback. Missing, invalid, or unrenderable HTML falls back to the region image,
115
+ then text or a placeholder, with `pdf_table_fallback` and `pdf_table_source`
116
+ diagnostics. `pdf_table_layout` records the source, rotation, effective font size,
117
+ and original/drawing bounds. Reflow table layout is unchanged.
104
118
 
105
119
  ```python
106
120
  import docvortex
@@ -160,8 +174,9 @@ adjacent titles divide their gap at its midpoint. The original top edge is
160
174
  preferred, shifting upward when needed. Only a title that cannot fit its safe
161
175
  area shrinks, in 0.1 pt steps before the existing below-6-pt fallback. Script and
162
176
  inline-formula ink extents are included in title measurement. Index references
163
- and approximate parent groups do not participate; body text, captions, code and
164
- tables retain their original independent fitting results.
177
+ and approximate parent groups do not participate; body text, captions and code
178
+ retain their original independent fitting results. Structured tables are placed
179
+ after titles and equations, respecting their final drawing bounds.
165
180
 
166
181
  `pdf_title_layout_expanded` identifies expanded title areas.
167
182
  `pdf_layout_font_exception` records local-body increases or insufficient-space
@@ -27,7 +27,7 @@ dependencies = [
27
27
  "mammoth>=1.11.0,<2", "openpyxl>=3.1.5,<4", "olefile>=0.47,<1",
28
28
  "pylatexenc>=2.10,<3", "latex2mathml>=3.81.0,<4", "mathml2omml==0.0.2",
29
29
  "resvg_py>=0.5.0,<0.6",
30
- "reportlab", "ziamath>=0.13,<0.14",
30
+ "reportlab[accel]", "ziamath>=0.13,<0.14",
31
31
  "magika>=0.6.2,<1.1.0", "opencv-python>=4.11.0.86",
32
32
  ]
33
33
 
@@ -208,42 +208,46 @@ def _cluster_baselines(
208
208
  median_loose_height = statistics.median(feature.loose_height for feature in anchors)
209
209
  tolerance = max(SCRIPT_BASELINE_ABSOLUTE_TOLERANCE, median_loose_height * SCRIPT_BASELINE_LOOSE_HEIGHT_RATIO)
210
210
  groups: list[list[int]] = []
211
+ group_origins: list[list[float]] = []
211
212
  for feature in sorted(anchors, key=lambda item: item.origin[1] if item.origin is not None else 0.0):
212
213
  baseline = feature.origin[1] if feature.origin is not None else 0.0
213
214
  if not groups:
214
215
  groups.append([feature.index])
216
+ group_origins.append([baseline])
215
217
  continue
216
- previous_baseline = statistics.median(
217
- features[index].origin[1] for index in groups[-1] if features[index].origin is not None
218
- )
218
+ previous_baseline = _sorted_origin_median(group_origins[-1])
219
219
  if abs(baseline - previous_baseline) <= tolerance:
220
220
  groups[-1].append(feature.index)
221
+ group_origins[-1].append(baseline)
221
222
  else:
222
223
  groups.append([feature.index])
224
+ group_origins.append([baseline])
223
225
  return (
224
226
  [
225
227
  ScriptBaselineCluster(
226
- baseline=statistics.median(features[index].origin[1] for index in group if features[index].origin is not None),
228
+ baseline=_sorted_origin_median(origins),
227
229
  member_indices=tuple(group),
228
230
  )
229
- for group in groups
231
+ for group, origins in zip(groups, group_origins, strict=True)
230
232
  ],
231
233
  tolerance,
232
234
  )
233
235
 
234
236
 
237
+ def _sorted_origin_median(origins: list[float]) -> float:
238
+ """原始字符已按 origin 排序,直接使用与 statistics.median 相同的中位运算。"""
239
+ middle = len(origins) // 2
240
+ return origins[middle] if len(origins) % 2 else (origins[middle - 1] + origins[middle]) / 2
241
+
242
+
235
243
  def _cluster_tight_height(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
236
244
  """返回基线簇的高分位 tight 高度。"""
237
- return _quantile(
238
- [features[index].tight_height for index in cluster.member_indices if features[index].tight_height > 0], 0.9
239
- )
245
+ return _quantile([height for index in cluster.member_indices if (height := features[index].tight_height) > 0], 0.9)
240
246
 
241
247
 
242
248
  def _cluster_loose_height(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
243
249
  """返回基线簇的高分位 loose 高度。"""
244
- return _quantile(
245
- [features[index].loose_height for index in cluster.member_indices if features[index].loose_height > 0], 0.9
246
- )
250
+ return _quantile([height for index in cluster.member_indices if (height := features[index].loose_height) > 0], 0.9)
247
251
 
248
252
 
249
253
  def _cluster_tight_center(features: list[ScriptCharFeature], cluster: ScriptBaselineCluster) -> float:
@@ -283,29 +287,33 @@ def _cluster_has_consistent_displacement(
283
287
  def _choose_body_band(
284
288
  features: list[ScriptCharFeature],
285
289
  clusters: list[ScriptBaselineCluster],
290
+ heights: dict[ScriptBaselineCluster, tuple[float, float]] | None = None,
286
291
  ) -> tuple[ScriptBodyBand, ScriptBaselineCluster] | None:
287
292
  """在接近最高字形的基线簇中按字符数选择正文基线。"""
288
293
  if not clusters:
289
294
  return None
290
- maximum_height = max(_cluster_tight_height(features, cluster) for cluster in clusters)
295
+ if heights is None:
296
+ heights = {
297
+ cluster: (_cluster_tight_height(features, cluster), _cluster_loose_height(features, cluster))
298
+ for cluster in clusters
299
+ }
300
+ maximum_height = max(heights[cluster][0] for cluster in clusters)
291
301
  comparable = [
292
- cluster
293
- for cluster in clusters
294
- if _cluster_tight_height(features, cluster) >= maximum_height * SCRIPT_BODY_COMPARABLE_HEIGHT_RATIO
302
+ cluster for cluster in clusters if heights[cluster][0] >= maximum_height * SCRIPT_BODY_COMPARABLE_HEIGHT_RATIO
295
303
  ]
296
304
  body_cluster = max(
297
305
  comparable,
298
306
  key=lambda cluster: (
299
307
  len(cluster.member_indices),
300
- _cluster_tight_height(features, cluster),
301
- _cluster_loose_height(features, cluster),
308
+ heights[cluster][0],
309
+ heights[cluster][1],
302
310
  ),
303
311
  )
304
312
  return (
305
313
  ScriptBodyBand(
306
314
  baseline=body_cluster.baseline,
307
- tight_height=_cluster_tight_height(features, body_cluster),
308
- loose_height=_cluster_loose_height(features, body_cluster),
315
+ tight_height=heights[body_cluster][0],
316
+ loose_height=heights[body_cluster][1],
309
317
  member_indices=frozenset(body_cluster.member_indices),
310
318
  ),
311
319
  body_cluster,
@@ -508,6 +516,7 @@ def _recheck_weak_clusters_with_local_font_body(
508
516
  component_indices: list[int],
509
517
  body_band: ScriptBodyBand,
510
518
  cluster_roles: dict[ScriptBaselineCluster, ScriptRole],
519
+ heights: dict[ScriptBaselineCluster, tuple[float, float]],
511
520
  ) -> None:
512
521
  """用同字体局部正文撤销弱误判;不制造角标,不让撤销结果成为新参考。"""
513
522
  initial_roles = dict(cluster_roles)
@@ -543,7 +552,7 @@ def _recheck_weak_clusters_with_local_font_body(
543
552
  continue
544
553
  shift = cluster.baseline - reference.baseline
545
554
  strong_shift = abs(shift) >= height * SCRIPT_STRONG_SHIFT_RATIO
546
- tight_ratio = _cluster_tight_height(features, cluster) / height
555
+ tight_ratio = heights[cluster][0] / height
547
556
  if abs(shift) < max(SCRIPT_ORIGIN_MIN_SHIFT_ABSOLUTE, height * SCRIPT_ORIGIN_MIN_SHIFT_RATIO) or (
548
557
  tight_ratio > SCRIPT_TIGHT_HEIGHT_RATIO and not (strong_shift and tight_ratio <= SCRIPT_STRONG_MAX_HEIGHT_RATIO)
549
558
  ):
@@ -559,7 +568,11 @@ def _assign_component(
559
568
  ) -> None:
560
569
  """在单个视觉组件内按 origin 基线簇和双 bbox 一致性分配角色。"""
561
570
  clusters, tolerance = _cluster_baselines(features, component_indices)
562
- body_result = _choose_body_band(features, clusters)
571
+ # 基线簇在本次组件判定内不变,高度分位数可供正文选择与各角标规则共享。
572
+ heights = {
573
+ cluster: (_cluster_tight_height(features, cluster), _cluster_loose_height(features, cluster)) for cluster in clusters
574
+ }
575
+ body_result = _choose_body_band(features, clusters, heights)
563
576
  if body_result is None:
564
577
  return
565
578
  body_band, body_cluster = body_result
@@ -570,8 +583,8 @@ def _assign_component(
570
583
  if cluster is body_cluster:
571
584
  continue
572
585
  shift = cluster.baseline - body_band.baseline
573
- tight_ratio = _cluster_tight_height(features, cluster) / body_band.tight_height
574
- loose_ratio = _cluster_loose_height(features, cluster) / body_band.loose_height
586
+ tight_ratio = heights[cluster][0] / body_band.tight_height
587
+ loose_ratio = heights[cluster][1] / body_band.loose_height
575
588
  minimum_shift = max(SCRIPT_ORIGIN_MIN_SHIFT_ABSOLUTE, body_band.tight_height * SCRIPT_ORIGIN_MIN_SHIFT_RATIO)
576
589
  strong_shift = abs(shift) >= body_band.tight_height * SCRIPT_STRONG_SHIFT_RATIO
577
590
  if (
@@ -587,7 +600,7 @@ def _assign_component(
587
600
  cluster_roles[cluster] = "body"
588
601
  else:
589
602
  cluster_roles[cluster] = _script_role(shift)
590
- _recheck_weak_clusters_with_local_font_body(features, font_keys, component_indices, body_band, cluster_roles)
603
+ _recheck_weak_clusters_with_local_font_body(features, font_keys, component_indices, body_band, cluster_roles, heights)
591
604
  for index in component_indices:
592
605
  feature = features[index]
593
606
  if (
@@ -607,6 +620,61 @@ def _assign_component(
607
620
  roles[index] = "body"
608
621
 
609
622
 
623
+ def paired_script_roles(
624
+ chars: list[Char],
625
+ roles: list[ScriptRole],
626
+ tight_bboxes: dict[int, BBox],
627
+ origins: dict[int, tuple[float, float]],
628
+ ) -> dict[int, ScriptRole]:
629
+ """确认同一基字符右侧横向叠放的上下标,排除分式和远距邻列。"""
630
+
631
+ features = build_script_features(chars, tight_bboxes, origins, set())
632
+ visible = [feature for feature in features if feature.text.isprintable() and not feature.text.isspace()]
633
+ paired: dict[int, ScriptRole] = {}
634
+ for position, (base, first, second) in enumerate(zip(visible, visible[1:], visible[2:])):
635
+ if (
636
+ not all(feature.is_valid and feature.text.isalnum() for feature in (base, first, second))
637
+ or roles[base.index] != "body"
638
+ or {roles[first.index], roles[second.index]} != {"sup", "sub"}
639
+ ):
640
+ continue
641
+ assert base.tight_bbox is not None and base.origin is not None
642
+ assert first.tight_bbox is not None and first.origin is not None
643
+ assert second.tight_bbox is not None and second.origin is not None
644
+ scale = base.tight_height
645
+ if scale <= 0 or any(feature.tight_height > 0.8 * scale for feature in (first, second)):
646
+ continue
647
+ overlap = min(first.tight_bbox[2], second.tight_bbox[2]) - max(first.tight_bbox[0], second.tight_bbox[0])
648
+ minimum_width = min(first.tight_bbox[2] - first.tight_bbox[0], second.tight_bbox[2] - second.tight_bbox[0])
649
+ if overlap < 0.5 * minimum_width:
650
+ continue
651
+ if any(
652
+ not -0.15 * scale <= feature.tight_bbox[0] - base.tight_bbox[2] <= 0.5 * scale
653
+ or abs(feature.origin[1] - base.origin[1]) < 0.15 * scale
654
+ or abs(feature.origin[1] - base.origin[1]) > scale
655
+ for feature in (first, second)
656
+ ):
657
+ continue
658
+ if (first.origin[1] - base.origin[1]) * (second.origin[1] - base.origin[1]) >= 0:
659
+ continue
660
+ # 本补证据只接纳完整单字符角标,不能只给 grid 等多字母角标的首字母加样式。
661
+ following = visible[position + 3] if position + 3 < len(visible) else None
662
+ if (
663
+ following is not None
664
+ and following.is_valid
665
+ and following.text.isalnum()
666
+ and following.tight_bbox is not None
667
+ and following.origin is not None
668
+ and following.tight_height <= 0.8 * scale
669
+ and abs(following.origin[1] - second.origin[1]) <= 0.15 * scale
670
+ and -0.15 * scale <= following.tight_bbox[0] - second.tight_bbox[2] <= 0.5 * scale
671
+ ):
672
+ continue
673
+ paired[first.index] = roles[first.index]
674
+ paired[second.index] = roles[second.index]
675
+ return paired
676
+
677
+
610
678
  def classify_char_script_roles(
611
679
  chars: list[Char],
612
680
  *,
@@ -143,6 +143,14 @@ def _choose_cell_for_glyph_indexed(
143
143
  0,
144
144
  min(rows - 1, bisect_left(index.y_tracks, glyph.bbox[3]) - 1),
145
145
  )
146
+ if left_col == right_col and top_row == bottom_row:
147
+ # 只覆盖一个原子格时仍执行原面积/中心判定,省去候选集合与排序。
148
+ cell_index = index.owners[top_row][left_col]
149
+ bbox = specs[cell_index].bbox
150
+ if glyph_overlap_ratio(glyph, bbox) > 0:
151
+ return cell_index, False
152
+ center_x, center_y = bbox_center(glyph.bbox)
153
+ return (cell_index, False) if bbox[0] <= center_x <= bbox[2] and bbox[1] <= center_y <= bbox[3] else (None, False)
146
154
  candidate_indices = {
147
155
  index.owners[row][col] for row in range(top_row, bottom_row + 1) for col in range(left_col, right_col + 1)
148
156
  }
@@ -19,6 +19,7 @@ from .contracts import (
19
19
  from .geometry import bbox_intersection, normalize_bbox
20
20
  from .sparse_hybrid import build_sparse_hybrid_candidates, diagnose_sparse_hybrid_candidate_builds
21
21
  from .sparse_multiline import build_sparse_multiline_candidates, diagnose_sparse_multiline_candidate_builds
22
+ from .rule_band import build_rule_band_candidates
22
23
  from .text import build_native_table_text
23
24
  from .text_grid import build_text_candidates, diagnose_text_candidate_builds
24
25
  from .vector import MAX_PRIMITIVES_PER_TABLE, build_vector_candidates, diagnose_vector_candidate_builds
@@ -379,8 +380,11 @@ def _evaluate_native_pdf_table(
379
380
  )
380
381
  if _has_alias_affected_physical_blank_row(vector_attempts):
381
382
  sparse_hybrid_allowed = False
382
- sparse_hybrid_candidates = build_sparse_hybrid_candidates(table_input, text) if sparse_hybrid_allowed else []
383
- sparse_hybrid_selection = _select_candidate(sparse_hybrid_candidates)
383
+ rule_band_candidates = build_rule_band_candidates(table_input, text) if sparse_hybrid_allowed else []
384
+ sparse_hybrid_candidates = (
385
+ build_sparse_hybrid_candidates(table_input, text) if sparse_hybrid_allowed and not rule_band_candidates else []
386
+ )
387
+ sparse_hybrid_selection = _select_candidate([*rule_band_candidates, *sparse_hybrid_candidates])
384
388
  text_candidates = (
385
389
  build_text_candidates(table_input, text)
386
390
  if len(text.rows) >= 2 and vector_selection is None and sparse_hybrid_selection is None
@@ -396,6 +400,7 @@ def _evaluate_native_pdf_table(
396
400
  text_candidates = []
397
401
  existing_generated_candidates = [
398
402
  *vector_candidates,
403
+ *rule_band_candidates,
399
404
  *sparse_hybrid_candidates,
400
405
  *text_candidates,
401
406
  ]
@@ -466,7 +471,10 @@ def diagnose_native_pdf_table(table_input: NativeTableInput) -> dict[str, Any]:
466
471
  if evaluation.text is not None
467
472
  else ()
468
473
  )
469
- sparse_multiline_attempts = (
474
+ rule_band_attempts: list[dict[str, Any]] = []
475
+ if evaluation.text is not None:
476
+ build_rule_band_candidates(table_input, evaluation.text, diagnostics=rule_band_attempts)
477
+ sparse_multiline_attempts = tuple(rule_band_attempts) + (
470
478
  diagnose_sparse_multiline_candidate_builds(
471
479
  table_input,
472
480
  evaluation.text,
@@ -0,0 +1,135 @@
1
+ """以三线表物理表头边界恢复换行表头和同步重启的描述列。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from .candidate import GridCellSpec, build_candidate
8
+ from .contracts import NativeTableCandidate, NativeTableInput, NativeTableText
9
+ from .geometry import normalize_angle, table_local_size
10
+ from .sparse_common import _local_rules
11
+ from .sparse_multiline import (
12
+ _build_column_hypothesis,
13
+ _has_overlapping_formula_rows,
14
+ _local_rectangles,
15
+ _row_occupancy,
16
+ _stable_gutters,
17
+ )
18
+
19
+
20
+ def build_rule_band_candidates(
21
+ table_input: NativeTableInput,
22
+ text: NativeTableText,
23
+ diagnostics: list[dict[str, Any]] | None = None,
24
+ ) -> list[NativeTableCandidate]:
25
+ """只在三条完整横线及无歧义列占用共同成立时恢复特殊三线表。"""
26
+
27
+ width, height = table_local_size(table_input.table_bbox, normalize_angle(table_input.angle))
28
+ rules = _local_rules(table_input, width, height)
29
+ tolerance = max(1.0, 0.15 * text.median_glyph_height)
30
+ horizontal = sorted(
31
+ {rule.coordinate for rule in rules if rule.orientation == "horizontal" and rule.end - rule.start >= 0.9 * width}
32
+ )
33
+ if (
34
+ len(horizontal) != 3
35
+ or horizontal[0] > tolerance
36
+ or height - horizontal[-1] > tolerance
37
+ or any(rule.orientation == "vertical" and tolerance < rule.coordinate < width - tolerance for rule in rules)
38
+ ):
39
+ return []
40
+ header_bottom = horizontal[1]
41
+ header = [row for row in text.rows if row.bbox[3] <= header_bottom + 0.5]
42
+ body = [row for row in text.rows if row.bbox[1] >= header_bottom - 0.5]
43
+ if not 1 <= len(header) <= 3 or len(body) < 3 or len(header) + len(body) != len(text.rows):
44
+ return []
45
+ if _has_overlapping_formula_rows(text, header_bottom):
46
+ return []
47
+ hypothesis = _build_column_hypothesis(text, width, rules, _local_rectangles(table_input, width, height), None)
48
+ if hypothesis is None:
49
+ return []
50
+ tracks = hypothesis.x_tracks
51
+ cols = len(tracks) - 1
52
+ glyphs = {glyph.glyph_id: glyph for glyph in text.glyphs}
53
+ occupancy = [_row_occupancy(row, glyphs, tracks) for row in body]
54
+ full = set(range(cols))
55
+ common = set.intersection(*occupancy)
56
+ prefix_cols = min(common) if common else 0
57
+ groups: list[tuple[int, int]] = []
58
+ if prefix_cols:
59
+ # 至少两个描述列同步重启,右侧逐行完整,才能区分 rowspan 与普通空格。
60
+ suffix = set(range(prefix_cols, cols))
61
+ starts = [index for index, occupied in enumerate(occupancy) if occupied == full]
62
+ ends = starts[1:] + [len(body)]
63
+ if (
64
+ prefix_cols < 2
65
+ or len(suffix) < 2
66
+ or common != suffix
67
+ or len(starts) < 3
68
+ or starts[0] != 0
69
+ or any(occupied not in (full, suffix) for occupied in occupancy)
70
+ or any(end - start < 2 for start, end in zip(starts, ends))
71
+ ):
72
+ return []
73
+ groups = list(zip(starts, ends))
74
+ elif any(occupied != full for occupied in occupancy):
75
+ return []
76
+ if not groups and len(header) == 1:
77
+ # 普通单行表头三线表仍走既有策略,避免无关候选和金标漂移。
78
+ return []
79
+ header_occupancy = [_row_occupancy(row, glyphs, tracks) for row in header]
80
+ if set.union(*header_occupancy) != full:
81
+ return []
82
+ if len(header) > 1 and header_occupancy[-1] != full:
83
+ # 多级表头可能有仅出现在上层的 rowspan 标签,不能误折叠成普通换行表头。
84
+ return []
85
+ margin = max(0.25, 0.05 * text.median_glyph_width)
86
+ if any(
87
+ token.bbox[0] + margin < boundary < token.bbox[2] - margin
88
+ for row in header
89
+ for token in row.tokens
90
+ for boundary in tracks[1:-1]
91
+ ):
92
+ return []
93
+ if not _stable_gutters(text, tracks, hypothesis.physical_boundaries, header_bottom, None):
94
+ return []
95
+ boundaries = [header_bottom]
96
+ for previous, current in zip(body, body[1:]):
97
+ if previous.bbox[3] > current.bbox[1] + 0.5:
98
+ return []
99
+ boundaries.append((previous.bbox[3] + current.bbox[1]) / 2.0)
100
+ boundaries.append(height)
101
+ specs = [GridCellSpec(0, col, 1, 1, (tracks[col], 0.0, tracks[col + 1], header_bottom)) for col in range(cols)]
102
+ spans = {start: end for start, end in groups}
103
+ for index in range(len(body)):
104
+ for col in range(cols):
105
+ if col < prefix_cols and index not in spans:
106
+ continue
107
+ end = spans[index] if col < prefix_cols else index + 1
108
+ specs.append(
109
+ GridCellSpec(index + 1, col, end - index, 1, (tracks[col], boundaries[index], tracks[col + 1], boundaries[end]))
110
+ )
111
+ record: dict[str, Any] = {}
112
+ candidate = build_candidate(
113
+ source="sparse_multiline",
114
+ rows=len(body) + 1,
115
+ cols=cols,
116
+ specs=tuple(specs),
117
+ text=text,
118
+ structure_support=1.0,
119
+ row_stability=1.0,
120
+ column_stability=1.0,
121
+ issues=("evidence=physical_header_band", f"wrapped_header_rows={len(header)}", f"descriptor_columns={prefix_cols}"),
122
+ use_grid_index=True,
123
+ diagnostics=record,
124
+ )
125
+ if diagnostics is not None:
126
+ diagnostics.append({"source": "sparse_multiline", "evidence": "physical_header_band", **record})
127
+ if (
128
+ candidate is None
129
+ or candidate.text_capture < 1.0
130
+ or candidate.order_consistency < 1.0
131
+ or candidate.score < 0.98
132
+ or record.get("ambiguous_glyph_ratio", 1.0) > 0.0
133
+ ):
134
+ return []
135
+ return [candidate]
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import statistics
6
+ import re
6
7
  import unicodedata
7
8
  from dataclasses import dataclass
8
9
 
@@ -32,7 +33,7 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
32
33
  table_bbox = normalize_bbox(table_input.table_bbox)
33
34
  if table_bbox is None:
34
35
  return []
35
- selected: list[tuple[int, int, Char]] = []
36
+ selected: list[tuple[int, int, Char, BBox]] = []
36
37
  for fallback_index, char in enumerate(table_input.chars):
37
38
  char_bbox = normalize_bbox(char.get("bbox"))
38
39
  if char_bbox is None:
@@ -44,14 +45,14 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
44
45
  source_index = int(char.get("char_idx", fallback_index))
45
46
  except (TypeError, ValueError):
46
47
  source_index = fallback_index
47
- selected.append((source_index, fallback_index, char))
48
+ selected.append((source_index, fallback_index, char, char_bbox))
48
49
 
49
50
  selected.sort(key=lambda item: (item[0], item[1]))
50
51
  output: list[_PendingGlyph] = []
51
52
  angle = normalize_angle(table_input.angle)
52
53
  pending_space = False
53
54
  pending_break = False
54
- for _source_sort, fallback_index, char in selected:
55
+ for source_index, _fallback_index, char, absolute_bbox in selected:
55
56
  raw_text = str(char.get("char") or "")
56
57
  if not raw_text:
57
58
  continue
@@ -66,9 +67,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
66
67
  text = _normalize_table_text(raw_text)
67
68
  if not text or text.isspace():
68
69
  continue
69
- absolute_bbox = normalize_bbox(char.get("bbox"))
70
- if absolute_bbox is None:
71
- continue
72
70
  local_bbox = page_bbox_to_table_local(
73
71
  absolute_bbox,
74
72
  table_bbox,
@@ -76,10 +74,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
76
74
  )
77
75
  if local_bbox is None or local_bbox[3] - local_bbox[1] < 0.5:
78
76
  continue
79
- try:
80
- source_index = int(char.get("char_idx", fallback_index))
81
- except (TypeError, ValueError):
82
- source_index = fallback_index
83
77
  output.append(
84
78
  _PendingGlyph(
85
79
  glyph_id=len(output),
@@ -153,7 +147,14 @@ def _assign_visual_rows(
153
147
  )
154
148
  else:
155
149
  rows[best_index].append(glyph)
156
- row_bboxes[best_index] = bbox_union([row_bboxes[best_index], glyph.bbox])
150
+ # 两框合并保持原 min/max 顺序,避免为每个字符建立通用迭代器。
151
+ previous_bbox = row_bboxes[best_index]
152
+ row_bboxes[best_index] = (
153
+ min(previous_bbox[0], glyph.bbox[0]),
154
+ min(previous_bbox[1], glyph.bbox[1]),
155
+ max(previous_bbox[2], glyph.bbox[2]),
156
+ max(previous_bbox[3], glyph.bbox[3]),
157
+ )
157
158
  for row_index in range(best_index, len(row_bboxes)):
158
159
  prefix_max_bottoms[row_index] = max(
159
160
  prefix_max_bottoms[row_index - 1] if row_index > 0 else row_bboxes[row_index][3],
@@ -170,7 +171,11 @@ def _assign_visual_rows(
170
171
  def _contains_cjk(text: str) -> bool:
171
172
  """判断文本是否包含常见中日韩统一表意字符。"""
172
173
 
173
- return any("\u3400" <= char <= "\u9fff" for char in text)
174
+ # 组行热路径通常只传入相邻两个字符,直接遍历避免逐次创建生成器。
175
+ for char in text:
176
+ if "\u3400" <= char <= "\u9fff":
177
+ return True
178
+ return False
174
179
 
175
180
 
176
181
  def _join_glyph_line(
@@ -208,6 +213,9 @@ def _looks_like_compact_unit_or_identifier(
208
213
  combined = previous_line.strip() + next_line.strip()
209
214
  if not combined or any(char.isspace() for char in combined):
210
215
  return False
216
+ # 带单位后缀的长英文标题仍有词界,不能仅因末尾 /% 就把相邻单词粘连。
217
+ if re.fullmatch(r"[A-Za-z]{4,}", previous_line.strip()) and re.match(r"[A-Za-z]{4,}(?:/|%)", next_line.strip()):
218
+ return False
211
219
  return any(char.isdigit() or char in "/_^%°µμ" for char in combined)
212
220
 
213
221
 
@@ -248,12 +256,14 @@ def _cell_row_separator(
248
256
  def _glyph_line_parts(
249
257
  glyphs: list[NativeTableGlyph] | list[_PendingGlyph],
250
258
  median_height: float,
259
+ *,
260
+ presorted: bool = False,
251
261
  ) -> list[tuple[str, int | None]]:
252
262
  """重建单行文本片段,并保留每个可见片段的原字符索引。"""
253
263
 
254
264
  if not glyphs:
255
265
  return []
256
- ordered = sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
266
+ ordered = glyphs if presorted else sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
257
267
  parts: list[tuple[str, int | None]] = [(ordered[0].text, ordered[0].source_index)]
258
268
  previous = ordered[0]
259
269
  for glyph in ordered[1:]:
@@ -292,7 +302,8 @@ def _tokenize_row(
292
302
  groups[-1].append(glyph)
293
303
  tokens: list[NativeTableToken] = []
294
304
  for group in groups:
295
- content = _join_glyph_line(group, median_height)
305
+ # group 是视觉行按同一排序键切出的连续片段,不必再次排序。
306
+ content = "".join(text for text, _source_index in _glyph_line_parts(group, median_height, presorted=True))
296
307
  if not content:
297
308
  continue
298
309
  tokens.append(