docvortex 0.4.3__tar.gz → 0.4.5__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 (626) hide show
  1. {docvortex-0.4.3/src/docvortex.egg-info → docvortex-0.4.5}/PKG-INFO +4 -3
  2. {docvortex-0.4.3 → docvortex-0.4.5}/README.md +1 -1
  3. {docvortex-0.4.3 → docvortex-0.4.5}/docs/JSON_PROTOCOL.md +3 -2
  4. {docvortex-0.4.3 → docvortex-0.4.5}/docs/USAGE.md +19 -4
  5. {docvortex-0.4.3 → docvortex-0.4.5}/pyproject.toml +2 -2
  6. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_script_geometry.py +37 -24
  7. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +8 -0
  8. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +21 -14
  9. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +121 -38
  10. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_geometry.py +8 -2
  11. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_text_styles.py +5 -1
  12. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/diagnostics.py +2 -4
  13. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/formula.py +129 -31
  14. docvortex-0.4.5/src/docvortex/render/_internal/pdf/formula_layout.py +98 -0
  15. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/inline.py +20 -3
  16. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/original.py +119 -15
  17. docvortex-0.4.5/src/docvortex/render/_internal/pdf/paragraph.py +123 -0
  18. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/renderer.py +51 -17
  19. docvortex-0.4.5/src/docvortex/render/_internal/pdf/table.py +485 -0
  20. docvortex-0.4.5/src/docvortex/render/_internal/pdf/table_content.py +251 -0
  21. docvortex-0.4.5/src/docvortex/render/_internal/pdf/table_layout.py +319 -0
  22. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/version.py +1 -1
  23. {docvortex-0.4.3 → docvortex-0.4.5/src/docvortex.egg-info}/PKG-INFO +4 -3
  24. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex.egg-info/SOURCES.txt +13 -0
  25. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex.egg-info/requires.txt +2 -1
  26. docvortex-0.4.5/tests/benchmarks/native_pdf_table.py +155 -0
  27. docvortex-0.4.5/tests/benchmarks/pdf_render.py +280 -0
  28. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_benchmark_entrypoint.py +28 -0
  29. docvortex-0.4.5/tests/unittest/test_native_table_performance_equivalence.py +211 -0
  30. docvortex-0.4.5/tests/unittest/test_pdf_cjk_style.py +178 -0
  31. docvortex-0.4.5/tests/unittest/test_pdf_diagnostic_levels.py +48 -0
  32. docvortex-0.4.5/tests/unittest/test_pdf_formula_layout.py +272 -0
  33. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_original_layout.py +7 -6
  34. docvortex-0.4.5/tests/unittest/test_pdf_paragraph_cache.py +107 -0
  35. docvortex-0.4.5/tests/unittest/test_pdf_structured_tables.py +367 -0
  36. docvortex-0.4.5/tests/unittest/test_pdf_table_cache.py +77 -0
  37. docvortex-0.4.5/tests/unittest/test_pdf_table_round2.py +305 -0
  38. docvortex-0.4.3/src/docvortex/render/_internal/pdf/table.py +0 -293
  39. docvortex-0.4.3/tests/unittest/test_pdf_diagnostic_levels.py +0 -39
  40. {docvortex-0.4.3 → docvortex-0.4.5}/LICENSE.md +0 -0
  41. {docvortex-0.4.3 → docvortex-0.4.5}/MANIFEST.in +0 -0
  42. {docvortex-0.4.3 → docvortex-0.4.5}/demo/README.md +0 -0
  43. {docvortex-0.4.3 → docvortex-0.4.5}/demo/demo.py +0 -0
  44. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/README.md +0 -0
  45. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/docx_01.doc +0 -0
  46. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/docx_01.docx +0 -0
  47. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/pptx_01.ppt +0 -0
  48. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/pptx_01.pptx +0 -0
  49. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/rtf_01.rtf +0 -0
  50. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/xlsx_01.xls +0 -0
  51. {docvortex-0.4.3 → docvortex-0.4.5}/demo/office_docs/xlsx_01.xlsx +0 -0
  52. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  53. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  54. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/caibao1.pdf +0 -0
  55. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/demo1.pdf +0 -0
  56. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/demo2.pdf +0 -0
  57. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/demo3.pdf +0 -0
  58. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/demo4.pdf +0 -0
  59. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/demo6.pdf +0 -0
  60. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  61. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  62. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  63. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  64. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs/small_ocr.pdf +0 -0
  65. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  66. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  67. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  68. {docvortex-0.4.3 → docvortex-0.4.5}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  69. {docvortex-0.4.3 → docvortex-0.4.5}/docs/HTML_PROTOCOL.md +0 -0
  70. {docvortex-0.4.3 → docvortex-0.4.5}/docs/METADATA.md +0 -0
  71. {docvortex-0.4.3 → docvortex-0.4.5}/docs/PDF_FONTS.md +0 -0
  72. {docvortex-0.4.3 → docvortex-0.4.5}/docs/RENDER_OWNERSHIP.md +0 -0
  73. {docvortex-0.4.3 → docvortex-0.4.5}/docs/sdk-0.4.md +0 -0
  74. {docvortex-0.4.3 → docvortex-0.4.5}/schemas/middle-2.0.json +0 -0
  75. {docvortex-0.4.3 → docvortex-0.4.5}/schemas/model-2.0.json +0 -0
  76. {docvortex-0.4.3 → docvortex-0.4.5}/setup.cfg +0 -0
  77. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/__init__.py +0 -0
  78. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/__init__.py +0 -0
  79. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/__init__.py +0 -0
  80. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  81. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  82. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  83. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  84. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  85. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  86. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  87. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  88. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  89. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  90. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  91. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/contracts.py +0 -0
  92. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/csv.py +0 -0
  93. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  94. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  95. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  96. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  97. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  98. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/package.py +0 -0
  99. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/properties.py +0 -0
  100. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  101. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  102. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  103. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/constants.py +0 -0
  104. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/converter.py +0 -0
  105. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/document.py +0 -0
  106. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/errors.py +0 -0
  107. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/metadata.py +0 -0
  108. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/resources.py +0 -0
  109. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/html/selector.py +0 -0
  110. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/models.py +0 -0
  111. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  112. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
  113. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  114. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
  115. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  116. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  117. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  118. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  119. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/models.py +0 -0
  120. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/package.py +0 -0
  121. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/path.py +0 -0
  122. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
  123. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
  124. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
  125. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/table.py +0 -0
  126. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  127. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
  128. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  129. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  130. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  131. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  132. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  133. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  134. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  135. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  136. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  137. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  138. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  139. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  140. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  141. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  142. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  143. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  144. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  145. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  146. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  147. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  148. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  149. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  150. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  151. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  152. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  153. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  154. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  155. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  156. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  157. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  158. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  159. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  160. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  161. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  162. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  163. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/errors.py +0 -0
  164. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/image.py +0 -0
  165. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  166. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  167. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  168. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  169. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/limits.py +0 -0
  170. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/metadata.py +0 -0
  171. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  172. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  173. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  174. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  175. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  176. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  177. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  178. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  179. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  180. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  181. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  182. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  183. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/opc.py +0 -0
  184. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  185. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  186. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  187. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  188. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  189. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  190. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  191. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  192. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  193. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  194. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  195. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  196. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  197. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  198. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  199. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  200. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  201. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  202. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  203. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  204. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  205. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
  206. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  207. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  208. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  209. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  210. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  211. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  212. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/streams.py +0 -0
  213. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  214. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  215. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  216. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  217. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  218. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  219. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  220. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  221. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  222. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  223. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  224. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  225. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  226. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  227. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  228. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
  229. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
  230. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +0 -0
  231. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
  232. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
  233. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
  234. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
  235. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
  236. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +0 -0
  237. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  238. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  239. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/formulas.py +0 -0
  240. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  241. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/graphics.py +0 -0
  242. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  243. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  244. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  245. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/detection.py +0 -0
  246. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  247. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  248. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/scripts.py +0 -0
  249. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  250. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  251. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/line_merging.py +0 -0
  252. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/models.py +0 -0
  253. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  254. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/pipeline.py +0 -0
  255. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  256. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  257. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  258. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  259. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  260. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  261. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  262. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  263. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  264. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  265. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +0 -0
  266. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +0 -0
  267. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  268. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  269. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  270. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  271. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  272. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  273. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  274. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  275. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  276. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  277. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  278. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  279. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  280. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  281. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  282. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  283. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/analyzers/pdf.py +0 -0
  284. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/api.py +0 -0
  285. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/assets/__init__.py +0 -0
  286. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/assets/images.py +0 -0
  287. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/assets/store.py +0 -0
  288. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/cli.py +0 -0
  289. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/__init__.py +0 -0
  290. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/html/__init__.py +0 -0
  291. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/html/contracts.py +0 -0
  292. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/html/materializer.py +0 -0
  293. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/html/parser.py +0 -0
  294. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/html/resources.py +0 -0
  295. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/codecs/json.py +0 -0
  296. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/__init__.py +0 -0
  297. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/inline.py +0 -0
  298. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/links.py +0 -0
  299. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/markup/__init__.py +0 -0
  300. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/markup/anchors.py +0 -0
  301. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/markup/formula.py +0 -0
  302. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/markup/projector.py +0 -0
  303. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/markup/styles.py +0 -0
  304. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/mathml.py +0 -0
  305. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/normalization.py +0 -0
  306. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/spans.py +0 -0
  307. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/__init__.py +0 -0
  308. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/blocks.py +0 -0
  309. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/content.py +0 -0
  310. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/document.py +0 -0
  311. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/html.py +0 -0
  312. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/models.py +0 -0
  313. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/rules.py +0 -0
  314. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/table/structure.py +0 -0
  315. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/text.py +0 -0
  316. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/content/tree.py +0 -0
  317. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/__init__.py +0 -0
  318. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/contracts.py +0 -0
  319. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/detection.py +0 -0
  320. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/filetypes.py +0 -0
  321. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/page_range.py +0 -0
  322. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/__init__.py +0 -0
  323. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/_document.py +0 -0
  324. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/classify.py +0 -0
  325. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/constants.py +0 -0
  326. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/font_runtime.py +0 -0
  327. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/images.py +0 -0
  328. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/layout.py +0 -0
  329. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/metadata.py +0 -0
  330. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_annotations.py +0 -0
  331. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_contracts.py +0 -0
  332. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  333. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  334. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_objects.py +0 -0
  335. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/native_text_geometry.py +0 -0
  336. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/pdfium.py +0 -0
  337. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/raster.py +0 -0
  338. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/text/__init__.py +0 -0
  339. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/text/_contracts.py +0 -0
  340. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/text/extract.py +0 -0
  341. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/text/geometry.py +0 -0
  342. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/text/groups.py +0 -0
  343. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/pdf/visuals.py +0 -0
  344. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/properties.py +0 -0
  345. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/document/source.py +0 -0
  346. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/errors.py +0 -0
  347. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/export/__init__.py +0 -0
  348. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/export/bundle.py +0 -0
  349. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/export/files.py +0 -0
  350. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/export/middle.py +0 -0
  351. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/__init__.py +0 -0
  352. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_coordinates.py +0 -0
  353. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_geometry.py +0 -0
  354. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_hyperlink.py +0 -0
  355. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_image.py +0 -0
  356. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_image_operations.py +0 -0
  357. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_image_payload.py +0 -0
  358. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/_text.py +0 -0
  359. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/image_encoding.py +0 -0
  360. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/language.py +0 -0
  361. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/type_identity.py +0 -0
  362. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/foundation/xml_names.py +0 -0
  363. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/geometry.py +0 -0
  364. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/metadata.py +0 -0
  365. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/options.py +0 -0
  366. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/__init__.py +0 -0
  367. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/content.py +0 -0
  368. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/document.py +0 -0
  369. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/lists.py +0 -0
  370. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/page_blocks.py +0 -0
  371. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/pages.py +0 -0
  372. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/paragraphs.py +0 -0
  373. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/postprocess/visual.py +0 -0
  374. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/public_api.py +0 -0
  375. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/__init__.py +0 -0
  376. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/__init__.py +0 -0
  377. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/__init__.py +0 -0
  378. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/context.py +0 -0
  379. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/html_table.py +0 -0
  380. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/index.py +0 -0
  381. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/list_items.py +0 -0
  382. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/common/planner.py +0 -0
  383. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  384. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/assets.py +0 -0
  385. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/inline.py +0 -0
  386. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/math.py +0 -0
  387. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  388. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/styles.py +0 -0
  389. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/docx/table.py +0 -0
  390. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  391. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/assets.py +0 -0
  392. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/package.py +0 -0
  393. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  394. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/html/__init__.py +0 -0
  395. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/html/inline.py +0 -0
  396. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/html/renderer.py +0 -0
  397. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  398. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/html/table.py +0 -0
  399. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  400. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/assets.py +0 -0
  401. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/inline.py +0 -0
  402. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  403. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/latex/table.py +0 -0
  404. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  405. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  406. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  407. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  408. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  409. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  410. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/markdown/table.py +0 -0
  411. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  412. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  413. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
  414. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
  415. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  416. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
  417. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  418. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  419. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/api.py +0 -0
  420. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/contracts.py +0 -0
  421. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/docx.py +0 -0
  422. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/epub.py +0 -0
  423. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/fragments.py +0 -0
  424. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/html.py +0 -0
  425. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/latex.py +0 -0
  426. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/markdown.py +0 -0
  427. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/pdf.py +0 -0
  428. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/render/structured_content.py +0 -0
  429. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/epub/docvortex.css +0 -0
  430. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  431. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  432. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/fonts/NOTICE +0 -0
  433. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/fonts/manifest.json +0 -0
  434. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/html/docvortex.css +0 -0
  435. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/resources/html/docvortex.min.css +0 -0
  436. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/result.py +0 -0
  437. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/schema.py +0 -0
  438. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex/visualization.py +0 -0
  439. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex.egg-info/dependency_links.txt +0 -0
  440. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex.egg-info/entry_points.txt +0 -0
  441. {docvortex-0.4.3 → docvortex-0.4.5}/src/docvortex.egg-info/top_level.txt +0 -0
  442. {docvortex-0.4.3 → docvortex-0.4.5}/tests/benchmarks/flash_pdf.py +0 -0
  443. {docvortex-0.4.3 → docvortex-0.4.5}/tests/benchmarks/pipeline.py +0 -0
  444. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  445. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  446. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/flash_layout_geometry_manifest.json +0 -0
  447. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  448. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  449. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  450. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  451. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  452. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  453. {docvortex-0.4.3 → docvortex-0.4.5}/tests/fixtures/rtf/semantic.rtf +0 -0
  454. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_architecture.py +0 -0
  455. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_brand_protocol.py +0 -0
  456. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_cli_logging.py +0 -0
  457. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_complete_pipeline.py +0 -0
  458. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_converter_lifecycle.py +0 -0
  459. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_document_envelope.py +0 -0
  460. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_document_metadata.py +0 -0
  461. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_format_matrix.py +0 -0
  462. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_geometry_api.py +0 -0
  463. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_html_namespace.py +0 -0
  464. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_mixed_font_script_reference.py +0 -0
  465. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_analysis_api.py +0 -0
  466. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_font_geometry.py +0 -0
  467. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_font_runtime.py +0 -0
  468. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_model_text_normalization.py +0 -0
  469. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_output_text.py +0 -0
  470. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_render_pool.py +0 -0
  471. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_source_row_merging.py +0 -0
  472. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_pdf_symbol_normalization.py +0 -0
  473. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_public_export_api.py +0 -0
  474. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_public_image_api.py +0 -0
  475. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_public_pipeline.py +0 -0
  476. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_refactor_raster.py +0 -0
  477. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_refactor_rendering.py +0 -0
  478. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_refactor_resources.py +0 -0
  479. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_render_ownership.py +0 -0
  480. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_renderer_branding.py +0 -0
  481. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_shared_boundaries.py +0 -0
  482. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_system_font_pdf_pipeline.py +0 -0
  483. {docvortex-0.4.3 → docvortex-0.4.5}/tests/test_validated_geometry.py +0 -0
  484. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  485. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_epub_test_utils.py +0 -0
  486. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  487. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_image_mtef_test_utils.py +0 -0
  488. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  489. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  490. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  491. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_metafile_test_utils.py +0 -0
  492. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_mtef_test_utils.py +0 -0
  493. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  494. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_native_test_utils.py +0 -0
  495. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_odf_test_utils.py +0 -0
  496. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_ofd_test_utils.py +0 -0
  497. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  498. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  499. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/_span_test_utils.py +0 -0
  500. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  501. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  502. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  503. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  504. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  505. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  506. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  507. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  508. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  509. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  510. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  511. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  512. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  513. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  514. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  515. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  516. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/pdfs/test.pdf +0 -0
  517. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_backend_architecture.py +0 -0
  518. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  519. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_assets.py +0 -0
  520. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_complex_fields.py +0 -0
  521. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_math.py +0 -0
  522. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_render.py +0 -0
  523. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_special_char_tables.py +0 -0
  524. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_docx_table.py +0 -0
  525. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_emfplus_integration.py +0 -0
  526. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_epub_backlinks.py +0 -0
  527. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  528. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_epub_render.py +0 -0
  529. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_csv.py +0 -0
  530. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  531. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_epub.py +0 -0
  532. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_html.py +0 -0
  533. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_image_mtef.py +0 -0
  534. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  535. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_doc.py +0 -0
  536. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  537. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  538. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_xls.py +0 -0
  539. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  540. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_markup_anchors.py +0 -0
  541. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_model.py +0 -0
  542. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_mtef_v5.py +0 -0
  543. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_odf.py +0 -0
  544. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_ofd.py +0 -0
  545. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  546. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_metafile.py +0 -0
  547. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_models.py +0 -0
  548. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  549. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  550. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_office_title_types.py +0 -0
  551. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  552. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  553. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  554. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  555. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  556. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
  557. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  558. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  559. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  560. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  561. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  562. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  563. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  564. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_samples.py +0 -0
  565. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  566. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  567. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_tables.py +0 -0
  568. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  569. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_titles.py +0 -0
  570. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  571. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_rtf.py +0 -0
  572. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_shared_helpers.py +0 -0
  573. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  574. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  575. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_html_css_build.py +0 -0
  576. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_html_render.py +0 -0
  577. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_html_security.py +0 -0
  578. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  579. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_latex_render.py +0 -0
  580. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_markdown_render.py +0 -0
  581. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_middle_json_block_models.py +0 -0
  582. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_middle_json_export.py +0 -0
  583. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_middle_json_validator.py +0 -0
  584. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_model_json.py +0 -0
  585. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table.py +0 -0
  586. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  587. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  588. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  589. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  590. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_ofd_assembly.py +0 -0
  591. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_ofd_vector_tables.py +0 -0
  592. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_office_demo_exports.py +0 -0
  593. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_office_demo_pages.py +0 -0
  594. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_office_parser_regressions.py +0 -0
  595. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
  596. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_classify.py +0 -0
  597. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_demo_links.py +0 -0
  598. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_document.py +0 -0
  599. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_pagination.py +0 -0
  600. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_render.py +0 -0
  601. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  602. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_text_styles.py +0 -0
  603. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_title_font_plan.py +0 -0
  604. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_title_space.py +0 -0
  605. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_pdf_visualization.py +0 -0
  606. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  607. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_postprocess_pages.py +0 -0
  608. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  609. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_postprocess_visual.py +0 -0
  610. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_render_api.py +0 -0
  611. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_render_html_table.py +0 -0
  612. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_render_image_renderer.py +0 -0
  613. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_render_list_index_utils.py +0 -0
  614. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_structured_content_render.py +0 -0
  615. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_table_merge.py +0 -0
  616. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  617. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_text_block_anchor.py +0 -0
  618. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_text_boundary_rules.py +0 -0
  619. {docvortex-0.4.3 → docvortex-0.4.5}/tests/unittest/test_text_utils.py +0 -0
  620. {docvortex-0.4.3 → docvortex-0.4.5}/tools/__init__.py +0 -0
  621. {docvortex-0.4.3 → docvortex-0.4.5}/tools/build_html_css.py +0 -0
  622. {docvortex-0.4.3 → docvortex-0.4.5}/tools/calibrate_pdf_geometry.py +0 -0
  623. {docvortex-0.4.3 → docvortex-0.4.5}/tools/capture_baseline.py +0 -0
  624. {docvortex-0.4.3 → docvortex-0.4.5}/tools/capture_platform_layout.py +0 -0
  625. {docvortex-0.4.3 → docvortex-0.4.5}/tools/compare_font_platforms.py +0 -0
  626. {docvortex-0.4.3 → docvortex-0.4.5}/tools/font_geometry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docvortex
3
- Version: 0.4.3
3
+ Version: 0.4.5
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,13 +36,14 @@ 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
43
43
  Provides-Extra: test
44
44
  Requires-Dist: pytest; extra == "test"
45
45
  Requires-Dist: pytest-cov; extra == "test"
46
+ Requires-Dist: pytest-xdist<4,>=3.8; extra == "test"
46
47
  Requires-Dist: markdown; extra == "test"
47
48
  Requires-Dist: jsonschema<5,>=4; extra == "test"
48
49
  Provides-Extra: dev
@@ -182,7 +183,7 @@ reads metadata without parsing the document body.
182
183
 
183
184
  - **Text PDFs:** native parsing uses the document's existing text and structure. Scanned pages requiring OCR need an external OCR or inference service.
184
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.
185
- - **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).
186
187
 
187
188
  ## Documentation
188
189
 
@@ -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,12 +27,12 @@ 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
 
34
34
  [project.optional-dependencies]
35
- test = ["pytest", "pytest-cov", "markdown", "jsonschema>=4,<5"]
35
+ test = ["pytest", "pytest-cov", "pytest-xdist>=3.8,<4", "markdown", "jsonschema>=4,<5"]
36
36
  dev = ["ruff==0.14.2", "build", "twine"]
37
37
 
38
38
  [project.urls]
@@ -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 (
@@ -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
  }
@@ -32,7 +32,7 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
32
32
  table_bbox = normalize_bbox(table_input.table_bbox)
33
33
  if table_bbox is None:
34
34
  return []
35
- selected: list[tuple[int, int, Char]] = []
35
+ selected: list[tuple[int, int, Char, BBox]] = []
36
36
  for fallback_index, char in enumerate(table_input.chars):
37
37
  char_bbox = normalize_bbox(char.get("bbox"))
38
38
  if char_bbox is None:
@@ -44,14 +44,14 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
44
44
  source_index = int(char.get("char_idx", fallback_index))
45
45
  except (TypeError, ValueError):
46
46
  source_index = fallback_index
47
- selected.append((source_index, fallback_index, char))
47
+ selected.append((source_index, fallback_index, char, char_bbox))
48
48
 
49
49
  selected.sort(key=lambda item: (item[0], item[1]))
50
50
  output: list[_PendingGlyph] = []
51
51
  angle = normalize_angle(table_input.angle)
52
52
  pending_space = False
53
53
  pending_break = False
54
- for _source_sort, fallback_index, char in selected:
54
+ for source_index, _fallback_index, char, absolute_bbox in selected:
55
55
  raw_text = str(char.get("char") or "")
56
56
  if not raw_text:
57
57
  continue
@@ -66,9 +66,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
66
66
  text = _normalize_table_text(raw_text)
67
67
  if not text or text.isspace():
68
68
  continue
69
- absolute_bbox = normalize_bbox(char.get("bbox"))
70
- if absolute_bbox is None:
71
- continue
72
69
  local_bbox = page_bbox_to_table_local(
73
70
  absolute_bbox,
74
71
  table_bbox,
@@ -76,10 +73,6 @@ def _select_pending_glyphs(table_input: NativeTableInput) -> list[_PendingGlyph]
76
73
  )
77
74
  if local_bbox is None or local_bbox[3] - local_bbox[1] < 0.5:
78
75
  continue
79
- try:
80
- source_index = int(char.get("char_idx", fallback_index))
81
- except (TypeError, ValueError):
82
- source_index = fallback_index
83
76
  output.append(
84
77
  _PendingGlyph(
85
78
  glyph_id=len(output),
@@ -153,7 +146,14 @@ def _assign_visual_rows(
153
146
  )
154
147
  else:
155
148
  rows[best_index].append(glyph)
156
- row_bboxes[best_index] = bbox_union([row_bboxes[best_index], glyph.bbox])
149
+ # 两框合并保持原 min/max 顺序,避免为每个字符建立通用迭代器。
150
+ previous_bbox = row_bboxes[best_index]
151
+ row_bboxes[best_index] = (
152
+ min(previous_bbox[0], glyph.bbox[0]),
153
+ min(previous_bbox[1], glyph.bbox[1]),
154
+ max(previous_bbox[2], glyph.bbox[2]),
155
+ max(previous_bbox[3], glyph.bbox[3]),
156
+ )
157
157
  for row_index in range(best_index, len(row_bboxes)):
158
158
  prefix_max_bottoms[row_index] = max(
159
159
  prefix_max_bottoms[row_index - 1] if row_index > 0 else row_bboxes[row_index][3],
@@ -170,7 +170,11 @@ def _assign_visual_rows(
170
170
  def _contains_cjk(text: str) -> bool:
171
171
  """判断文本是否包含常见中日韩统一表意字符。"""
172
172
 
173
- return any("\u3400" <= char <= "\u9fff" for char in text)
173
+ # 组行热路径通常只传入相邻两个字符,直接遍历避免逐次创建生成器。
174
+ for char in text:
175
+ if "\u3400" <= char <= "\u9fff":
176
+ return True
177
+ return False
174
178
 
175
179
 
176
180
  def _join_glyph_line(
@@ -248,12 +252,14 @@ def _cell_row_separator(
248
252
  def _glyph_line_parts(
249
253
  glyphs: list[NativeTableGlyph] | list[_PendingGlyph],
250
254
  median_height: float,
255
+ *,
256
+ presorted: bool = False,
251
257
  ) -> list[tuple[str, int | None]]:
252
258
  """重建单行文本片段,并保留每个可见片段的原字符索引。"""
253
259
 
254
260
  if not glyphs:
255
261
  return []
256
- ordered = sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
262
+ ordered = glyphs if presorted else sorted(glyphs, key=lambda glyph: (glyph.bbox[0], glyph.bbox[1], glyph.glyph_id))
257
263
  parts: list[tuple[str, int | None]] = [(ordered[0].text, ordered[0].source_index)]
258
264
  previous = ordered[0]
259
265
  for glyph in ordered[1:]:
@@ -292,7 +298,8 @@ def _tokenize_row(
292
298
  groups[-1].append(glyph)
293
299
  tokens: list[NativeTableToken] = []
294
300
  for group in groups:
295
- content = _join_glyph_line(group, median_height)
301
+ # group 是视觉行按同一排序键切出的连续片段,不必再次排序。
302
+ content = "".join(text for text, _source_index in _glyph_line_parts(group, median_height, presorted=True))
296
303
  if not content:
297
304
  continue
298
305
  tokens.append(
@@ -47,6 +47,78 @@ class _CanonicalTrack:
47
47
  aliases: tuple[float, ...]
48
48
 
49
49
 
50
+ class _IndexedRules(list[_MergedRule]):
51
+ """保存单次候选构造中的只读线段及轨道区间缓存,使用期间不修改线段。"""
52
+
53
+ def __init__(self, rules: list[_MergedRule]) -> None:
54
+ """按方向分组并保留原始线段顺序,缓存随当前表格调用释放。"""
55
+ super().__init__(rules)
56
+ self._oriented = {
57
+ orientation: tuple(rule for rule in rules if rule.orientation == orientation)
58
+ for orientation in ("horizontal", "vertical")
59
+ }
60
+ self._intervals: dict[tuple[str, tuple[float, ...], float], list[tuple[float, float]]] = {}
61
+ self._coverages: dict[tuple[str, tuple[float, ...], float, float, float], float] = {}
62
+
63
+ def coverage(self, orientation: str, aliases: tuple[float, ...], start: float, end: float, tolerance: float) -> float:
64
+ """复用轨道匹配和相同查询,区间覆盖仍执行原有裁剪与浮点累加。"""
65
+ key = orientation, aliases, tolerance
66
+ coverage_key = (*key, start, end)
67
+ cached = self._coverages.get(coverage_key)
68
+ if cached is not None:
69
+ return cached
70
+ intervals = self._intervals.get(key)
71
+ if intervals is None:
72
+ oriented = self._oriented.get(orientation, ())
73
+ if len(aliases) == 1:
74
+ coordinate = aliases[0]
75
+ intervals = [(rule.start, rule.end) for rule in oriented if abs(rule.coordinate - coordinate) <= tolerance]
76
+ else:
77
+ intervals = [
78
+ (rule.start, rule.end)
79
+ for rule in oriented
80
+ if any(abs(rule.coordinate - alias) <= tolerance for alias in aliases)
81
+ ]
82
+ self._intervals[key] = intervals
83
+ result = covered_interval_ratio(intervals, start, end)
84
+ self._coverages[coverage_key] = result
85
+ return result
86
+
87
+
88
+ @dataclass(frozen=True, slots=True)
89
+ class _RulePreparation:
90
+ """保存相同裁剪范围的线段与原始轨道,供 raw/supported 假设复用。"""
91
+
92
+ fragments: list[_MergedRule]
93
+ rules: _IndexedRules
94
+ inferred: tuple[list[float], list[float], list[float]]
95
+
96
+
97
+ def _prepare_rule_evidence(
98
+ table_input: NativeTableInput,
99
+ snap_tolerance: float,
100
+ join_gap: float,
101
+ width: float,
102
+ height: float,
103
+ *,
104
+ include_drawing: bool,
105
+ include_rectangles: bool,
106
+ evidence_halo: float,
107
+ ) -> _RulePreparation:
108
+ """一次构造裁剪、合并和原始轨道证据,不缓存后续假设判定。"""
109
+ fragments = _local_rule_fragments(
110
+ table_input,
111
+ snap_tolerance,
112
+ include_drawing=include_drawing,
113
+ include_rectangles=include_rectangles,
114
+ evidence_halo=evidence_halo,
115
+ )
116
+ if evidence_halo == 0.0 and (not fragments or len(fragments) > MAX_PRIMITIVES_PER_TABLE):
117
+ return _RulePreparation(fragments, _IndexedRules([]), ([], [], []))
118
+ rules = _IndexedRules(_merge_rule_fragments(fragments, snap_tolerance, join_gap))
119
+ return _RulePreparation(fragments, rules, _infer_grid_tracks(rules, snap_tolerance, width, height))
120
+
121
+
50
122
  @dataclass(frozen=True, slots=True)
51
123
  class _PhysicalRowEvidence:
52
124
  """保存一个原子行由 drawing 独立验证的边界可靠度。"""
@@ -710,6 +782,8 @@ def _separator_coverage_for_track(
710
782
  ) -> float:
711
783
  """按规范轨道全部 alias 合并计算 separator 覆盖率。"""
712
784
 
785
+ if isinstance(rules, _IndexedRules):
786
+ return rules.coverage(orientation, track.aliases, start, end, snap_tolerance)
713
787
  intervals = [
714
788
  (rule.start, rule.end)
715
789
  for rule in rules
@@ -787,6 +861,8 @@ def _separator_coverage(
787
861
  ) -> float:
788
862
  """计算指定潜在隔断被同轴物理线段覆盖的比例。"""
789
863
 
864
+ if isinstance(rules, _IndexedRules):
865
+ return rules.coverage(orientation, (coordinate,), start, end, snap_tolerance)
790
866
  intervals = [
791
867
  (rule.start, rule.end)
792
868
  for rule in rules
@@ -1196,6 +1272,7 @@ def _build_vector_tracks(
1196
1272
  include_rectangles: bool,
1197
1273
  prune_unsupported_horizontal: bool,
1198
1274
  diagnostics: dict[str, Any] | None,
1275
+ rule_cache: dict[tuple[bool, bool, float], _RulePreparation] | None = None,
1199
1276
  ) -> _VectorTracks | None:
1200
1277
  """构造并规范化轨道,保持 halo、别名及物理行数的原有拒绝顺序。"""
1201
1278
 
@@ -1225,26 +1302,26 @@ def _build_vector_tracks(
1225
1302
  table_bbox,
1226
1303
  normalize_angle(table_input.angle),
1227
1304
  )
1228
- exact_fragments = _local_rule_fragments(
1229
- table_input,
1230
- snap_tolerance,
1231
- include_drawing=include_drawing,
1232
- include_rectangles=include_rectangles,
1233
- evidence_halo=0.0,
1234
- )
1305
+ if rule_cache is None:
1306
+ rule_cache = {}
1307
+ exact_key = include_drawing, include_rectangles, 0.0
1308
+ exact = rule_cache.get(exact_key)
1309
+ if exact is None:
1310
+ exact = _prepare_rule_evidence(
1311
+ table_input,
1312
+ snap_tolerance,
1313
+ join_gap,
1314
+ local_width,
1315
+ local_height,
1316
+ include_drawing=include_drawing,
1317
+ include_rectangles=include_rectangles,
1318
+ evidence_halo=0.0,
1319
+ )
1320
+ rule_cache[exact_key] = exact
1321
+ exact_fragments = exact.fragments
1235
1322
  if not exact_fragments or len(exact_fragments) > MAX_PRIMITIVES_PER_TABLE:
1236
1323
  return _reject_vector_candidate(diagnostics, "raw_fragments")
1237
- exact_rules = _merge_rule_fragments(
1238
- exact_fragments,
1239
- snap_tolerance,
1240
- join_gap,
1241
- )
1242
- exact_x_tracks, exact_y_tracks, _removed = _infer_grid_tracks(
1243
- exact_rules,
1244
- snap_tolerance,
1245
- local_width,
1246
- local_height,
1247
- )
1324
+ exact_x_tracks, exact_y_tracks, _removed = exact.inferred
1248
1325
  # 多行表格保持原始 bbox 裁剪;halo 只服务可能退化为单物理行的
1249
1326
  # 边界片段,避免吸入相邻行或页外端点改变既有拓扑。
1250
1327
  single_column_halo_hint = (
@@ -1278,29 +1355,29 @@ def _build_vector_tracks(
1278
1355
  else 0.0
1279
1356
  )
1280
1357
  if evidence_halo > 0:
1281
- raw_fragments = _local_rule_fragments(
1282
- table_input,
1283
- snap_tolerance,
1284
- include_drawing=include_drawing,
1285
- include_rectangles=include_rectangles,
1286
- evidence_halo=evidence_halo,
1287
- )
1288
- rules = _merge_rule_fragments(
1289
- raw_fragments,
1290
- snap_tolerance,
1291
- join_gap,
1292
- )
1358
+ halo_key = include_drawing, include_rectangles, evidence_halo
1359
+ prepared = rule_cache.get(halo_key)
1360
+ if prepared is None:
1361
+ prepared = _prepare_rule_evidence(
1362
+ table_input,
1363
+ snap_tolerance,
1364
+ join_gap,
1365
+ local_width,
1366
+ local_height,
1367
+ include_drawing=include_drawing,
1368
+ include_rectangles=include_rectangles,
1369
+ evidence_halo=evidence_halo,
1370
+ )
1371
+ rule_cache[halo_key] = prepared
1293
1372
  else:
1294
- raw_fragments = exact_fragments
1295
- rules = exact_rules
1373
+ prepared = exact
1374
+ raw_fragments, rules = prepared.fragments, prepared.rules
1296
1375
  if diagnostics is not None:
1297
1376
  diagnostics["raw_fragment_count"] = len(raw_fragments)
1298
- inferred_x_tracks, inferred_y_tracks, removed_horizontal_tracks = _infer_grid_tracks(
1299
- rules,
1300
- snap_tolerance,
1301
- local_width,
1302
- local_height,
1303
- prune_unsupported_horizontal=prune_unsupported_horizontal,
1377
+ inferred_x_tracks, inferred_y_tracks, removed_horizontal_tracks = (
1378
+ _infer_grid_tracks(rules, snap_tolerance, local_width, local_height, prune_unsupported_horizontal=True)
1379
+ if prune_unsupported_horizontal
1380
+ else prepared.inferred
1304
1381
  )
1305
1382
  if diagnostics is not None:
1306
1383
  diagnostics["track_hypothesis"] = "supported" if prune_unsupported_horizontal else "raw"
@@ -1824,6 +1901,7 @@ def _build_vector_candidate(
1824
1901
  evidence_label: str,
1825
1902
  prune_unsupported_horizontal: bool = False,
1826
1903
  diagnostics: dict[str, Any] | None = None,
1904
+ rule_cache: dict[tuple[bool, bool, float], _RulePreparation] | None = None,
1827
1905
  ) -> NativeTableCandidate | None:
1828
1906
  """按轨道、拓扑、文本落格及评分的固定顺序构造矢量候选。"""
1829
1907
 
@@ -1836,6 +1914,7 @@ def _build_vector_candidate(
1836
1914
  include_rectangles=include_rectangles,
1837
1915
  prune_unsupported_horizontal=prune_unsupported_horizontal,
1838
1916
  diagnostics=diagnostics,
1917
+ rule_cache=rule_cache,
1839
1918
  )
1840
1919
  if tracks is None:
1841
1920
  return None
@@ -1853,6 +1932,7 @@ def build_vector_candidates(
1853
1932
  """分别从 drawing 中心线和矩形晶格生成矢量网格候选。"""
1854
1933
 
1855
1934
  candidates: list[NativeTableCandidate] = []
1935
+ rule_cache: dict[tuple[bool, bool, float], _RulePreparation] = {}
1856
1936
  raw_line_diagnostics: dict[str, Any] | None = {} if diagnostics is not None else None
1857
1937
  line_candidate = _build_vector_candidate(
1858
1938
  table_input,
@@ -1861,6 +1941,7 @@ def build_vector_candidates(
1861
1941
  include_rectangles=False,
1862
1942
  evidence_label="line_grid",
1863
1943
  diagnostics=raw_line_diagnostics,
1944
+ rule_cache=rule_cache,
1864
1945
  )
1865
1946
  line_hypotheses = [raw_line_diagnostics] if raw_line_diagnostics is not None else []
1866
1947
  selected_line_diagnostics = raw_line_diagnostics
@@ -1874,6 +1955,7 @@ def build_vector_candidates(
1874
1955
  evidence_label="line_grid",
1875
1956
  prune_unsupported_horizontal=True,
1876
1957
  diagnostics=supported_line_diagnostics,
1958
+ rule_cache=rule_cache,
1877
1959
  )
1878
1960
  if supported_line_diagnostics is not None:
1879
1961
  removed_tracks = supported_line_diagnostics.get(
@@ -1900,6 +1982,7 @@ def build_vector_candidates(
1900
1982
  include_rectangles=True,
1901
1983
  evidence_label="rect_grid",
1902
1984
  diagnostics=rect_diagnostics,
1985
+ rule_cache=rule_cache,
1903
1986
  )
1904
1987
  if diagnostics is not None and rect_diagnostics is not None:
1905
1988
  diagnostics.append(rect_diagnostics)
@@ -2,18 +2,24 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from ....document.pdf.text._contracts import Bbox
5
6
  from ....schema import BBox
6
7
 
7
8
 
8
9
  def normalize_bbox(value: object) -> BBox | None:
9
10
  """把任意四元组规范为有效浮点 bbox,异常或退化框返回空。"""
10
11
 
12
+ # 自有 Bbox 的下标协议仅转发底层数组,直接读取可避免每个框五次 Python 调用。
13
+ # 只匹配精确类型,第三方可迭代对象及覆盖下标行为的子类仍走原协议。
14
+ if type(value) is Bbox:
15
+ value = value.bbox
11
16
  try:
12
17
  x0, y0, x1, y1 = [float(item) for item in value] # type: ignore[arg-type]
13
18
  except (TypeError, ValueError):
14
19
  return None
15
- left, right = sorted((x0, x1))
16
- top, bottom = sorted((y0, y1))
20
+ # 与两个元素的稳定排序使用相同比较方向,保留相等值及 NaN 的顺序。
21
+ left, right = (x1, x0) if x1 < x0 else (x0, x1)
22
+ top, bottom = (y1, y0) if y1 < y0 else (y0, y1)
17
23
  if right <= left or bottom <= top:
18
24
  return None
19
25
  return left, top, right, bottom