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,329 @@
1
+ """PPTX 图片、图表与公式资源,复用当前转换器的单文档状态。"""
2
+
3
+ import base64
4
+ from typing import Any, Optional
5
+ from loguru import logger
6
+ from pptx.enum.shapes import MSO_SHAPE_TYPE
7
+ from ..ooxml_chart import extract_chart_html_from_ooxml
8
+ from ..image import serialize_office_image
9
+ from ..equation.ooxml import is_mathtype_equation_prog_id
10
+ from .....schema import BlockType
11
+
12
+ from .context import DRAWINGML_NS, RELATIONSHIP_NS, SVG_BLIP_NS, OMML_NS
13
+
14
+
15
+ class _PptxResources:
16
+ """集中维护图片、图表与公式资源,不改变文档生命周期和公开入口。"""
17
+
18
+ @staticmethod
19
+ def _pptx_ole_format(shape: Any) -> Any | None:
20
+ """安全返回 PPTX graphic-frame 的 OLE format。"""
21
+
22
+ try:
23
+ return shape.ole_format
24
+ except (AttributeError, KeyError, ValueError):
25
+ return None
26
+
27
+ def _is_equation_ole_shape(self, shape: Any) -> bool:
28
+ """判断 PPTX OLE shape 的 ProgID 是否为 MathType/Equation 公式。"""
29
+
30
+ ole_format = self._pptx_ole_format(shape)
31
+ return bool(ole_format is not None and is_mathtype_equation_prog_id(getattr(ole_format, "prog_id", None)))
32
+
33
+ def _decode_pptx_ole_equation(self, shape: Any) -> str | None:
34
+ """解码 PPTX 内嵌公式 OLE;链接、图标和坏对象返回空。"""
35
+
36
+ ole_format = self._pptx_ole_format(shape)
37
+ if ole_format is None:
38
+ return None
39
+ prog_id = getattr(ole_format, "prog_id", None)
40
+ if not is_mathtype_equation_prog_id(prog_id):
41
+ return None
42
+ if bool(getattr(ole_format, "show_as_icon", False)):
43
+ return None
44
+ if self._safe_shape_type(shape) != MSO_SHAPE_TYPE.EMBEDDED_OLE_OBJECT:
45
+ return None
46
+ try:
47
+ blob = ole_format.blob
48
+ except (AttributeError, KeyError, ValueError):
49
+ blob = None
50
+ latex = self._ooxml_equation_decoder.decode(
51
+ blob,
52
+ prog_id=prog_id,
53
+ )
54
+ if latex is not None:
55
+ return latex
56
+
57
+ warning_key = (
58
+ str(getattr(getattr(shape, "part", None), "partname", "")),
59
+ getattr(shape, "shape_id", None),
60
+ )
61
+ if warning_key not in self._mtef_warned_shapes:
62
+ self._mtef_warned_shapes.add(warning_key)
63
+ logger.warning(
64
+ "PPTX_MTEF_FALLBACK: part={!r}, shape_id={!r} has an invalid or unsupported equation OLE object",
65
+ warning_key[0],
66
+ warning_key[1],
67
+ )
68
+ return None
69
+
70
+ def _pptx_ole_shape_omml(self, shape: Any) -> list[str]:
71
+ """提取 OLE 兼容容器内可表达的 OMML,作为 MTEF 的高优先级分支。"""
72
+
73
+ element = getattr(shape, "_element", None)
74
+ if element is None:
75
+ return []
76
+ equations: list[str] = []
77
+ for math in element.findall(f".//{{{OMML_NS}}}oMath"):
78
+ latex = self._convert_math_node_to_latex(math)
79
+ if latex:
80
+ equations.append(latex)
81
+ return equations
82
+
83
+ def _handle_tables(self, shape):
84
+ """将PowerPoint表格转换为HTML格式。
85
+
86
+ Args:
87
+ shape: 包含表格的形状对象。
88
+ parent_slide: 父幻灯片组。
89
+ slide_ind: 当前幻灯片索引。
90
+ doc: 文档对象(此实现中未使用)。
91
+ slide_size: 幻灯片尺寸。
92
+
93
+ Returns:
94
+ str: 表格的HTML字符串,如果没有表格则返回None。
95
+ """
96
+ if not shape.has_table:
97
+ return None
98
+
99
+ table = shape.table
100
+ table_xml = shape._element
101
+
102
+ # 开始构建HTML表格
103
+ html_parts = ['<table border="1">']
104
+
105
+ # 跟踪已被合并单元格占用的位置
106
+ # 格式: {(row, col): True}
107
+ occupied_cells = {}
108
+
109
+ for row_idx, row in enumerate(table.rows):
110
+ html_parts.append(" <tr>")
111
+
112
+ for col_idx, cell in enumerate(row.cells):
113
+ # 跳过被合并占用的单元格
114
+ if (row_idx, col_idx) in occupied_cells:
115
+ continue
116
+ # 获取单元格XML以读取跨度信息
117
+ cell_xml = table_xml.xpath(f".//a:tbl/a:tr[{row_idx + 1}]/a:tc[{col_idx + 1}]")
118
+
119
+ if not cell_xml:
120
+ continue
121
+
122
+ cell_xml = cell_xml[0]
123
+
124
+ # 解析行跨度和列跨度
125
+ row_span = cell_xml.get("rowSpan")
126
+ col_span = cell_xml.get("gridSpan")
127
+
128
+ row_span = int(row_span) if row_span else 1
129
+ col_span = int(col_span) if col_span else 1
130
+
131
+ # 标记被此单元格占用的位置
132
+ for r in range(row_idx, row_idx + row_span):
133
+ for c in range(col_idx, col_idx + col_span):
134
+ if (r, c) != (row_idx, col_idx):
135
+ occupied_cells[(r, c)] = True
136
+
137
+ # 确定标签类型:第一行使用<th>,其他使用<td>
138
+ tag = "th" if row_idx == 0 else "td"
139
+
140
+ # 构建属性字符串
141
+ attrs = []
142
+ if row_span > 1:
143
+ attrs.append(f'rowspan="{row_span}"')
144
+ if col_span > 1:
145
+ attrs.append(f'colspan="{col_span}"')
146
+
147
+ attr_str = " " + " ".join(attrs) if attrs else ""
148
+
149
+ # 获取单元格文本内容
150
+ cell_text = cell.text.strip() if cell.text else ""
151
+ # 转义HTML特殊字符,防止XSS
152
+ cell_text = cell_text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
153
+
154
+ html_parts.append(f" <{tag}{attr_str}>{cell_text}</{tag}>")
155
+
156
+ html_parts.append(" </tr>")
157
+
158
+ html_parts.append("</table>")
159
+
160
+ self.cur_page.append(
161
+ {
162
+ "type": BlockType.TABLE,
163
+ "content": "\n".join(html_parts),
164
+ }
165
+ )
166
+
167
+ return None
168
+
169
+ def _handle_chart(self, shape) -> None:
170
+ """按原有图片、图表与公式资源规则执行 _handle_chart,保持输入顺序与降级行为。"""
171
+ try:
172
+ chart_part = shape.chart.part
173
+ chart_xml = chart_part.blob
174
+ except Exception as e:
175
+ logger.warning(f"Warning: chart XML cannot be loaded: {e}")
176
+ return
177
+
178
+ workbook_bytes = None
179
+ try:
180
+ chart_workbook = chart_part.chart_workbook
181
+ xlsx_part = chart_workbook.xlsx_part
182
+ if xlsx_part is not None:
183
+ workbook_bytes = xlsx_part.blob
184
+ except Exception as e:
185
+ logger.warning(f"Warning: chart workbook cannot be loaded: {e}")
186
+
187
+ try:
188
+ chart_html = extract_chart_html_from_ooxml(chart_xml, workbook_bytes)
189
+ except Exception as e:
190
+ logger.warning(f"Warning: chart HTML cannot be extracted: {e}")
191
+ return
192
+
193
+ if not chart_html:
194
+ return
195
+
196
+ self.cur_page.append(
197
+ {
198
+ "type": BlockType.CHART,
199
+ "content": chart_html,
200
+ }
201
+ )
202
+
203
+ def _handle_pictures(self, shape):
204
+ """按原有图片、图表与公式资源规则执行 _handle_pictures,保持输入顺序与降级行为。"""
205
+ image_data = self._get_shape_image_data(shape)
206
+ if image_data is None:
207
+ return
208
+
209
+ image_bytes, content_type = image_data
210
+
211
+ latex = self._image_equation_decoder.decode(
212
+ image_bytes,
213
+ content_type=content_type,
214
+ )
215
+ if latex:
216
+ self.cur_page.append(
217
+ {
218
+ "type": BlockType.EQUATION,
219
+ "content": latex,
220
+ }
221
+ )
222
+ return
223
+
224
+ if content_type == "image/svg+xml":
225
+ image_block = {
226
+ "type": BlockType.IMAGE,
227
+ "image_base64": self._bytes_to_data_uri(image_bytes, content_type),
228
+ }
229
+ self.cur_page.append(image_block)
230
+ return
231
+
232
+ img_base64 = serialize_office_image(
233
+ image_bytes,
234
+ content_type=content_type,
235
+ )
236
+ if img_base64 is None:
237
+ return
238
+
239
+ image_block = {
240
+ "type": BlockType.IMAGE,
241
+ "image_base64": img_base64,
242
+ }
243
+ self.cur_page.append(image_block)
244
+ return
245
+
246
+ def _decode_pptx_shape_image_equation(self, shape: Any) -> str | None:
247
+ """从普通 picture 或 OLE preview 的 WMF/GIF comment 恢复公式。"""
248
+
249
+ image_data = self._get_shape_image_data(shape)
250
+ if image_data is None:
251
+ return None
252
+ image_bytes, content_type = image_data
253
+ return self._image_equation_decoder.decode(
254
+ image_bytes,
255
+ content_type=content_type,
256
+ )
257
+
258
+ @staticmethod
259
+ def _bytes_to_data_uri(image_bytes: bytes, content_type: str) -> str:
260
+ """按原有图片、图表与公式资源规则执行 _bytes_to_data_uri,保持输入顺序与降级行为。"""
261
+ encoded = base64.b64encode(image_bytes).decode("utf-8")
262
+ return f"data:{content_type};base64,{encoded}"
263
+
264
+ @staticmethod
265
+ def _find_first_embedded_image_rid(shape) -> Optional[str]:
266
+ """按原有图片、图表与公式资源规则执行 _find_first_embedded_image_rid,保持输入顺序与降级行为。"""
267
+ svg_blips = shape._element.findall(f".//{{{SVG_BLIP_NS}}}svgBlip")
268
+ for svg_blip in svg_blips:
269
+ relationship_id = svg_blip.get(f"{{{RELATIONSHIP_NS}}}embed")
270
+ if relationship_id:
271
+ return relationship_id
272
+
273
+ blips = shape._element.findall(f".//{{{DRAWINGML_NS}}}blip")
274
+ for blip in blips:
275
+ relationship_id = blip.get(f"{{{RELATIONSHIP_NS}}}embed")
276
+ if relationship_id:
277
+ return relationship_id
278
+
279
+ return None
280
+
281
+ @staticmethod
282
+ def _has_blip_without_relationship(shape) -> bool:
283
+ """判断图片节点是否只有空blip,避免把空fallback误报为图片资源缺失。"""
284
+ if not hasattr(shape, "_element"):
285
+ return False
286
+
287
+ blips = [
288
+ *shape._element.findall(f".//{{{SVG_BLIP_NS}}}svgBlip"),
289
+ *shape._element.findall(f".//{{{DRAWINGML_NS}}}blip"),
290
+ ]
291
+ if not blips:
292
+ return False
293
+
294
+ for blip in blips:
295
+ if blip.get(f"{{{RELATIONSHIP_NS}}}embed") or blip.get(f"{{{RELATIONSHIP_NS}}}link"):
296
+ return False
297
+ return True
298
+
299
+ def _get_shape_image_data(self, shape) -> Optional[tuple[bytes, Optional[str]]]:
300
+ """按原有图片、图表与公式资源规则执行 _get_shape_image_data,保持输入顺序与降级行为。"""
301
+ relationship_id = None
302
+ if hasattr(shape, "_element"):
303
+ relationship_id = self._find_first_embedded_image_rid(shape)
304
+
305
+ if relationship_id:
306
+ try:
307
+ image_part = shape.part.related_part(relationship_id)
308
+ image_bytes = image_part.blob
309
+ except Exception as e:
310
+ logger.warning(f"Warning: embedded image relation {relationship_id} cannot be loaded: {e}")
311
+ else:
312
+ return image_bytes, getattr(image_part, "content_type", None)
313
+
314
+ if self._has_blip_without_relationship(shape):
315
+ logger.debug("Skipping PPTX picture with empty blip and no image relation")
316
+ return None
317
+
318
+ try:
319
+ image = shape.image
320
+ except KeyError as e:
321
+ logger.warning(f"Warning: shape image relation cannot be loaded: {e}")
322
+ return None
323
+ except ValueError as e:
324
+ logger.warning(f"Warning: shape image cannot be loaded: {e}")
325
+ return None
326
+ except AttributeError:
327
+ return None
328
+
329
+ return image.blob, None