docvortex 0.2.1__py3-none-any.whl

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 (364) hide show
  1. docvortex/__init__.py +21 -0
  2. docvortex/analyzers/__init__.py +3 -0
  3. docvortex/analyzers/native/__init__.py +37 -0
  4. docvortex/analyzers/native/_shared/__init__.py +3 -0
  5. docvortex/analyzers/native/_shared/hyperlink.py +16 -0
  6. docvortex/analyzers/native/_shared/image.py +8 -0
  7. docvortex/analyzers/native/_shared/markup/__init__.py +47 -0
  8. docvortex/analyzers/native/_shared/markup/anchors.py +30 -0
  9. docvortex/analyzers/native/_shared/markup/formula.py +37 -0
  10. docvortex/analyzers/native/_shared/markup/projector.py +57 -0
  11. docvortex/analyzers/native/_shared/markup/styles.py +19 -0
  12. docvortex/analyzers/native/_shared/mathml.py +17 -0
  13. docvortex/analyzers/native/_shared/names.py +7 -0
  14. docvortex/analyzers/native/_shared/xycut.py +414 -0
  15. docvortex/analyzers/native/contracts.py +44 -0
  16. docvortex/analyzers/native/csv.py +351 -0
  17. docvortex/analyzers/native/epub/__init__.py +18 -0
  18. docvortex/analyzers/native/epub/constants.py +45 -0
  19. docvortex/analyzers/native/epub/converter.py +80 -0
  20. docvortex/analyzers/native/epub/errors.py +20 -0
  21. docvortex/analyzers/native/epub/metadata.py +31 -0
  22. docvortex/analyzers/native/epub/package.py +649 -0
  23. docvortex/analyzers/native/epub/xhtml.py +306 -0
  24. docvortex/analyzers/native/html/__init__.py +6 -0
  25. docvortex/analyzers/native/html/anchors.py +271 -0
  26. docvortex/analyzers/native/html/constants.py +25 -0
  27. docvortex/analyzers/native/html/contracts.py +7 -0
  28. docvortex/analyzers/native/html/converter.py +117 -0
  29. docvortex/analyzers/native/html/document.py +389 -0
  30. docvortex/analyzers/native/html/errors.py +12 -0
  31. docvortex/analyzers/native/html/resources.py +365 -0
  32. docvortex/analyzers/native/html/selector.py +421 -0
  33. docvortex/analyzers/native/models.py +209 -0
  34. docvortex/analyzers/native/ofd/__init__.py +14 -0
  35. docvortex/analyzers/native/ofd/constants.py +59 -0
  36. docvortex/analyzers/native/ofd/converter.py +31 -0
  37. docvortex/analyzers/native/ofd/errors.py +16 -0
  38. docvortex/analyzers/native/ofd/geometry.py +215 -0
  39. docvortex/analyzers/native/ofd/images.py +124 -0
  40. docvortex/analyzers/native/ofd/metadata.py +53 -0
  41. docvortex/analyzers/native/ofd/models.py +170 -0
  42. docvortex/analyzers/native/ofd/package.py +346 -0
  43. docvortex/analyzers/native/ofd/path.py +201 -0
  44. docvortex/analyzers/native/ofd/reading_order.py +293 -0
  45. docvortex/analyzers/native/ofd/resources.py +122 -0
  46. docvortex/analyzers/native/ofd/scene.py +347 -0
  47. docvortex/analyzers/native/ofd/table.py +240 -0
  48. docvortex/analyzers/native/ofd/text.py +521 -0
  49. docvortex/analyzers/native/office/__init__.py +3 -0
  50. docvortex/analyzers/native/office/doc/__init__.py +3 -0
  51. docvortex/analyzers/native/office/doc/bookmarks.py +81 -0
  52. docvortex/analyzers/native/office/doc/doc_converter.py +573 -0
  53. docvortex/analyzers/native/office/doc/fib.py +261 -0
  54. docvortex/analyzers/native/office/doc/fields.py +101 -0
  55. docvortex/analyzers/native/office/doc/formatting.py +171 -0
  56. docvortex/analyzers/native/office/doc/images.py +162 -0
  57. docvortex/analyzers/native/office/doc/lists.py +356 -0
  58. docvortex/analyzers/native/office/doc/models.py +164 -0
  59. docvortex/analyzers/native/office/doc/parser.py +851 -0
  60. docvortex/analyzers/native/office/doc/pieces.py +256 -0
  61. docvortex/analyzers/native/office/doc/records.py +40 -0
  62. docvortex/analyzers/native/office/doc/sprm.py +269 -0
  63. docvortex/analyzers/native/office/doc/styles.py +215 -0
  64. docvortex/analyzers/native/office/docx/__init__.py +3 -0
  65. docvortex/analyzers/native/office/docx/context.py +71 -0
  66. docvortex/analyzers/native/office/docx/docx_converter.py +614 -0
  67. docvortex/analyzers/native/office/docx/equationxml.py +119 -0
  68. docvortex/analyzers/native/office/docx/fields.py +816 -0
  69. docvortex/analyzers/native/office/docx/formatting_types.py +23 -0
  70. docvortex/analyzers/native/office/docx/main.py +50 -0
  71. docvortex/analyzers/native/office/docx/numbering.py +491 -0
  72. docvortex/analyzers/native/office/docx/office_xml.py +57 -0
  73. docvortex/analyzers/native/office/docx/package_normalizer.py +248 -0
  74. docvortex/analyzers/native/office/docx/resources.py +526 -0
  75. docvortex/analyzers/native/office/docx/styles.py +693 -0
  76. docvortex/analyzers/native/office/docx/tables.py +515 -0
  77. docvortex/analyzers/native/office/equation/__init__.py +3 -0
  78. docvortex/analyzers/native/office/equation/image.py +470 -0
  79. docvortex/analyzers/native/office/equation/latex_dict.py +324 -0
  80. docvortex/analyzers/native/office/equation/mtef.py +885 -0
  81. docvortex/analyzers/native/office/equation/mtef_v5.py +941 -0
  82. docvortex/analyzers/native/office/equation/omml.py +561 -0
  83. docvortex/analyzers/native/office/equation/ooxml.py +62 -0
  84. docvortex/analyzers/native/office/errors.py +33 -0
  85. docvortex/analyzers/native/office/image.py +307 -0
  86. docvortex/analyzers/native/office/legacy/__init__.py +3 -0
  87. docvortex/analyzers/native/office/legacy/binary.py +43 -0
  88. docvortex/analyzers/native/office/legacy/officeart.py +362 -0
  89. docvortex/analyzers/native/office/legacy/ole.py +110 -0
  90. docvortex/analyzers/native/office/limits.py +12 -0
  91. docvortex/analyzers/native/office/odf/__init__.py +3 -0
  92. docvortex/analyzers/native/office/odf/chart.py +76 -0
  93. docvortex/analyzers/native/office/odf/constants.py +70 -0
  94. docvortex/analyzers/native/office/odf/converters.py +403 -0
  95. docvortex/analyzers/native/office/odf/errors.py +18 -0
  96. docvortex/analyzers/native/office/odf/metadata.py +91 -0
  97. docvortex/analyzers/native/office/odf/models.py +176 -0
  98. docvortex/analyzers/native/office/odf/package.py +270 -0
  99. docvortex/analyzers/native/office/odf/styles.py +329 -0
  100. docvortex/analyzers/native/office/odf/table.py +469 -0
  101. docvortex/analyzers/native/office/odf/text.py +1002 -0
  102. docvortex/analyzers/native/office/ooxml_chart.py +1016 -0
  103. docvortex/analyzers/native/office/opc.py +38 -0
  104. docvortex/analyzers/native/office/ppt/__init__.py +3 -0
  105. docvortex/analyzers/native/office/ppt/models.py +118 -0
  106. docvortex/analyzers/native/office/ppt/parser.py +1895 -0
  107. docvortex/analyzers/native/office/ppt/ppt_converter.py +292 -0
  108. docvortex/analyzers/native/office/ppt/records.py +131 -0
  109. docvortex/analyzers/native/office/ppt/style_text.py +247 -0
  110. docvortex/analyzers/native/office/pptx/__init__.py +3 -0
  111. docvortex/analyzers/native/office/pptx/context.py +113 -0
  112. docvortex/analyzers/native/office/pptx/lists.py +558 -0
  113. docvortex/analyzers/native/office/pptx/main.py +20 -0
  114. docvortex/analyzers/native/office/pptx/package_normalizer.py +321 -0
  115. docvortex/analyzers/native/office/pptx/pptx_converter.py +323 -0
  116. docvortex/analyzers/native/office/pptx/resources.py +329 -0
  117. docvortex/analyzers/native/office/pptx/shapes.py +393 -0
  118. docvortex/analyzers/native/office/pptx/text_styles.py +625 -0
  119. docvortex/analyzers/native/office/pptx/titles.py +178 -0
  120. docvortex/analyzers/native/office/rich_text.py +420 -0
  121. docvortex/analyzers/native/office/rtf/__init__.py +3 -0
  122. docvortex/analyzers/native/office/rtf/converter.py +708 -0
  123. docvortex/analyzers/native/office/rtf/lexer.py +213 -0
  124. docvortex/analyzers/native/office/rtf/math.py +339 -0
  125. docvortex/analyzers/native/office/rtf/models.py +185 -0
  126. docvortex/analyzers/native/office/rtf/parser.py +1553 -0
  127. docvortex/analyzers/native/office/spreadsheet/__init__.py +3 -0
  128. docvortex/analyzers/native/office/spreadsheet/html.py +81 -0
  129. docvortex/analyzers/native/office/spreadsheet/models.py +79 -0
  130. docvortex/analyzers/native/office/spreadsheet/projector.py +928 -0
  131. docvortex/analyzers/native/office/streams.py +18 -0
  132. docvortex/analyzers/native/office/xls/__init__.py +3 -0
  133. docvortex/analyzers/native/office/xls/chart.py +132 -0
  134. docvortex/analyzers/native/office/xls/embedded_chart.py +299 -0
  135. docvortex/analyzers/native/office/xls/models.py +109 -0
  136. docvortex/analyzers/native/office/xls/number_format.py +521 -0
  137. docvortex/analyzers/native/office/xls/parser.py +1145 -0
  138. docvortex/analyzers/native/office/xls/records.py +201 -0
  139. docvortex/analyzers/native/office/xls/strings.py +205 -0
  140. docvortex/analyzers/native/office/xls/xls_converter.py +354 -0
  141. docvortex/analyzers/native/office/xlsx/__init__.py +3 -0
  142. docvortex/analyzers/native/office/xlsx/main.py +20 -0
  143. docvortex/analyzers/native/office/xlsx/ooxml_ole.py +522 -0
  144. docvortex/analyzers/native/office/xlsx/package_normalizer.py +310 -0
  145. docvortex/analyzers/native/office/xlsx/xlsx_converter.py +716 -0
  146. docvortex/analyzers/native/pdf/__init__.py +3 -0
  147. docvortex/analyzers/native/pdf/auxiliary_text.py +1671 -0
  148. docvortex/analyzers/native/pdf/char_geometry.py +1662 -0
  149. docvortex/analyzers/native/pdf/code_blocks.py +535 -0
  150. docvortex/analyzers/native/pdf/formulas.py +1985 -0
  151. docvortex/analyzers/native/pdf/geometry.py +281 -0
  152. docvortex/analyzers/native/pdf/graphics.py +1501 -0
  153. docvortex/analyzers/native/pdf/index_blocks.py +268 -0
  154. docvortex/analyzers/native/pdf/inline/__init__.py +3 -0
  155. docvortex/analyzers/native/pdf/inline/common.py +112 -0
  156. docvortex/analyzers/native/pdf/inline/detection.py +590 -0
  157. docvortex/analyzers/native/pdf/inline/matching.py +1185 -0
  158. docvortex/analyzers/native/pdf/inline/materialize.py +457 -0
  159. docvortex/analyzers/native/pdf/inline/scripts.py +975 -0
  160. docvortex/analyzers/native/pdf/inline/types.py +385 -0
  161. docvortex/analyzers/native/pdf/line_layout.py +1106 -0
  162. docvortex/analyzers/native/pdf/line_merging.py +1223 -0
  163. docvortex/analyzers/native/pdf/models.py +246 -0
  164. docvortex/analyzers/native/pdf/native_text.py +1004 -0
  165. docvortex/analyzers/native/pdf/pipeline.py +1390 -0
  166. docvortex/analyzers/native/pdf/script_geometry.py +636 -0
  167. docvortex/analyzers/native/pdf/shared.py +30 -0
  168. docvortex/analyzers/native/pdf/spatial_text.py +383 -0
  169. docvortex/analyzers/native/pdf/table_annotations.py +446 -0
  170. docvortex/analyzers/native/pdf/table_constants.py +48 -0
  171. docvortex/analyzers/native/pdf/table_detection.py +227 -0
  172. docvortex/analyzers/native/pdf/table_filled_grid.py +218 -0
  173. docvortex/analyzers/native/pdf/table_geometry.py +40 -0
  174. docvortex/analyzers/native/pdf/table_materialization.py +444 -0
  175. docvortex/analyzers/native/pdf/table_recovery/__init__.py +15 -0
  176. docvortex/analyzers/native/pdf/table_recovery/candidate.py +356 -0
  177. docvortex/analyzers/native/pdf/table_recovery/contracts.py +154 -0
  178. docvortex/analyzers/native/pdf/table_recovery/engine.py +609 -0
  179. docvortex/analyzers/native/pdf/table_recovery/geometry.py +164 -0
  180. docvortex/analyzers/native/pdf/table_recovery/sparse_common.py +85 -0
  181. docvortex/analyzers/native/pdf/table_recovery/sparse_hybrid.py +804 -0
  182. docvortex/analyzers/native/pdf/table_recovery/sparse_multiline.py +1122 -0
  183. docvortex/analyzers/native/pdf/table_recovery/text.py +414 -0
  184. docvortex/analyzers/native/pdf/table_recovery/text_grid.py +618 -0
  185. docvortex/analyzers/native/pdf/table_recovery/vector.py +1931 -0
  186. docvortex/analyzers/native/pdf/table_rows.py +34 -0
  187. docvortex/analyzers/native/pdf/table_rules.py +1129 -0
  188. docvortex/analyzers/native/pdf/table_text_styles.py +283 -0
  189. docvortex/analyzers/native/pdf/tables.py +147 -0
  190. docvortex/analyzers/native/pdf/text_assembly/__init__.py +3 -0
  191. docvortex/analyzers/native/pdf/text_assembly/annotations.py +581 -0
  192. docvortex/analyzers/native/pdf/text_assembly/assembly.py +292 -0
  193. docvortex/analyzers/native/pdf/text_assembly/common.py +477 -0
  194. docvortex/analyzers/native/pdf/text_assembly/footnotes.py +394 -0
  195. docvortex/analyzers/native/pdf/text_assembly/merging.py +1274 -0
  196. docvortex/analyzers/native/pdf/text_assembly/rows.py +692 -0
  197. docvortex/analyzers/native/pdf/text_blocks.py +82 -0
  198. docvortex/analyzers/native/pdf/text_styles.py +55 -0
  199. docvortex/analyzers/native/pdf/title_analysis/__init__.py +3 -0
  200. docvortex/analyzers/native/pdf/title_analysis/body_profile.py +215 -0
  201. docvortex/analyzers/native/pdf/title_analysis/common.py +117 -0
  202. docvortex/analyzers/native/pdf/title_analysis/document_profile.py +164 -0
  203. docvortex/analyzers/native/pdf/title_analysis/lane_titles.py +758 -0
  204. docvortex/analyzers/native/pdf/title_analysis/page_titles.py +1024 -0
  205. docvortex/analyzers/native/pdf/title_analysis/prototype.py +194 -0
  206. docvortex/analyzers/native/pdf/title_analysis/structural.py +1081 -0
  207. docvortex/analyzers/native/pdf/titles.py +75 -0
  208. docvortex/analyzers/native/pdf/typography.py +19 -0
  209. docvortex/analyzers/native/pdf/visual_annotations.py +1262 -0
  210. docvortex/api.py +180 -0
  211. docvortex/assets/__init__.py +5 -0
  212. docvortex/assets/store.py +51 -0
  213. docvortex/cli.py +54 -0
  214. docvortex/codecs/__init__.py +3 -0
  215. docvortex/codecs/html/__init__.py +22 -0
  216. docvortex/codecs/html/contracts.py +236 -0
  217. docvortex/codecs/html/materializer.py +331 -0
  218. docvortex/codecs/html/parser.py +763 -0
  219. docvortex/codecs/html/resources.py +34 -0
  220. docvortex/codecs/json.py +17 -0
  221. docvortex/content/__init__.py +5 -0
  222. docvortex/content/inline.py +248 -0
  223. docvortex/content/markup/__init__.py +44 -0
  224. docvortex/content/markup/anchors.py +188 -0
  225. docvortex/content/markup/formula.py +280 -0
  226. docvortex/content/markup/projector.py +1237 -0
  227. docvortex/content/markup/styles.py +327 -0
  228. docvortex/content/mathml.py +167 -0
  229. docvortex/content/normalization.py +188 -0
  230. docvortex/content/spans.py +183 -0
  231. docvortex/content/table/__init__.py +18 -0
  232. docvortex/content/table/blocks.py +152 -0
  233. docvortex/content/table/content.py +425 -0
  234. docvortex/content/table/document.py +104 -0
  235. docvortex/content/table/html.py +399 -0
  236. docvortex/content/table/models.py +76 -0
  237. docvortex/content/table/rules.py +42 -0
  238. docvortex/content/table/structure.py +221 -0
  239. docvortex/content/tree.py +5 -0
  240. docvortex/document/__init__.py +3 -0
  241. docvortex/document/contracts.py +22 -0
  242. docvortex/document/detection.py +389 -0
  243. docvortex/document/filetypes.py +175 -0
  244. docvortex/document/page_range.py +167 -0
  245. docvortex/document/pdf/__init__.py +19 -0
  246. docvortex/document/pdf/classify.py +1138 -0
  247. docvortex/document/pdf/constants.py +132 -0
  248. docvortex/document/pdf/diagnostics.py +350 -0
  249. docvortex/document/pdf/document.py +582 -0
  250. docvortex/document/pdf/font_runtime.py +335 -0
  251. docvortex/document/pdf/geometry.py +31 -0
  252. docvortex/document/pdf/images.py +654 -0
  253. docvortex/document/pdf/native_annotations.py +367 -0
  254. docvortex/document/pdf/native_contracts.py +169 -0
  255. docvortex/document/pdf/native_coordinates.py +216 -0
  256. docvortex/document/pdf/native_lifecycle.py +16 -0
  257. docvortex/document/pdf/native_objects.py +902 -0
  258. docvortex/document/pdf/native_text_geometry.py +315 -0
  259. docvortex/document/pdf/pdfium.py +325 -0
  260. docvortex/document/pdf/raster.py +46 -0
  261. docvortex/document/pdf/text/__init__.py +62 -0
  262. docvortex/document/pdf/text/contracts.py +211 -0
  263. docvortex/document/pdf/text/extract.py +165 -0
  264. docvortex/document/pdf/text/geometry.py +16 -0
  265. docvortex/document/pdf/text/groups.py +162 -0
  266. docvortex/document/pdf/visual_geometry.py +201 -0
  267. docvortex/document/pdf/visuals.py +343 -0
  268. docvortex/document/source.py +92 -0
  269. docvortex/errors.py +21 -0
  270. docvortex/export/__init__.py +3 -0
  271. docvortex/export/bundle.py +98 -0
  272. docvortex/export/files.py +66 -0
  273. docvortex/export/middle.py +208 -0
  274. docvortex/foundation/__init__.py +3 -0
  275. docvortex/foundation/geometry.py +125 -0
  276. docvortex/foundation/hyperlink.py +65 -0
  277. docvortex/foundation/image.py +48 -0
  278. docvortex/foundation/image_encoding.py +30 -0
  279. docvortex/foundation/image_payload.py +280 -0
  280. docvortex/foundation/language.py +92 -0
  281. docvortex/foundation/platform.py +38 -0
  282. docvortex/foundation/text.py +153 -0
  283. docvortex/foundation/type_identity.py +20 -0
  284. docvortex/foundation/xml_names.py +20 -0
  285. docvortex/options.py +30 -0
  286. docvortex/postprocess/__init__.py +3 -0
  287. docvortex/postprocess/content.py +53 -0
  288. docvortex/postprocess/document.py +19 -0
  289. docvortex/postprocess/lists.py +236 -0
  290. docvortex/postprocess/page_blocks.py +214 -0
  291. docvortex/postprocess/pages.py +95 -0
  292. docvortex/postprocess/paragraphs.py +580 -0
  293. docvortex/postprocess/visual.py +715 -0
  294. docvortex/render/__init__.py +48 -0
  295. docvortex/render/_internal/__init__.py +3 -0
  296. docvortex/render/_internal/common/__init__.py +3 -0
  297. docvortex/render/_internal/common/context.py +43 -0
  298. docvortex/render/_internal/common/html_table.py +178 -0
  299. docvortex/render/_internal/common/index.py +33 -0
  300. docvortex/render/_internal/common/list_items.py +158 -0
  301. docvortex/render/_internal/common/planner.py +140 -0
  302. docvortex/render/_internal/docx/__init__.py +3 -0
  303. docvortex/render/_internal/docx/assets.py +202 -0
  304. docvortex/render/_internal/docx/inline.py +434 -0
  305. docvortex/render/_internal/docx/math.py +220 -0
  306. docvortex/render/_internal/docx/renderer.py +905 -0
  307. docvortex/render/_internal/docx/styles.py +195 -0
  308. docvortex/render/_internal/docx/table.py +442 -0
  309. docvortex/render/_internal/epub/__init__.py +5 -0
  310. docvortex/render/_internal/epub/assets.py +173 -0
  311. docvortex/render/_internal/epub/package.py +249 -0
  312. docvortex/render/_internal/epub/renderer.py +1156 -0
  313. docvortex/render/_internal/html/__init__.py +3 -0
  314. docvortex/render/_internal/html/inline.py +346 -0
  315. docvortex/render/_internal/html/renderer.py +1041 -0
  316. docvortex/render/_internal/html/sanitizer.py +478 -0
  317. docvortex/render/_internal/html/table.py +121 -0
  318. docvortex/render/_internal/latex/__init__.py +1 -0
  319. docvortex/render/_internal/latex/assets.py +85 -0
  320. docvortex/render/_internal/latex/inline.py +145 -0
  321. docvortex/render/_internal/latex/renderer.py +506 -0
  322. docvortex/render/_internal/latex/table.py +347 -0
  323. docvortex/render/_internal/markdown/__init__.py +3 -0
  324. docvortex/render/_internal/markdown/assets.py +78 -0
  325. docvortex/render/_internal/markdown/blocks.py +635 -0
  326. docvortex/render/_internal/markdown/escaping.py +51 -0
  327. docvortex/render/_internal/markdown/inline.py +260 -0
  328. docvortex/render/_internal/markdown/renderer.py +93 -0
  329. docvortex/render/_internal/markdown/table.py +281 -0
  330. docvortex/render/_internal/pdf/__init__.py +3 -0
  331. docvortex/render/_internal/pdf/assets.py +197 -0
  332. docvortex/render/_internal/pdf/formula.py +417 -0
  333. docvortex/render/_internal/pdf/inline.py +343 -0
  334. docvortex/render/_internal/pdf/renderer.py +734 -0
  335. docvortex/render/_internal/pdf/styles.py +206 -0
  336. docvortex/render/_internal/pdf/table.py +272 -0
  337. docvortex/render/_internal/structured_content/__init__.py +3 -0
  338. docvortex/render/_internal/structured_content/renderer.py +193 -0
  339. docvortex/render/api.py +199 -0
  340. docvortex/render/contracts.py +205 -0
  341. docvortex/render/docx.py +38 -0
  342. docvortex/render/epub.py +35 -0
  343. docvortex/render/fragments.py +70 -0
  344. docvortex/render/html.py +29 -0
  345. docvortex/render/latex.py +24 -0
  346. docvortex/render/markdown.py +50 -0
  347. docvortex/render/pdf.py +25 -0
  348. docvortex/render/structured_content.py +23 -0
  349. docvortex/resources/epub/docvortex.css +91 -0
  350. docvortex/resources/fasttext-langdetect/lid.176.ftz +0 -0
  351. docvortex/resources/fonts/DroidSansFallbackFull.ttf +0 -0
  352. docvortex/resources/fonts/NOTICE +190 -0
  353. docvortex/resources/fonts/manifest.json +9 -0
  354. docvortex/resources/html/docvortex.css +601 -0
  355. docvortex/resources/html/docvortex.min.css +1 -0
  356. docvortex/result.py +91 -0
  357. docvortex/schema.py +1141 -0
  358. docvortex/version.py +3 -0
  359. docvortex-0.2.1.dist-info/METADATA +193 -0
  360. docvortex-0.2.1.dist-info/RECORD +364 -0
  361. docvortex-0.2.1.dist-info/WHEEL +5 -0
  362. docvortex-0.2.1.dist-info/entry_points.txt +2 -0
  363. docvortex-0.2.1.dist-info/licenses/LICENSE.md +21 -0
  364. docvortex-0.2.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,281 @@
1
+ """Flash 原生 PDF 提取使用的纯几何工具。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ import math
6
+ from typing import Any, Literal, Sequence
7
+
8
+
9
+ from ....schema import BBox
10
+
11
+ from .models import _AxisLine, _LocalAxisLine
12
+
13
+
14
+ def _horizontal_bbox_gap(first_bbox: BBox, second_bbox: BBox) -> float:
15
+ """返回两个局部 bbox 在 x 轴上的无方向净空,重叠时为零。"""
16
+
17
+ return max(first_bbox[0] - second_bbox[2], second_bbox[0] - first_bbox[2], 0.0)
18
+
19
+
20
+ def _transform_axis_lines(
21
+ lines: list[_AxisLine],
22
+ page_size: tuple[float, float],
23
+ angle: int,
24
+ ) -> list[_LocalAxisLine]:
25
+ """将原页面横竖线转入当前文本方向的局部坐标。"""
26
+
27
+ output: list[_LocalAxisLine] = []
28
+ for line in lines:
29
+ local_bbox = _rotate_bbox_to_upright(line.bbox, page_size, angle)
30
+ orientation: Literal["horizontal", "vertical"] = (
31
+ "horizontal" if local_bbox[2] - local_bbox[0] >= local_bbox[3] - local_bbox[1] else "vertical"
32
+ )
33
+ output.append(
34
+ _LocalAxisLine(
35
+ bbox=local_bbox,
36
+ original_bbox=line.bbox,
37
+ orientation=orientation,
38
+ width=line.width,
39
+ )
40
+ )
41
+ return output
42
+
43
+
44
+ def _bbox_overlap_in_first(first: BBox, second: BBox) -> float:
45
+ """计算交集面积占第一个 bbox 面积的比例。"""
46
+
47
+ width = max(0.0, min(first[2], second[2]) - max(first[0], second[0]))
48
+ height = max(0.0, min(first[3], second[3]) - max(first[1], second[1]))
49
+ first_area = _bbox_area(first)
50
+ return width * height / first_area if first_area > 0 else 0.0
51
+
52
+
53
+ def _bbox_area(bbox: BBox) -> float:
54
+ """返回合法 bbox 的非负面积。"""
55
+
56
+ return max(0.0, bbox[2] - bbox[0]) * max(0.0, bbox[3] - bbox[1])
57
+
58
+
59
+ def _normalize_bbox_to_unit(
60
+ bbox: BBox,
61
+ page_size: tuple[float, float],
62
+ ) -> list[float]:
63
+ """将绝对 bbox 归一化到 0-1 单位区间,并保证舍入后的宽高至少各占一个刻度。"""
64
+
65
+ page_width, page_height = page_size
66
+ ticks = [
67
+ max(0, min(1000, int(round(bbox[0] / page_width * 1000)))),
68
+ max(0, min(1000, int(round(bbox[1] / page_height * 1000)))),
69
+ max(0, min(1000, int(round(bbox[2] / page_width * 1000)))),
70
+ max(0, min(1000, int(round(bbox[3] / page_height * 1000)))),
71
+ ]
72
+ if ticks[2] <= ticks[0]:
73
+ if ticks[0] < 1000:
74
+ ticks[2] = ticks[0] + 1
75
+ else:
76
+ ticks[0] = max(0, ticks[2] - 1)
77
+ if ticks[3] <= ticks[1]:
78
+ if ticks[1] < 1000:
79
+ ticks[3] = ticks[1] + 1
80
+ else:
81
+ ticks[1] = max(0, ticks[3] - 1)
82
+ return [tick / 1000 for tick in ticks]
83
+
84
+
85
+ def _rotate_bbox_to_upright(
86
+ bbox: BBox,
87
+ page_size: tuple[float, float],
88
+ angle: int,
89
+ ) -> BBox:
90
+ """将页面 bbox 转到当前文本方向的正向局部坐标。"""
91
+
92
+ page_width, page_height = page_size
93
+ x0, y0, x1, y1 = bbox
94
+ if angle == 270:
95
+ return (page_height - y1, x0, page_height - y0, x1)
96
+ if angle == 90:
97
+ return (y0, page_width - x1, y1, page_width - x0)
98
+ if angle == 180:
99
+ return (page_width - x1, page_height - y1, page_width - x0, page_height - y0)
100
+ return bbox
101
+
102
+
103
+ def _rotate_bbox_from_upright(
104
+ bbox: BBox,
105
+ page_size: tuple[float, float],
106
+ angle: int,
107
+ ) -> BBox:
108
+ """将正向局部 bbox 逆变换回 PDF 页面坐标。"""
109
+
110
+ page_width, page_height = page_size
111
+ x0, y0, x1, y1 = bbox
112
+ if angle == 270:
113
+ return (y0, page_height - x1, y1, page_height - x0)
114
+ if angle == 90:
115
+ return (page_width - y1, x0, page_width - y0, x1)
116
+ if angle == 180:
117
+ return (page_width - x1, page_height - y1, page_width - x0, page_height - y0)
118
+ return bbox
119
+
120
+
121
+ def _rotate_origin_to_upright(
122
+ origin: tuple[float, float],
123
+ page_size: tuple[float, float],
124
+ angle: int,
125
+ ) -> tuple[float, float]:
126
+ """将页面字符 origin 转到当前文字方向的正向局部坐标。"""
127
+
128
+ page_width, page_height = page_size
129
+ x, y = origin
130
+ if angle == 270:
131
+ return (page_height - y, x)
132
+ if angle == 90:
133
+ return (y, page_width - x)
134
+ if angle == 180:
135
+ return (page_width - x, page_height - y)
136
+ return origin
137
+
138
+
139
+ def _coerce_bbox(value: Any) -> BBox | None:
140
+ """将任意四元 bbox 规范成非退化浮点坐标。"""
141
+
142
+ try:
143
+ x0, y0, x1, y1 = [float(item) for item in value]
144
+ except (TypeError, ValueError):
145
+ return None
146
+ left, right = sorted((x0, x1))
147
+ top, bottom = sorted((y0, y1))
148
+ if not all(math.isfinite(item) for item in (left, top, right, bottom)):
149
+ return None
150
+ if right <= left or bottom <= top:
151
+ return None
152
+ return (left, top, right, bottom)
153
+
154
+
155
+ def _clip_bbox(
156
+ bbox: BBox | None,
157
+ page_size: tuple[float, float],
158
+ ) -> BBox | None:
159
+ """将 bbox 裁剪到页面范围,退化框返回 None。"""
160
+
161
+ if bbox is None:
162
+ return None
163
+ page_width, page_height = page_size
164
+ return _coerce_bbox(
165
+ (
166
+ max(0.0, min(page_width, bbox[0])),
167
+ max(0.0, min(page_height, bbox[1])),
168
+ max(0.0, min(page_width, bbox[2])),
169
+ max(0.0, min(page_height, bbox[3])),
170
+ )
171
+ )
172
+
173
+
174
+ def _clip_validated_bbox(bbox: BBox | None, page_size: tuple[float, float]) -> BBox | None:
175
+ """复用本阶段已校验的有限正向框;不再次转换、排序或校验同一组坐标。"""
176
+ if bbox is None:
177
+ return None
178
+ page_width, page_height = page_size
179
+ left = float(max(0.0, min(page_width, bbox[0])))
180
+ top = float(max(0.0, min(page_height, bbox[1])))
181
+ right = float(max(0.0, min(page_width, bbox[2])))
182
+ bottom = float(max(0.0, min(page_height, bbox[3])))
183
+ if right <= left or bottom <= top:
184
+ return None
185
+ return left, top, right, bottom
186
+
187
+
188
+ def _bbox_union(first: BBox, second: BBox) -> BBox:
189
+ """返回两个 bbox 的外接并集框。"""
190
+
191
+ return (
192
+ min(first[0], second[0]),
193
+ min(first[1], second[1]),
194
+ max(first[2], second[2]),
195
+ max(first[3], second[3]),
196
+ )
197
+
198
+
199
+ def _bbox_union_many(bboxes: Sequence[BBox]) -> BBox:
200
+ """返回非空 bbox 序列的外接并集框。"""
201
+
202
+ if not bboxes:
203
+ raise ValueError("bbox sequence must not be empty")
204
+ result = bboxes[0]
205
+ for bbox in bboxes[1:]:
206
+ result = _bbox_union(result, bbox)
207
+ return result
208
+
209
+
210
+ def _expand_bbox(bbox: BBox, margin: float) -> BBox:
211
+ """向四周扩展 bbox,仅供几何容差判定使用。"""
212
+
213
+ return (
214
+ bbox[0] - margin,
215
+ bbox[1] - margin,
216
+ bbox[2] + margin,
217
+ bbox[3] + margin,
218
+ )
219
+
220
+
221
+ def _bbox_center_x(bbox: BBox) -> float:
222
+ """返回 bbox 的水平中心。"""
223
+
224
+ return (bbox[0] + bbox[2]) / 2.0
225
+
226
+
227
+ def _bbox_center_y(bbox: BBox) -> float:
228
+ """返回 bbox 的垂直中心。"""
229
+
230
+ return (bbox[1] + bbox[3]) / 2.0
231
+
232
+
233
+ def _bbox_intersects(first: BBox, second: BBox) -> bool:
234
+ """检查两个 bbox 是否存在正面积交叠。"""
235
+
236
+ return min(first[2], second[2]) > max(first[0], second[0]) and min(first[3], second[3]) > max(first[1], second[1])
237
+
238
+
239
+ def _bbox_distance(first: BBox, second: BBox) -> float:
240
+ """返回两个 bbox 的欧氏净空距离,交叠或相接时为零。"""
241
+
242
+ horizontal_gap = max(first[0] - second[2], second[0] - first[2], 0.0)
243
+ vertical_gap = max(first[1] - second[3], second[1] - first[3], 0.0)
244
+ return math.hypot(horizontal_gap, vertical_gap)
245
+
246
+
247
+ def _bbox_overlap_in_smaller(first: BBox, second: BBox) -> float:
248
+ """计算交集面积占较小 bbox 面积的比例。"""
249
+
250
+ width = max(0.0, min(first[2], second[2]) - max(first[0], second[0]))
251
+ height = max(0.0, min(first[3], second[3]) - max(first[1], second[1]))
252
+ intersection = width * height
253
+ first_area = (first[2] - first[0]) * (first[3] - first[1])
254
+ second_area = (second[2] - second[0]) * (second[3] - second[1])
255
+ smaller_area = min(first_area, second_area)
256
+ return intersection / smaller_area if smaller_area > 0 else 0.0
257
+
258
+
259
+ def _bbox_axis_overlap_ratio(
260
+ first: BBox,
261
+ second: BBox,
262
+ *,
263
+ axis: Literal["x", "y"],
264
+ ) -> float:
265
+ """计算指定轴上的交叠长度占较短轴长的比例。"""
266
+
267
+ if axis == "x":
268
+ first_start, first_end = first[0], first[2]
269
+ second_start, second_end = second[0], second[2]
270
+ else:
271
+ first_start, first_end = first[1], first[3]
272
+ second_start, second_end = second[1], second[3]
273
+ overlap = max(0.0, min(first_end, second_end) - max(first_start, second_start))
274
+ shorter = min(first_end - first_start, second_end - second_start)
275
+ return overlap / shorter if shorter > 0 else 0.0
276
+
277
+
278
+ def _point_in_bbox(point: tuple[float, float], bbox: BBox) -> bool:
279
+ """检查点是否位于 bbox 内部或边界上。"""
280
+
281
+ return bbox[0] <= point[0] <= bbox[2] and bbox[1] <= point[1] <= bbox[3]