docvortex 0.4.5__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 (633) hide show
  1. {docvortex-0.4.5/src/docvortex.egg-info → docvortex-0.4.6}/PKG-INFO +3 -3
  2. {docvortex-0.4.5 → docvortex-0.4.6}/README.md +2 -2
  3. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_script_geometry.py +55 -0
  4. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/engine.py +11 -3
  5. docvortex-0.4.6/src/docvortex/analyzers/native/pdf/_table_recovery/rule_band.py +135 -0
  6. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text.py +4 -0
  7. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/auxiliary_text.py +15 -1
  8. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/formulas.py +123 -0
  9. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/graphics.py +18 -5
  10. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/detection.py +7 -0
  11. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/scripts.py +2 -2
  12. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_merging.py +27 -2
  13. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/models.py +1 -0
  14. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/pipeline.py +8 -1
  15. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/annotations.py +11 -0
  16. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/assembly.py +16 -1
  17. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/_document.py +0 -34
  18. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_contracts.py +0 -12
  19. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_objects.py +11 -1
  20. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_text_geometry.py +4 -158
  21. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/_contracts.py +4 -0
  22. docvortex-0.4.6/src/docvortex/document/pdf/text/dedup.py +475 -0
  23. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/extract.py +81 -48
  24. docvortex-0.4.6/src/docvortex/resources/unicode/EquivalentUnifiedIdeograph-17.0.0.txt +410 -0
  25. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/version.py +1 -1
  26. {docvortex-0.4.5 → docvortex-0.4.6/src/docvortex.egg-info}/PKG-INFO +3 -3
  27. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/SOURCES.txt +9 -0
  28. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_geometry_manifest.json +1 -1
  29. docvortex-0.4.6/tests/fixtures/pdf_char_dedup.json +2142 -0
  30. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/bloom_form_labels.pdf +0 -0
  31. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/journal_layout_tables.pdf +0 -0
  32. docvortex-0.4.6/tests/unittest/pdfs/flash_layout/math_display_formulas.pdf +0 -0
  33. docvortex-0.4.6/tests/unittest/test_flash_pdf_layout_repairs.py +279 -0
  34. docvortex-0.4.6/tests/unittest/test_pdf_text_dedup.py +309 -0
  35. {docvortex-0.4.5 → docvortex-0.4.6}/LICENSE.md +0 -0
  36. {docvortex-0.4.5 → docvortex-0.4.6}/MANIFEST.in +0 -0
  37. {docvortex-0.4.5 → docvortex-0.4.6}/demo/README.md +0 -0
  38. {docvortex-0.4.5 → docvortex-0.4.6}/demo/demo.py +0 -0
  39. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/README.md +0 -0
  40. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/docx_01.doc +0 -0
  41. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/docx_01.docx +0 -0
  42. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/pptx_01.ppt +0 -0
  43. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/pptx_01.pptx +0 -0
  44. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/rtf_01.rtf +0 -0
  45. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xls +0 -0
  46. {docvortex-0.4.5 → docvortex-0.4.6}/demo/office_docs/xlsx_01.xlsx +0 -0
  47. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/2407.00079v4_origi-10.pdf +0 -0
  48. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/IEBM_A_2667169_O-5.pdf +0 -0
  49. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/caibao1.pdf +0 -0
  50. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo1.pdf +0 -0
  51. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo2.pdf +0 -0
  52. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo3.pdf +0 -0
  53. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo4.pdf +0 -0
  54. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/demo6.pdf +0 -0
  55. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_03_06.pdf +0 -0
  56. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_07_10.pdf +0 -0
  57. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_11_15.pdf +0 -0
  58. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/mixed_elements_pages_39_40.pdf +0 -0
  59. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs/small_ocr.pdf +0 -0
  60. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/207.pdf" +0 -0
  61. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2072.pdf" +0 -0
  62. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2073.pdf" +0 -0
  63. {docvortex-0.4.5 → docvortex-0.4.6}/demo/pdfs//344/270/255/346/226/207/350/256/272/346/226/2074.pdf" +0 -0
  64. {docvortex-0.4.5 → docvortex-0.4.6}/docs/HTML_PROTOCOL.md +0 -0
  65. {docvortex-0.4.5 → docvortex-0.4.6}/docs/JSON_PROTOCOL.md +0 -0
  66. {docvortex-0.4.5 → docvortex-0.4.6}/docs/METADATA.md +0 -0
  67. {docvortex-0.4.5 → docvortex-0.4.6}/docs/PDF_FONTS.md +0 -0
  68. {docvortex-0.4.5 → docvortex-0.4.6}/docs/RENDER_OWNERSHIP.md +0 -0
  69. {docvortex-0.4.5 → docvortex-0.4.6}/docs/USAGE.md +0 -0
  70. {docvortex-0.4.5 → docvortex-0.4.6}/docs/sdk-0.4.md +0 -0
  71. {docvortex-0.4.5 → docvortex-0.4.6}/pyproject.toml +0 -0
  72. {docvortex-0.4.5 → docvortex-0.4.6}/schemas/middle-2.0.json +0 -0
  73. {docvortex-0.4.5 → docvortex-0.4.6}/schemas/model-2.0.json +0 -0
  74. {docvortex-0.4.5 → docvortex-0.4.6}/setup.cfg +0 -0
  75. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/__init__.py +0 -0
  76. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/__init__.py +0 -0
  77. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/__init__.py +0 -0
  78. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/__init__.py +0 -0
  79. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/hyperlink.py +0 -0
  80. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/image.py +0 -0
  81. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/__init__.py +0 -0
  82. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/anchors.py +0 -0
  83. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/formula.py +0 -0
  84. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/projector.py +0 -0
  85. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/markup/styles.py +0 -0
  86. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/mathml.py +0 -0
  87. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/names.py +0 -0
  88. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/_shared/xycut.py +0 -0
  89. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/contracts.py +0 -0
  90. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/csv.py +0 -0
  91. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/__init__.py +0 -0
  92. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/constants.py +0 -0
  93. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/converter.py +0 -0
  94. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/errors.py +0 -0
  95. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/metadata.py +0 -0
  96. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/package.py +0 -0
  97. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/properties.py +0 -0
  98. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/epub/xhtml.py +0 -0
  99. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/__init__.py +0 -0
  100. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/anchors.py +0 -0
  101. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/constants.py +0 -0
  102. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/converter.py +0 -0
  103. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/document.py +0 -0
  104. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/errors.py +0 -0
  105. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/metadata.py +0 -0
  106. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/resources.py +0 -0
  107. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/html/selector.py +0 -0
  108. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/models.py +0 -0
  109. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/__init__.py +0 -0
  110. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/assembly.py +0 -0
  111. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/constants.py +0 -0
  112. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/converter.py +0 -0
  113. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/errors.py +0 -0
  114. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/geometry.py +0 -0
  115. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/images.py +0 -0
  116. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/metadata.py +0 -0
  117. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/models.py +0 -0
  118. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/package.py +0 -0
  119. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/path.py +0 -0
  120. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/reading_order.py +0 -0
  121. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/resources.py +0 -0
  122. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/scene.py +0 -0
  123. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/table.py +0 -0
  124. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/text.py +0 -0
  125. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/ofd/vector.py +0 -0
  126. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/__init__.py +0 -0
  127. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/__init__.py +0 -0
  128. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/bookmarks.py +0 -0
  129. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/doc_converter.py +0 -0
  130. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fib.py +0 -0
  131. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/fields.py +0 -0
  132. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/formatting.py +0 -0
  133. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/images.py +0 -0
  134. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/lists.py +0 -0
  135. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/models.py +0 -0
  136. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/parser.py +0 -0
  137. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/pieces.py +0 -0
  138. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/records.py +0 -0
  139. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/sprm.py +0 -0
  140. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/doc/styles.py +0 -0
  141. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/__init__.py +0 -0
  142. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/context.py +0 -0
  143. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/docx_converter.py +0 -0
  144. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/equationxml.py +0 -0
  145. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/fields.py +0 -0
  146. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/formatting_types.py +0 -0
  147. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/main.py +0 -0
  148. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/numbering.py +0 -0
  149. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/office_xml.py +0 -0
  150. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/package_normalizer.py +0 -0
  151. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/resources.py +0 -0
  152. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/styles.py +0 -0
  153. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/docx/tables.py +0 -0
  154. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/__init__.py +0 -0
  155. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/image.py +0 -0
  156. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/latex_dict.py +0 -0
  157. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef.py +0 -0
  158. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/mtef_v5.py +0 -0
  159. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/omml.py +0 -0
  160. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/equation/ooxml.py +0 -0
  161. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/errors.py +0 -0
  162. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/image.py +0 -0
  163. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/__init__.py +0 -0
  164. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/binary.py +0 -0
  165. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/officeart.py +0 -0
  166. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/legacy/ole.py +0 -0
  167. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/limits.py +0 -0
  168. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/metadata.py +0 -0
  169. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/__init__.py +0 -0
  170. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/chart.py +0 -0
  171. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/constants.py +0 -0
  172. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/converters.py +0 -0
  173. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/errors.py +0 -0
  174. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/metadata.py +0 -0
  175. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/models.py +0 -0
  176. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/package.py +0 -0
  177. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/styles.py +0 -0
  178. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/table.py +0 -0
  179. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/odf/text.py +0 -0
  180. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ooxml_chart.py +0 -0
  181. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/opc.py +0 -0
  182. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/__init__.py +0 -0
  183. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/models.py +0 -0
  184. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/parser.py +0 -0
  185. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/ppt_converter.py +0 -0
  186. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/records.py +0 -0
  187. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/ppt/style_text.py +0 -0
  188. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/__init__.py +0 -0
  189. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/context.py +0 -0
  190. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/lists.py +0 -0
  191. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/main.py +0 -0
  192. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/package_normalizer.py +0 -0
  193. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/pptx_converter.py +0 -0
  194. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/resources.py +0 -0
  195. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/shapes.py +0 -0
  196. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/text_styles.py +0 -0
  197. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/pptx/titles.py +0 -0
  198. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rich_text.py +0 -0
  199. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/__init__.py +0 -0
  200. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/converter.py +0 -0
  201. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/lexer.py +0 -0
  202. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/math.py +0 -0
  203. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/metadata.py +0 -0
  204. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/models.py +0 -0
  205. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/rtf/parser.py +0 -0
  206. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/__init__.py +0 -0
  207. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/html.py +0 -0
  208. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/models.py +0 -0
  209. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/spreadsheet/projector.py +0 -0
  210. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/streams.py +0 -0
  211. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/__init__.py +0 -0
  212. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/chart.py +0 -0
  213. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/embedded_chart.py +0 -0
  214. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/models.py +0 -0
  215. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/number_format.py +0 -0
  216. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/parser.py +0 -0
  217. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/records.py +0 -0
  218. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/strings.py +0 -0
  219. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xls/xls_converter.py +0 -0
  220. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/__init__.py +0 -0
  221. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/main.py +0 -0
  222. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/ooxml_ole.py +0 -0
  223. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/package_normalizer.py +0 -0
  224. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/office/xlsx/xlsx_converter.py +0 -0
  225. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/__init__.py +0 -0
  226. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/__init__.py +0 -0
  227. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/candidate.py +0 -0
  228. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/contracts.py +0 -0
  229. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/geometry.py +0 -0
  230. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_common.py +0 -0
  231. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_hybrid.py +0 -0
  232. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/sparse_multiline.py +0 -0
  233. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/text_grid.py +0 -0
  234. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/_table_recovery/vector.py +0 -0
  235. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/char_geometry.py +0 -0
  236. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/code_blocks.py +0 -0
  237. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/geometry.py +0 -0
  238. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/index_blocks.py +0 -0
  239. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/__init__.py +0 -0
  240. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/common.py +0 -0
  241. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/matching.py +0 -0
  242. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/materialize.py +0 -0
  243. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/inline/types.py +0 -0
  244. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/line_layout.py +0 -0
  245. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/native_text.py +0 -0
  246. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/spatial_text.py +0 -0
  247. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_annotations.py +0 -0
  248. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_constants.py +0 -0
  249. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_detection.py +0 -0
  250. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_filled_grid.py +0 -0
  251. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_geometry.py +0 -0
  252. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_materialization.py +0 -0
  253. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rows.py +0 -0
  254. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_rules.py +0 -0
  255. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/table_text_styles.py +0 -0
  256. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/tables.py +0 -0
  257. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/__init__.py +0 -0
  258. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/common.py +0 -0
  259. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/footnotes.py +0 -0
  260. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/merging.py +0 -0
  261. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_assembly/rows.py +0 -0
  262. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/text_blocks.py +0 -0
  263. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/__init__.py +0 -0
  264. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/body_profile.py +0 -0
  265. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/common.py +0 -0
  266. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/document_profile.py +0 -0
  267. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +0 -0
  268. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/page_titles.py +0 -0
  269. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/prototype.py +0 -0
  270. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/title_analysis/structural.py +0 -0
  271. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/titles.py +0 -0
  272. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/typography.py +0 -0
  273. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/native/pdf/visual_annotations.py +0 -0
  274. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/analyzers/pdf.py +0 -0
  275. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/api.py +0 -0
  276. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/__init__.py +0 -0
  277. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/images.py +0 -0
  278. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/assets/store.py +0 -0
  279. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/cli.py +0 -0
  280. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/__init__.py +0 -0
  281. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/__init__.py +0 -0
  282. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/contracts.py +0 -0
  283. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/materializer.py +0 -0
  284. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/parser.py +0 -0
  285. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/html/resources.py +0 -0
  286. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/codecs/json.py +0 -0
  287. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/__init__.py +0 -0
  288. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/inline.py +0 -0
  289. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/links.py +0 -0
  290. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/__init__.py +0 -0
  291. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/anchors.py +0 -0
  292. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/formula.py +0 -0
  293. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/projector.py +0 -0
  294. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/markup/styles.py +0 -0
  295. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/mathml.py +0 -0
  296. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/normalization.py +0 -0
  297. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/spans.py +0 -0
  298. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/__init__.py +0 -0
  299. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/blocks.py +0 -0
  300. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/content.py +0 -0
  301. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/document.py +0 -0
  302. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/html.py +0 -0
  303. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/models.py +0 -0
  304. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/rules.py +0 -0
  305. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/table/structure.py +0 -0
  306. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/text.py +0 -0
  307. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/content/tree.py +0 -0
  308. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/__init__.py +0 -0
  309. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/contracts.py +0 -0
  310. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/detection.py +0 -0
  311. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/filetypes.py +0 -0
  312. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/page_range.py +0 -0
  313. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/__init__.py +0 -0
  314. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/classify.py +0 -0
  315. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/constants.py +0 -0
  316. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/font_runtime.py +0 -0
  317. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/images.py +0 -0
  318. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/layout.py +0 -0
  319. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/metadata.py +0 -0
  320. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_annotations.py +0 -0
  321. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_coordinates.py +0 -0
  322. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/native_lifecycle.py +0 -0
  323. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/pdfium.py +0 -0
  324. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/raster.py +0 -0
  325. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/__init__.py +0 -0
  326. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/geometry.py +0 -0
  327. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/text/groups.py +0 -0
  328. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/pdf/visuals.py +0 -0
  329. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/properties.py +0 -0
  330. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/document/source.py +0 -0
  331. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/errors.py +0 -0
  332. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/__init__.py +0 -0
  333. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/bundle.py +0 -0
  334. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/files.py +0 -0
  335. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/export/middle.py +0 -0
  336. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/__init__.py +0 -0
  337. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_coordinates.py +0 -0
  338. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_geometry.py +0 -0
  339. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_hyperlink.py +0 -0
  340. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image.py +0 -0
  341. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image_operations.py +0 -0
  342. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_image_payload.py +0 -0
  343. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/_text.py +0 -0
  344. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/image_encoding.py +0 -0
  345. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/language.py +0 -0
  346. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/type_identity.py +0 -0
  347. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/foundation/xml_names.py +0 -0
  348. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/geometry.py +0 -0
  349. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/metadata.py +0 -0
  350. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/options.py +0 -0
  351. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/__init__.py +0 -0
  352. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/content.py +0 -0
  353. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/document.py +0 -0
  354. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/lists.py +0 -0
  355. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/page_blocks.py +0 -0
  356. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/pages.py +0 -0
  357. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/paragraphs.py +0 -0
  358. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/postprocess/visual.py +0 -0
  359. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/public_api.py +0 -0
  360. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/__init__.py +0 -0
  361. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/__init__.py +0 -0
  362. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/__init__.py +0 -0
  363. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/context.py +0 -0
  364. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/html_table.py +0 -0
  365. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/index.py +0 -0
  366. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/list_items.py +0 -0
  367. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/common/planner.py +0 -0
  368. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/__init__.py +0 -0
  369. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/assets.py +0 -0
  370. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/inline.py +0 -0
  371. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/math.py +0 -0
  372. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/renderer.py +0 -0
  373. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/styles.py +0 -0
  374. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/docx/table.py +0 -0
  375. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/__init__.py +0 -0
  376. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/assets.py +0 -0
  377. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/package.py +0 -0
  378. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/epub/renderer.py +0 -0
  379. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/__init__.py +0 -0
  380. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/inline.py +0 -0
  381. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/renderer.py +0 -0
  382. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/sanitizer.py +0 -0
  383. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/html/table.py +0 -0
  384. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/__init__.py +0 -0
  385. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/assets.py +0 -0
  386. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/inline.py +0 -0
  387. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/renderer.py +0 -0
  388. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/latex/table.py +0 -0
  389. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/__init__.py +0 -0
  390. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/assets.py +0 -0
  391. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/blocks.py +0 -0
  392. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/escaping.py +0 -0
  393. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/inline.py +0 -0
  394. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/renderer.py +0 -0
  395. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/markdown/table.py +0 -0
  396. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/__init__.py +0 -0
  397. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/assets.py +0 -0
  398. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/diagnostics.py +0 -0
  399. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/font_plan.py +0 -0
  400. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula.py +0 -0
  401. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/formula_layout.py +0 -0
  402. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/inline.py +0 -0
  403. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/original.py +0 -0
  404. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/pagination.py +0 -0
  405. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/paragraph.py +0 -0
  406. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/renderer.py +0 -0
  407. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/styles.py +0 -0
  408. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table.py +0 -0
  409. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table_content.py +0 -0
  410. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/table_layout.py +0 -0
  411. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/pdf/title_layout.py +0 -0
  412. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/__init__.py +0 -0
  413. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/_internal/structured_content/renderer.py +0 -0
  414. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/api.py +0 -0
  415. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/contracts.py +0 -0
  416. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/docx.py +0 -0
  417. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/epub.py +0 -0
  418. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/fragments.py +0 -0
  419. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/html.py +0 -0
  420. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/latex.py +0 -0
  421. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/markdown.py +0 -0
  422. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/pdf.py +0 -0
  423. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/render/structured_content.py +0 -0
  424. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/epub/docvortex.css +0 -0
  425. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  426. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  427. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/NOTICE +0 -0
  428. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/fonts/manifest.json +0 -0
  429. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.css +0 -0
  430. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/resources/html/docvortex.min.css +0 -0
  431. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/result.py +0 -0
  432. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/schema.py +0 -0
  433. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex/visualization.py +0 -0
  434. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/dependency_links.txt +0 -0
  435. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/entry_points.txt +0 -0
  436. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/requires.txt +0 -0
  437. {docvortex-0.4.5 → docvortex-0.4.6}/src/docvortex.egg-info/top_level.txt +0 -0
  438. {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/flash_pdf.py +0 -0
  439. {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/native_pdf_table.py +0 -0
  440. {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/pdf_render.py +0 -0
  441. {docvortex-0.4.5 → docvortex-0.4.6}/tests/benchmarks/pipeline.py +0 -0
  442. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/evaluate_native_pdf_table_manifest.py +0 -0
  443. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_block_expectations.json +0 -0
  444. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/flash_layout_semantic_expectations.json +0 -0
  445. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/generate_synthetic_pdf_fixtures.py +0 -0
  446. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_cross_page_manifest.json +0 -0
  447. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_demo_manifest.json +0 -0
  448. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/native_pdf_table_script_truth.json +0 -0
  449. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/pdf_mixed_font_script_line.json +0 -0
  450. {docvortex-0.4.5 → docvortex-0.4.6}/tests/fixtures/rtf/semantic.rtf +0 -0
  451. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_architecture.py +0 -0
  452. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_benchmark_entrypoint.py +0 -0
  453. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_brand_protocol.py +0 -0
  454. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_cli_logging.py +0 -0
  455. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_complete_pipeline.py +0 -0
  456. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_converter_lifecycle.py +0 -0
  457. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_document_envelope.py +0 -0
  458. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_document_metadata.py +0 -0
  459. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_format_matrix.py +0 -0
  460. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_geometry_api.py +0 -0
  461. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_html_namespace.py +0 -0
  462. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_mixed_font_script_reference.py +0 -0
  463. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_analysis_api.py +0 -0
  464. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_font_geometry.py +0 -0
  465. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_font_runtime.py +0 -0
  466. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_model_text_normalization.py +0 -0
  467. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_output_text.py +0 -0
  468. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_render_pool.py +0 -0
  469. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_source_row_merging.py +0 -0
  470. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_pdf_symbol_normalization.py +0 -0
  471. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_export_api.py +0 -0
  472. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_image_api.py +0 -0
  473. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_public_pipeline.py +0 -0
  474. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_raster.py +0 -0
  475. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_rendering.py +0 -0
  476. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_refactor_resources.py +0 -0
  477. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_render_ownership.py +0 -0
  478. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_renderer_branding.py +0 -0
  479. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_shared_boundaries.py +0 -0
  480. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_system_font_pdf_pipeline.py +0 -0
  481. {docvortex-0.4.5 → docvortex-0.4.6}/tests/test_validated_geometry.py +0 -0
  482. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_docx_equationxml_test_utils.py +0 -0
  483. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_epub_test_utils.py +0 -0
  484. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_flash_pdf_test_utils.py +0 -0
  485. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_image_mtef_test_utils.py +0 -0
  486. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_doc_test_utils.py +0 -0
  487. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_ppt_test_utils.py +0 -0
  488. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_legacy_xls_test_utils.py +0 -0
  489. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_metafile_test_utils.py +0 -0
  490. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_mtef_test_utils.py +0 -0
  491. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_mtef_v5_test_utils.py +0 -0
  492. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_native_test_utils.py +0 -0
  493. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_odf_test_utils.py +0 -0
  494. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_ofd_test_utils.py +0 -0
  495. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_office_image_mtef_test_utils.py +0 -0
  496. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_ooxml_mtef_test_utils.py +0 -0
  497. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/_span_test_utils.py +0 -0
  498. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/flash_layout/mixed_text_layout_sample.pdf.xor +0 -0
  499. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/flash_table_annotations_synthetic.pdf +0 -0
  500. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/metabolic_pathway_page_3.pdf +0 -0
  501. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_cjk_layout_synthetic.pdf +0 -0
  502. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_fundraising_projects_table.pdf +0 -0
  503. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_management_roles_table.pdf +0 -0
  504. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/annual_report_research_projects_table.pdf +0 -0
  505. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/conference_schedule_tables.pdf +0 -0
  506. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/engineering_process_restrictions_table.pdf +0 -0
  507. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_asset_and_transaction_tables.pdf +0 -0
  508. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/fund_manager_profile_table.pdf +0 -0
  509. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/manufacturing_facilities_cross_page_table.pdf +0 -0
  510. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/pollutant_discharge_tables.pdf +0 -0
  511. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_contract_tables.pdf +0 -0
  512. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/procurement_document_blank_page_tables.pdf +0 -0
  513. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/native_pdf_tables/quarterly_report_financial_tables.pdf +0 -0
  514. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/pdfs/test.pdf +0 -0
  515. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_backend_architecture.py +0 -0
  516. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_backend_block_object_regressions.py +0 -0
  517. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_assets.py +0 -0
  518. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_complex_fields.py +0 -0
  519. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_math.py +0 -0
  520. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_render.py +0 -0
  521. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_special_char_tables.py +0 -0
  522. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_docx_table.py +0 -0
  523. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_emfplus_integration.py +0 -0
  524. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_backlinks.py +0 -0
  525. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_quoted_note_types.py +0 -0
  526. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_epub_render.py +0 -0
  527. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_csv.py +0 -0
  528. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_docx_equationxml.py +0 -0
  529. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_epub.py +0 -0
  530. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_html.py +0 -0
  531. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_image_mtef.py +0 -0
  532. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_chart_data.py +0 -0
  533. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc.py +0 -0
  534. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_doc_mtef.py +0 -0
  535. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_ppt.py +0 -0
  536. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls.py +0 -0
  537. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_legacy_xls_ppt_mtef.py +0 -0
  538. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_markup_anchors.py +0 -0
  539. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_model.py +0 -0
  540. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_mtef_v5.py +0 -0
  541. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_odf.py +0 -0
  542. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_ofd.py +0 -0
  543. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_image_mtef.py +0 -0
  544. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_metafile.py +0 -0
  545. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_models.py +0 -0
  546. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_mtef_v5.py +0 -0
  547. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_package_normalizers.py +0 -0
  548. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_office_title_types.py +0 -0
  549. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_ooxml_mtef.py +0 -0
  550. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_auxiliary_text.py +0 -0
  551. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_char_geometry.py +0 -0
  552. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_code_blocks.py +0 -0
  553. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_document_profile.py +0 -0
  554. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_equation_images.py +0 -0
  555. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_extractor.py +0 -0
  556. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_formulas.py +0 -0
  557. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_graphics.py +0 -0
  558. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_index_blocks.py +0 -0
  559. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_line_metadata.py +0 -0
  560. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_native_text.py +0 -0
  561. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_pipeline.py +0 -0
  562. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_samples.py +0 -0
  563. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_scripts.py +0 -0
  564. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_semantics.py +0 -0
  565. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_tables.py +0 -0
  566. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_text_blocks.py +0 -0
  567. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_titles.py +0 -0
  568. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_pdf_visual_annotations.py +0 -0
  569. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_rtf.py +0 -0
  570. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_shared_helpers.py +0 -0
  571. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_flash_spreadsheet_projector.py +0 -0
  572. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_guess_suffix_ole2.py +0 -0
  573. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_css_build.py +0 -0
  574. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_render.py +0 -0
  575. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_html_security.py +0 -0
  576. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_hybrid_script_source_pdfs.py +0 -0
  577. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_latex_render.py +0 -0
  578. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_markdown_render.py +0 -0
  579. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_block_models.py +0 -0
  580. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_export.py +0 -0
  581. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_middle_json_validator.py +0 -0
  582. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_model_json.py +0 -0
  583. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table.py +0 -0
  584. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_demo_manifest.py +0 -0
  585. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_manifest.py +0 -0
  586. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_pipeline.py +0 -0
  587. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_pdf_table_scripts.py +0 -0
  588. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_native_table_performance_equivalence.py +0 -0
  589. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_ofd_assembly.py +0 -0
  590. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_ofd_vector_tables.py +0 -0
  591. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_demo_exports.py +0 -0
  592. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_demo_pages.py +0 -0
  593. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_office_parser_regressions.py +0 -0
  594. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_style.py +0 -0
  595. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_cjk_wrapping.py +0 -0
  596. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_classify.py +0 -0
  597. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_demo_links.py +0 -0
  598. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_diagnostic_levels.py +0 -0
  599. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_document.py +0 -0
  600. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_formula_layout.py +0 -0
  601. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_original_layout.py +0 -0
  602. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_pagination.py +0 -0
  603. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_paragraph_cache.py +0 -0
  604. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_render.py +0 -0
  605. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_render_diagnostics.py +0 -0
  606. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_structured_tables.py +0 -0
  607. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_table_cache.py +0 -0
  608. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_table_round2.py +0 -0
  609. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_text_styles.py +0 -0
  610. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_title_font_plan.py +0 -0
  611. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_title_space.py +0 -0
  612. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_pdf_visualization.py +0 -0
  613. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_page_blocks.py +0 -0
  614. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_pages.py +0 -0
  615. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_paragraphs.py +0 -0
  616. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_postprocess_visual.py +0 -0
  617. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_api.py +0 -0
  618. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_html_table.py +0 -0
  619. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_image_renderer.py +0 -0
  620. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_render_list_index_utils.py +0 -0
  621. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_structured_content_render.py +0 -0
  622. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_table_merge.py +0 -0
  623. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_table_merge_cell_merge.py +0 -0
  624. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_block_anchor.py +0 -0
  625. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_boundary_rules.py +0 -0
  626. {docvortex-0.4.5 → docvortex-0.4.6}/tests/unittest/test_text_utils.py +0 -0
  627. {docvortex-0.4.5 → docvortex-0.4.6}/tools/__init__.py +0 -0
  628. {docvortex-0.4.5 → docvortex-0.4.6}/tools/build_html_css.py +0 -0
  629. {docvortex-0.4.5 → docvortex-0.4.6}/tools/calibrate_pdf_geometry.py +0 -0
  630. {docvortex-0.4.5 → docvortex-0.4.6}/tools/capture_baseline.py +0 -0
  631. {docvortex-0.4.5 → docvortex-0.4.6}/tools/capture_platform_layout.py +0 -0
  632. {docvortex-0.4.5 → docvortex-0.4.6}/tools/compare_font_platforms.py +0 -0
  633. {docvortex-0.4.5 → 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.5
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
@@ -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
 
@@ -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
 
@@ -620,6 +620,61 @@ def _assign_component(
620
620
  roles[index] = "body"
621
621
 
622
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
+
623
678
  def classify_char_script_roles(
624
679
  chars: list[Char],
625
680
  *,
@@ -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
 
@@ -212,6 +213,9 @@ def _looks_like_compact_unit_or_identifier(
212
213
  combined = previous_line.strip() + next_line.strip()
213
214
  if not combined or any(char.isspace() for char in combined):
214
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
215
219
  return any(char.isdigit() or char in "/_^%°µμ" for char in combined)
216
220
 
217
221
 
@@ -336,11 +336,22 @@ def _classify_page_footnotes(
336
336
  # 图形坐标轴和外框不能充当页面脚注分隔线。
337
337
  continue
338
338
  rule_source_indices: set[int] = set()
339
- for lane in lanes:
339
+ rule_lanes = list(lanes)
340
+ rule_width = axis_line.bbox[2] - axis_line.bbox[0]
341
+ # 通栏长线自身提供局部栏界;上方双栏布局不能拆散线下的整页脚注。
342
+ if rule_width >= 0.7 * local_page_width:
343
+ corridor = [
344
+ (line, bbox)
345
+ for line, bbox in line_geometry
346
+ if bbox[0] >= axis_line.bbox[0] - 0.25 * median_height and bbox[2] <= axis_line.bbox[2] + 0.25 * median_height
347
+ ]
348
+ rule_lanes.append(_TextLane(axis_line.bbox[0], axis_line.bbox[2], corridor))
349
+ for lane in rule_lanes:
340
350
  following_rule_tops = [
341
351
  other.bbox[1]
342
352
  for other in local_axis_lines
343
353
  if other.orientation == "horizontal"
354
+ and other.bbox[2] - other.bbox[0] >= max(4.0 * median_height, 0.04 * local_page_width)
344
355
  and other.bbox[1] - axis_line.bbox[3] > 0.5 * median_height
345
356
  and _bbox_axis_overlap_ratio(
346
357
  axis_line.bbox,
@@ -1652,6 +1663,9 @@ def _chinese_page_number_to_int(value: str) -> int | None:
1652
1663
  def _marginal_text_matches(first_text: str, second_text: str) -> bool:
1653
1664
  """在屏蔽变化数字后比较边缘稳定文本,短文本只接受完全一致。"""
1654
1665
 
1666
+ # 公式编号在数字屏蔽后都会成为同一标记,不能作为重复页脚的文本证据。
1667
+ if any(re.fullmatch(r"[((﹙]\s*[A-Za-z]?\d+(?:[.\-]\d+)*\s*[))﹚]", text.strip()) for text in (first_text, second_text)):
1668
+ return False
1655
1669
  first = _normalize_marginal_text(first_text)
1656
1670
  second = _normalize_marginal_text(second_text)
1657
1671
  if not first or not second:
@@ -9,6 +9,7 @@ from dataclasses import dataclass, replace
9
9
  from typing import Any
10
10
 
11
11
  from ....document.pdf._document import PDFPathInfo
12
+ from ....document.pdf.text._contracts import Char
12
13
  from ....foundation._text import build_tagged_formula_content
13
14
  from ....schema import BBox
14
15
  from .geometry import (
@@ -715,6 +716,13 @@ def _build_formula_like_blocks(
715
716
  blocks.append(block)
716
717
  claimed_source_indices.update(line.source_index for line, _bbox in members)
717
718
 
719
+ recovered, recovered_indices = _build_mixed_body_display_formulas(
720
+ [line for line in lines if line.source_index not in claimed_source_indices],
721
+ table_bboxes,
722
+ page_size,
723
+ )
724
+ blocks.extend(recovered)
725
+ claimed_source_indices.update(recovered_indices)
718
726
  remaining_lines = [
719
727
  line
720
728
  for line in lines
@@ -724,6 +732,121 @@ def _build_formula_like_blocks(
724
732
  return blocks, remaining_lines + paragraph_lines
725
733
 
726
734
 
735
+ def _build_mixed_body_display_formulas(
736
+ lines: list[_LineItem],
737
+ table_bboxes: list[BBox],
738
+ page_size: tuple[float, float],
739
+ ) -> tuple[list[dict[str, Any]], set[int]]:
740
+ """在混合字体正文的独立留白带内恢复无编号公式,避免把碎片窄栏当作正文栏。"""
741
+
742
+ blocks: list[dict[str, Any]] = []
743
+ claimed: set[int] = set()
744
+ for angle in sorted({line.angle for line in lines}):
745
+ geometry = [
746
+ (line, _rotate_bbox_to_upright(line.bbox, page_size, angle))
747
+ for line in lines
748
+ if line.angle == angle and line.semantic_type is None and not line.paragraph_formula_context
749
+ ]
750
+ width = page_size[1] if angle in {90, 270} else page_size[0]
751
+ body = [
752
+ (line, bbox) for line, bbox in geometry if bbox[2] - bbox[0] >= 0.5 * width and _formula_prefix_has_prose(line.text)
753
+ ]
754
+ # 该补充路径只处理既有 dominant-font 路径缺少稳定正文覆盖的混排页面。
755
+ if sum(line.font_coverage < 0.75 for line, _bbox in body) < 2:
756
+ continue
757
+ height = statistics.median(_line_effective_height(line, bbox) for line, bbox in body)
758
+ body_left = statistics.median(bbox[0] for _line, bbox in body)
759
+ body_right = statistics.median(bbox[2] for _line, bbox in body)
760
+ body_width = body_right - body_left
761
+ barriers = sorted(
762
+ [
763
+ (line, bbox)
764
+ for line, bbox in geometry
765
+ if _formula_prefix_has_prose(line.text)
766
+ and (bbox[2] - bbox[0] >= 0.5 * body_width or len(re.findall(r"[\u3400-\u9fff]", line.text)) >= 2)
767
+ ],
768
+ key=lambda item: item[1][1],
769
+ )
770
+ for previous, following in zip(barriers, barriers[1:]):
771
+ top, bottom = previous[1][3], following[1][1]
772
+ if not 0.6 * height <= bottom - top <= 8.0 * height:
773
+ continue
774
+ members = [
775
+ (line, bbox)
776
+ for line, bbox in geometry
777
+ if line.source_index not in {previous[0].source_index, following[0].source_index}
778
+ and line.source_index not in claimed
779
+ and bbox[1] >= top - 0.2 * height
780
+ and bbox[3] <= bottom + 0.2 * height
781
+ and bbox[0] >= body_left
782
+ and bbox[2] <= body_right
783
+ ]
784
+ if not members:
785
+ continue
786
+ bbox = _bbox_union_many([box for _line, box in members])
787
+ text = " ".join(line.text for line, _box in members)
788
+ if (
789
+ not any(char in "=∑∫√≤≥<>" for char in text)
790
+ or len(re.findall(r"[\u3400-\u9fff]", text)) >= 2
791
+ or len(re.findall(r"\b[A-Za-z]{4,}\b", text)) >= 2
792
+ or not 0.15 * body_width <= bbox[2] - bbox[0] <= 0.8 * body_width
793
+ or abs(_bbox_center_x(bbox) - 0.5 * (body_left + body_right)) > 0.1 * body_width
794
+ or any(
795
+ _bbox_overlap_in_smaller(line.bbox, table_bbox) > 0 for line, _box in members for table_bbox in table_bboxes
796
+ )
797
+ ):
798
+ continue
799
+ block = _formula_members_to_block(members, page_size, angle, anchor_source_index=members[0][0].source_index)
800
+ if block is not None:
801
+ blocks.append(block)
802
+ claimed.update(line.source_index for line, _bbox in members)
803
+ return blocks, claimed
804
+
805
+
806
+ def _unmapped_formula_ink_bboxes(chars: list[Char]) -> list[BBox]:
807
+ """保留实际绘制、但映射为空白或控制码的高字形几何,不改变公开文本。"""
808
+
809
+ output: list[BBox] = []
810
+ for char in chars:
811
+ value = str(char.get("char", ""))
812
+ if value.isprintable() and not value.isspace():
813
+ continue
814
+ bbox = _coerce_bbox(char.get("tight_bbox"))
815
+ font = char.get("font") or {}
816
+ size = float(font.get("size", 0) or 0)
817
+ if (
818
+ bbox is not None
819
+ and size > 0
820
+ and char.get("text_object_id") is not None
821
+ and char.get("text_render_mode") not in {3, 7}
822
+ and bbox[2] - bbox[0] > 0.05 * size
823
+ and bbox[3] - bbox[1] > 1.5 * size
824
+ ):
825
+ output.append(bbox)
826
+ return output
827
+
828
+
829
+ def _attach_unmapped_formula_ink(blocks: list[dict[str, Any]], bboxes: list[BBox]) -> None:
830
+ """将紧贴公式且纵向相容的未映射字形唯一认领到公式框。"""
831
+
832
+ for bbox in bboxes:
833
+ matches = [
834
+ block
835
+ for block in blocks
836
+ if block.get("type") == "equation"
837
+ and int(block.get("angle", 0)) in {0, 180}
838
+ and _bbox_axis_overlap_ratio(bbox, block["bbox"], axis="y") >= 0.8
839
+ and _bbox_distance(bbox, block["bbox"]) <= 0.25 * (bbox[3] - bbox[1])
840
+ and bbox[1] >= block["bbox"][1] - 2.0
841
+ and bbox[3] <= block["bbox"][3] + 2.0
842
+ ]
843
+ if len(matches) == 1:
844
+ block = matches[0]
845
+ block["bbox"] = _bbox_union(block["bbox"], bbox)
846
+ if block.get("_tight_output_bbox") is not None:
847
+ block["_tight_output_bbox"] = _bbox_union(block["_tight_output_bbox"], bbox)
848
+
849
+
727
850
  def _formula_line_has_math_operator(text: str) -> bool:
728
851
  """检查文本行是否具有独立公式常见的数学运算符。"""
729
852
 
@@ -60,6 +60,21 @@ def _form_supersedes_nested_bbox(form_bbox: BBox, nested_bbox: BBox) -> bool:
60
60
  return form_area > 0 and nested_area < 0.5 * form_area and _bbox_overlap_in_first(nested_bbox, form_bbox) >= 0.9
61
61
 
62
62
 
63
+ def _form_member_bbox(line: _LineItem, form_bbox: BBox) -> BBox | None:
64
+ """优先保持既有行框,仅在 Form 边缘用完整的可见字形证据补回成员。"""
65
+
66
+ if _bbox_overlap_in_first(line.bbox, form_bbox) >= 0.9:
67
+ return line.bbox
68
+ ink_bbox = line.ink_bbox
69
+ if ink_bbox is None:
70
+ visible_chars = [char for char in line.chars if str(char.get("char", "")).strip()]
71
+ tight = [_coerce_bbox(char.get("tight_bbox")) for char in visible_chars]
72
+ if not tight or any(bbox is None for bbox in tight):
73
+ return None
74
+ ink_bbox = _bbox_union_many([bbox for bbox in tight if bbox is not None])
75
+ return ink_bbox if _bbox_overlap_in_first(ink_bbox, form_bbox) >= 0.99 else None
76
+
77
+
63
78
  def _tighten_form_image_bbox(
64
79
  source: _PageSource,
65
80
  form_bbox: BBox,
@@ -79,7 +94,7 @@ def _tighten_form_image_bbox(
79
94
  # 至少两个嵌套 Path 和四个矢量元素,避免只凭普通边框或少量文本裁剪 Form。
80
95
  if len(internal_paths) < 2 or len(internal_paths) + len(internal_drawing_lines) < 4:
81
96
  return form_bbox
82
- internal_text = [line.bbox for line in source.lines if _bbox_overlap_in_first(line.bbox, form_bbox) >= 0.9]
97
+ internal_text = [bbox for line in source.lines if (bbox := _form_member_bbox(line, form_bbox)) is not None]
83
98
  evidence_bbox = _clip_bbox(
84
99
  _bbox_union_many(internal_paths + internal_drawing_lines + internal_text),
85
100
  source.page_size,
@@ -125,7 +140,7 @@ def _select_form_image_bboxes(source: _PageSource) -> list[BBox]:
125
140
  member_rows = {
126
141
  line.visual_row_id if line.visual_row_id is not None else line.source_index
127
142
  for line in source.lines
128
- if _bbox_overlap_in_first(line.bbox, bbox) >= 0.9
143
+ if _form_member_bbox(line, bbox) is not None
129
144
  }
130
145
  internal_drawing_count = sum(
131
146
  _bbox_overlap_in_first(drawing_line.bbox, bbox) >= 0.9 for drawing_line in source.drawing_lines
@@ -151,9 +166,7 @@ def _build_form_image_blocks(
151
166
  if line.source_index in claimed_line_indices:
152
167
  continue
153
168
  matching_indices = [
154
- candidate_index
155
- for candidate_index, bbox in enumerate(form_bboxes)
156
- if _bbox_overlap_in_first(line.bbox, bbox) >= 0.9
169
+ candidate_index for candidate_index, bbox in enumerate(form_bboxes) if _form_member_bbox(line, bbox) is not None
157
170
  ]
158
171
  if not matching_indices:
159
172
  continue
@@ -225,6 +225,13 @@ def _drawing_match_for_line(
225
225
  hit_chars = [char for char in line.visible_chars if drawing_bbox[0] <= (char.bbox[0] + char.bbox[2]) / 2 <= drawing_bbox[2]]
226
226
  if not hit_chars:
227
227
  return None
228
+ if style == "strikethrough":
229
+ # 分式横线可能穿过字体外框却完全位于字形上方,不应据此生成删除线。
230
+ ink_boxes = [_coerce_bbox(line.chars[char.source_index].get("tight_bbox")) for char in hit_chars]
231
+ if all(bbox is not None for bbox in ink_boxes) and not any(
232
+ bbox[1] <= drawing_center_y <= bbox[3] for bbox in ink_boxes if bbox is not None
233
+ ):
234
+ return None
228
235
  hit_left = min(char.bbox[0] for char in hit_chars)
229
236
  hit_right = max(char.bbox[2] for char in hit_chars)
230
237
  if (hit_right - hit_left) / drawing_length < TEXT_DECORATION_MIN_TEXT_COVERAGE_RATIO:
@@ -7,7 +7,7 @@ import unicodedata
7
7
  from typing import Any, Literal, Sequence
8
8
 
9
9
  from .....schema import BBox
10
- from .._script_geometry import ScriptRole, classify_char_script_roles
10
+ from .._script_geometry import ScriptRole, classify_char_script_roles, paired_script_roles
11
11
  from ..geometry import _rotate_bbox_to_upright
12
12
  from .common import _coerce_bbox, _normalize_match_fragment, _ordered_line_chars
13
13
  from .types import (
@@ -678,7 +678,7 @@ def _strong_structural_script_roles(
678
678
  tight_bboxes=tight_bboxes,
679
679
  origins=origins,
680
680
  )
681
- strong_roles: dict[int, ScriptRole] = {}
681
+ strong_roles: dict[int, ScriptRole] = paired_script_roles(chars, roles, tight_bboxes, origins)
682
682
  for index in _citation_script_indices(chars, roles):
683
683
  if roles[index] != "body":
684
684
  strong_roles[index] = roles[index]
@@ -18,6 +18,7 @@ from .geometry import (
18
18
  from .line_layout import _connection_crosses_table, _font_signatures_share_family, _infer_text_lanes, _line_effective_height
19
19
  from .models import _LineItem, _TextLane
20
20
  from .native_text import _fill_native_typography, _median_native_glyph_width
21
+ from ._script_geometry import classify_char_script_roles, paired_script_roles
21
22
 
22
23
 
23
24
  def _merge_same_baseline_text_lines(
@@ -273,13 +274,35 @@ def _classify_overlapping_inline_cluster(
273
274
  and line.font_coverage >= 0.75
274
275
  for line, bbox in members
275
276
  )
276
- if has_body_host:
277
+ if has_body_host or _has_paired_script_body_host(members, median_height):
277
278
  return "inline"
278
279
  if len(members) >= 3 and len(visual_row_ids) >= 3 and union_bbox[2] - union_bbox[0] <= 0.6 * lane_width:
279
280
  return "formula"
280
281
  return None
281
282
 
282
283
 
284
+ def _has_paired_script_body_host(members: list[tuple[_LineItem, BBox]], median_height: float) -> bool:
285
+ """用正文宿主和跨 run 的成对上下标补证据,不放宽普通同行重叠阈值。"""
286
+
287
+ if len(members) != 2 or any(line.angle != 0 or line.preserve_split_boundary or line.semantic_type for line, _ in members):
288
+ return False
289
+ host, bbox = max(members, key=lambda item: item[1][2] - item[1][0])
290
+ has_prose = len(re.findall(r"[\u3400-\u9fff]", host.text)) >= 2 or len(re.findall(r"\b[A-Za-z]{2,}\b", host.text)) >= 2
291
+ if not has_prose or bbox[2] - bbox[0] < 4.0 * median_height:
292
+ return False
293
+ owned_chars = [(char, line.source_index) for line, _ in members for char in line.chars]
294
+ if not owned_chars or any(not isinstance(char.get("char_idx"), int) for char, _ in owned_chars):
295
+ return False
296
+ owned_chars.sort(key=lambda item: item[0]["char_idx"])
297
+ chars = [char for char, _ in owned_chars]
298
+ tight = {char["char_idx"]: char["tight_bbox"] for char in chars if char.get("tight_bbox") is not None}
299
+ origins = {char["char_idx"]: char["origin"] for char in chars if char.get("origin") is not None}
300
+ roles = classify_char_script_roles(chars, tight_bboxes=tight, origins=origins)
301
+ paired = paired_script_roles(chars, roles, tight, origins)
302
+ # 上下标必须分属两个待合并 run,避免把一侧已有角标当作吞并邻块的依据。
303
+ return len(paired) == 2 and len({owned_chars[index][1] for index in paired}) == 2
304
+
305
+
283
306
  def _select_overlapping_inline_cluster_host(
284
307
  members: list[tuple[_LineItem, BBox]],
285
308
  median_height: float,
@@ -335,8 +358,10 @@ def _merge_overlapping_inline_cluster(
335
358
  if compact_formula_cluster
336
359
  else [line.bbox for line in ordered_members if line is not host]
337
360
  )
361
+ # 成对角标跨 run 只是 PDF 物理拆行,不应在上、下标之间补正文空格。
362
+ separator = "" if _has_paired_script_body_host(members, median_height) else " "
338
363
  merged = _LineItem(
339
- text=" ".join(text for line in ordered_members if (text := line.text.strip())),
364
+ text=separator.join(text for line in ordered_members if (text := line.text.strip())),
340
365
  bbox=_bbox_union_many([line.bbox for line in ordered_members]),
341
366
  angle=host.angle,
342
367
  source_index=min(line.source_index for line in ordered_members),
@@ -189,6 +189,7 @@ class _PreparedPage:
189
189
  page_footnote_groups: list[set[int]] = field(default_factory=list)
190
190
  script_lines: list[PDFTextScriptLine] = field(default_factory=list)
191
191
  formula_candidate_lines: list[_LineItem] = field(default_factory=list)
192
+ formula_ink_bboxes: list[BBox] = field(default_factory=list)
192
193
 
193
194
 
194
195
  @dataclass(slots=True)
@@ -30,7 +30,12 @@ from .auxiliary_text import (
30
30
  )
31
31
  from .char_geometry import DocumentGeometryPlan, apply_line_geometry_repairs, build_document_geometry_plan
32
32
  from .code_blocks import _build_code_blocks, _build_rule_delimited_code_blocks
33
- from .formulas import _build_formula_like_blocks, _build_vector_formula_blocks
33
+ from .formulas import (
34
+ _attach_unmapped_formula_ink,
35
+ _build_formula_like_blocks,
36
+ _build_vector_formula_blocks,
37
+ _unmapped_formula_ink_bboxes,
38
+ )
34
39
  from .geometry import (
35
40
  _bbox_area,
36
41
  _bbox_axis_overlap_ratio,
@@ -706,6 +711,7 @@ def _prepare_page_source(
706
711
  canonical_formula_source_lines=canonical_formula_source_lines,
707
712
  script_lines=script_lines,
708
713
  formula_candidate_lines=formula_candidate_lines,
714
+ formula_ink_bboxes=_unmapped_formula_ink_bboxes(source.chars),
709
715
  )
710
716
  _classify_page_auxiliary_text(prepared)
711
717
  return prepared
@@ -880,6 +886,7 @@ def _finalize_prepared_page(
880
886
  ) == _formula_block_inventory(formula_blocks):
881
887
  formula_blocks = canonical_formula_blocks
882
888
  prepared.canonical_formula_source_lines.clear()
889
+ _attach_unmapped_formula_ink(formula_blocks, prepared.formula_ink_bboxes)
883
890
  if prepared.canonical_formula_geometry:
884
891
  for line in remaining_lines:
885
892
  line.style_scale_repaired = original_style_scale_state.get(