BabelDOC 0.5.11__tar.gz → 0.5.12__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 (314) hide show
  1. {babeldoc-0.5.11 → babeldoc-0.5.12}/PKG-INFO +1 -1
  2. babeldoc-0.5.12/babeldoc/__init__.py +1 -0
  3. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/const.py +44 -1
  4. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout6.py +20 -15
  5. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py +3 -0
  6. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/layout_parser.py +51 -35
  7. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py +8 -0
  8. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/extract_char.py +10 -0
  9. babeldoc-0.5.12/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +42 -0
  10. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/main.py +25 -3
  11. {babeldoc-0.5.11 → babeldoc-0.5.12}/pyproject.toml +2 -2
  12. babeldoc-0.5.11/babeldoc/__init__.py +0 -1
  13. babeldoc-0.5.11/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +0 -10
  14. {babeldoc-0.5.11 → babeldoc-0.5.12}/.cursorignore +0 -0
  15. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  16. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  17. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
  18. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  19. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/dependabot.yml +0 -0
  20. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/labels.yml +0 -0
  21. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/release-drafter.yml +0 -0
  22. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/codeql.yml +0 -0
  23. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/docs.yml +0 -0
  24. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/labeler.yml +0 -0
  25. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/lint.yml +0 -0
  26. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/pr-lint.yml +0 -0
  27. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/publish-to-pypi.yml +0 -0
  28. {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/test.yml +0 -0
  29. {babeldoc-0.5.11 → babeldoc-0.5.12}/.gitignore +0 -0
  30. {babeldoc-0.5.11 → babeldoc-0.5.12}/.pre-commit-config.yaml +0 -0
  31. {babeldoc-0.5.11 → babeldoc-0.5.12}/LICENSE +0 -0
  32. {babeldoc-0.5.11 → babeldoc-0.5.12}/README.md +0 -0
  33. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/assets/assets.py +0 -0
  34. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  35. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/asynchronize/__init__.py +0 -0
  36. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/babeldoc_exception/BabelDOCException.py +0 -0
  37. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/babeldoc_exception/__init__.py +0 -0
  38. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/README.md +0 -0
  39. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/__init__.py +0 -0
  40. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/base_doclayout.py +0 -0
  41. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/doclayout.py +0 -0
  42. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout.py +0 -0
  43. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout2.py +0 -0
  44. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout3.py +0 -0
  45. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout4.py +0 -0
  46. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout5.py +0 -0
  47. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout7.py +0 -0
  48. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
  49. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/__init__.py +0 -0
  50. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/__init__.py +0 -0
  51. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/base14.py +0 -0
  52. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/cidfont.py +0 -0
  53. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/encoding.py +0 -0
  54. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/utils.py +0 -0
  55. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/win_core.py +0 -0
  56. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/converter.py +0 -0
  57. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/__init__.py +0 -0
  58. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/backend/__init__.py +0 -0
  59. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/backend/pdf_creater.py +0 -0
  60. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/frontend/__init__.py +0 -0
  61. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/frontend/il_creater.py +0 -0
  62. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.py +0 -0
  63. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.rnc +0 -0
  64. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.rng +0 -0
  65. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.xsd +0 -0
  66. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/__init__.py +0 -0
  67. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/add_debug_information.py +0 -0
  68. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/automatic_term_extractor.py +0 -0
  69. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/il_translator.py +0 -0
  70. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py +0 -0
  71. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py +0 -0
  72. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/remove_descent.py +0 -0
  73. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/table_parser.py +0 -0
  74. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/typesetting.py +0 -0
  75. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/__init__.py +0 -0
  76. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/fontmap.py +0 -0
  77. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/formular_helper.py +0 -0
  78. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/layout_helper.py +0 -0
  79. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/matrix_helper.py +0 -0
  80. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/paragraph_helper.py +0 -0
  81. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/spatial_analyzer.py +0 -0
  82. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/style_helper.py +0 -0
  83. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/zstd_helper.py +0 -0
  84. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/xml_converter.py +0 -0
  85. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/high_level.py +1 -1
  86. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/pdfinterp.py +0 -0
  87. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/result_merger.py +0 -0
  88. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/split_manager.py +0 -0
  89. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/translation_config.py +0 -0
  90. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/glossary.py +0 -0
  91. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/LICENSE +0 -0
  92. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/__init__.py +0 -0
  93. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/_saslprep.py +0 -0
  94. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/arcfour.py +0 -0
  95. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/ascii85.py +0 -0
  96. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/casting.py +0 -0
  97. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/ccitt.py +0 -0
  98. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-EUC-H.pickle.gz +0 -0
  99. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-EUC-V.pickle.gz +0 -0
  100. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-H.pickle.gz +0 -0
  101. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-RKSJ-H.pickle.gz +0 -0
  102. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-RKSJ-V.pickle.gz +0 -0
  103. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-V.pickle.gz +0 -0
  104. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78ms-RKSJ-H.pickle.gz +0 -0
  105. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78ms-RKSJ-V.pickle.gz +0 -0
  106. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/83pv-RKSJ-H.pickle.gz +0 -0
  107. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/83pv-RKSJ-V.pickle.gz +0 -0
  108. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90ms-RKSJ-H.pickle.gz +0 -0
  109. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90ms-RKSJ-V.pickle.gz +0 -0
  110. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90msp-RKSJ-H.pickle.gz +0 -0
  111. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90msp-RKSJ-V.pickle.gz +0 -0
  112. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90pv-RKSJ-H.pickle.gz +0 -0
  113. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90pv-RKSJ-V.pickle.gz +0 -0
  114. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-H.pickle.gz +0 -0
  115. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-RKSJ-H.pickle.gz +0 -0
  116. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-RKSJ-V.pickle.gz +0 -0
  117. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-V.pickle.gz +0 -0
  118. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5-H.pickle.gz +0 -0
  119. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5-V.pickle.gz +0 -0
  120. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5pc-H.pickle.gz +0 -0
  121. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5pc-V.pickle.gz +0 -0
  122. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS-EUC-H.pickle.gz +0 -0
  123. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS-EUC-V.pickle.gz +0 -0
  124. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS1-H.pickle.gz +0 -0
  125. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS1-V.pickle.gz +0 -0
  126. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS2-H.pickle.gz +0 -0
  127. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS2-V.pickle.gz +0 -0
  128. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETHK-B5-H.pickle.gz +0 -0
  129. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETHK-B5-V.pickle.gz +0 -0
  130. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETen-B5-H.pickle.gz +0 -0
  131. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETen-B5-V.pickle.gz +0 -0
  132. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETenms-B5-H.pickle.gz +0 -0
  133. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETenms-B5-V.pickle.gz +0 -0
  134. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/EUC-H.pickle.gz +0 -0
  135. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/EUC-V.pickle.gz +0 -0
  136. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-H.pickle.gz +0 -0
  137. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-RKSJ-H.pickle.gz +0 -0
  138. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-RKSJ-V.pickle.gz +0 -0
  139. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-V.pickle.gz +0 -0
  140. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-EUC-H.pickle.gz +0 -0
  141. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-EUC-V.pickle.gz +0 -0
  142. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-H.pickle.gz +0 -0
  143. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-V.pickle.gz +0 -0
  144. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK-EUC-H.pickle.gz +0 -0
  145. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK-EUC-V.pickle.gz +0 -0
  146. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK2K-H.pickle.gz +0 -0
  147. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK2K-V.pickle.gz +0 -0
  148. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBKp-EUC-H.pickle.gz +0 -0
  149. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBKp-EUC-V.pickle.gz +0 -0
  150. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-EUC-H.pickle.gz +0 -0
  151. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-EUC-V.pickle.gz +0 -0
  152. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-H.pickle.gz +0 -0
  153. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-V.pickle.gz +0 -0
  154. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBTpc-EUC-H.pickle.gz +0 -0
  155. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBTpc-EUC-V.pickle.gz +0 -0
  156. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBpc-EUC-H.pickle.gz +0 -0
  157. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBpc-EUC-V.pickle.gz +0 -0
  158. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/H.pickle.gz +0 -0
  159. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdla-B5-H.pickle.gz +0 -0
  160. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdla-B5-V.pickle.gz +0 -0
  161. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdlb-B5-H.pickle.gz +0 -0
  162. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdlb-B5-V.pickle.gz +0 -0
  163. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKgccs-B5-H.pickle.gz +0 -0
  164. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKgccs-B5-V.pickle.gz +0 -0
  165. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm314-B5-H.pickle.gz +0 -0
  166. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm314-B5-V.pickle.gz +0 -0
  167. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm471-B5-H.pickle.gz +0 -0
  168. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm471-B5-V.pickle.gz +0 -0
  169. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKscs-B5-H.pickle.gz +0 -0
  170. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKscs-B5-V.pickle.gz +0 -0
  171. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hankaku-H.pickle.gz +0 -0
  172. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hankaku-V.pickle.gz +0 -0
  173. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hiragana-H.pickle.gz +0 -0
  174. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hiragana-V.pickle.gz +0 -0
  175. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-EUC-H.pickle.gz +0 -0
  176. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-EUC-V.pickle.gz +0 -0
  177. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-H.pickle.gz +0 -0
  178. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-Johab-H.pickle.gz +0 -0
  179. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-Johab-V.pickle.gz +0 -0
  180. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-V.pickle.gz +0 -0
  181. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-H.pickle.gz +0 -0
  182. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-H.pickle.gz +0 -0
  183. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-V.pickle.gz +0 -0
  184. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-V.pickle.gz +0 -0
  185. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCpc-EUC-H.pickle.gz +0 -0
  186. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCpc-EUC-V.pickle.gz +0 -0
  187. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Katakana-H.pickle.gz +0 -0
  188. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Katakana-V.pickle.gz +0 -0
  189. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/NWP-H.pickle.gz +0 -0
  190. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/NWP-V.pickle.gz +0 -0
  191. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/README.txt +0 -0
  192. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/RKSJ-H.pickle.gz +0 -0
  193. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/RKSJ-V.pickle.gz +0 -0
  194. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Roman-H.pickle.gz +0 -0
  195. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Roman-V.pickle.gz +0 -0
  196. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UCS2-H.pickle.gz +0 -0
  197. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UCS2-V.pickle.gz +0 -0
  198. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF16-H.pickle.gz +0 -0
  199. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF16-V.pickle.gz +0 -0
  200. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF32-H.pickle.gz +0 -0
  201. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF32-V.pickle.gz +0 -0
  202. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF8-H.pickle.gz +0 -0
  203. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF8-V.pickle.gz +0 -0
  204. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UCS2-H.pickle.gz +0 -0
  205. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UCS2-V.pickle.gz +0 -0
  206. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF16-H.pickle.gz +0 -0
  207. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF16-V.pickle.gz +0 -0
  208. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF32-H.pickle.gz +0 -0
  209. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF32-V.pickle.gz +0 -0
  210. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF8-H.pickle.gz +0 -0
  211. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF8-V.pickle.gz +0 -0
  212. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-H.pickle.gz +0 -0
  213. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-H.pickle.gz +0 -0
  214. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-V.pickle.gz +0 -0
  215. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-V.pickle.gz +0 -0
  216. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF16-H.pickle.gz +0 -0
  217. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF16-V.pickle.gz +0 -0
  218. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF32-H.pickle.gz +0 -0
  219. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF32-V.pickle.gz +0 -0
  220. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF8-H.pickle.gz +0 -0
  221. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF8-V.pickle.gz +0 -0
  222. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-H.pickle.gz +0 -0
  223. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-V.pickle.gz +0 -0
  224. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-H.pickle.gz +0 -0
  225. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-V.pickle.gz +0 -0
  226. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-H.pickle.gz +0 -0
  227. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-V.pickle.gz +0 -0
  228. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-H.pickle.gz +0 -0
  229. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-V.pickle.gz +0 -0
  230. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-H.pickle.gz +0 -0
  231. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-V.pickle.gz +0 -0
  232. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UCS2-H.pickle.gz +0 -0
  233. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UCS2-V.pickle.gz +0 -0
  234. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF16-H.pickle.gz +0 -0
  235. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF16-V.pickle.gz +0 -0
  236. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF32-H.pickle.gz +0 -0
  237. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF32-V.pickle.gz +0 -0
  238. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF8-H.pickle.gz +0 -0
  239. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF8-V.pickle.gz +0 -0
  240. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/V.pickle.gz +0 -0
  241. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/WP-Symbol-H.pickle.gz +0 -0
  242. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/WP-Symbol-V.pickle.gz +0 -0
  243. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-CNS1.pickle.gz +0 -0
  244. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-GB1.pickle.gz +0 -0
  245. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Japan1.pickle.gz +0 -0
  246. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Korea1.pickle.gz +0 -0
  247. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmapdb.py +0 -0
  248. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/converter.py +0 -0
  249. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/data_structures.py +0 -0
  250. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/encodingdb.py +0 -0
  251. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/fontmetrics.py +0 -0
  252. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/glyphlist.py +0 -0
  253. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/high_level.py +0 -0
  254. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/image.py +0 -0
  255. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/jbig2.py +0 -0
  256. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/latin_enc.py +0 -0
  257. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/layout.py +0 -0
  258. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/lzw.py +0 -0
  259. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfcolor.py +0 -0
  260. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfdevice.py +0 -0
  261. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfdocument.py +0 -0
  262. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfexceptions.py +0 -0
  263. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdffont.py +0 -0
  264. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfinterp.py +0 -0
  265. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfpage.py +0 -0
  266. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfparser.py +0 -0
  267. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdftypes.py +0 -0
  268. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/psexceptions.py +0 -0
  269. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/psparser.py +0 -0
  270. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/py.typed +0 -0
  271. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/runlength.py +0 -0
  272. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/settings.py +0 -0
  273. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/utils.py +0 -0
  274. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/progress_monitor.py +0 -0
  275. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/generate_font_metadata.py +0 -0
  276. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/italic_assistance.py +0 -0
  277. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/italic_recognize_tool.py +0 -0
  278. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/__init__.py +0 -0
  279. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/cache.py +0 -0
  280. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/translator.py +0 -0
  281. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/__init__.py +0 -0
  282. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/atomic_integer.py +0 -0
  283. {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/priority_thread_pool_executor.py +0 -0
  284. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CODE_OF_CONDUCT.md +0 -0
  285. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CONTRIBUTING.md +0 -0
  286. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CONTRIBUTOR_REWARD.md +0 -0
  287. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  288. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  289. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  290. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  291. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  292. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/README.md +0 -0
  293. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  294. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  295. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/README.md +0 -0
  296. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/deploy.sh +0 -0
  297. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/example/demo_glossary.csv +0 -0
  298. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-banner.png +0 -0
  299. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  300. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  301. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  302. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  303. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo.png +0 -0
  304. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  305. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-preview.gif +0 -0
  306. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  307. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  308. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo.png +0 -0
  309. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/index.md +0 -0
  310. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/intro-to-pdf-object.md +0 -0
  311. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/requirements.txt +0 -0
  312. {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/supported_languages.md +0 -0
  313. {babeldoc-0.5.11 → babeldoc-0.5.12}/mkdocs.yml +0 -0
  314. {babeldoc-0.5.11 → babeldoc-0.5.12}/tests/test_translation_cache_cleanup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.5.11
3
+ Version: 0.5.12
4
4
  Summary: Yet Another Document Translator
5
5
  Project-URL: Homepage, https://github.com/funstory-ai/BabelDOC
6
6
  Project-URL: Issues, https://github.com/funstory-ai/BabelDOC/issues
@@ -0,0 +1 @@
1
+ __version__ = "0.5.12"
@@ -1,9 +1,12 @@
1
+ import itertools
2
+ import multiprocessing as mp
1
3
  import os
2
4
  import shutil
3
5
  import subprocess
6
+ import threading
4
7
  from pathlib import Path
5
8
 
6
- __version__ = "0.5.11"
9
+ __version__ = "0.5.12"
7
10
 
8
11
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
12
 
@@ -39,3 +42,43 @@ except (OSError, FileNotFoundError, subprocess.CalledProcessError):
39
42
  TIKTOKEN_CACHE_FOLDER = CACHE_FOLDER / "tiktoken"
40
43
  TIKTOKEN_CACHE_FOLDER.mkdir(parents=True, exist_ok=True)
41
44
  os.environ["TIKTOKEN_CACHE_DIR"] = str(TIKTOKEN_CACHE_FOLDER)
45
+
46
+
47
+ _process_pool = None
48
+ _process_pool_lock = threading.Lock()
49
+ _ENABLE_PROCESS_POOL = False
50
+
51
+
52
+ def enable_process_pool():
53
+ # Development and Testing ONLY API
54
+ global _ENABLE_PROCESS_POOL
55
+ _ENABLE_PROCESS_POOL = True
56
+
57
+
58
+ # macos & windows use spawn mode
59
+ # linux use forkserver mode
60
+
61
+
62
+ def get_process_pool():
63
+ if not _ENABLE_PROCESS_POOL:
64
+ return None
65
+ global _process_pool
66
+ with _process_pool_lock:
67
+ if _process_pool is None:
68
+ # Create pool only in main process
69
+ if mp.current_process().name != "MainProcess":
70
+ return None
71
+
72
+ _process_pool = mp.Pool()
73
+ return _process_pool
74
+
75
+
76
+ def batched(iterable, n, *, strict=False):
77
+ # batched('ABCDEFG', 3) → ABC DEF G
78
+ if n < 1:
79
+ raise ValueError("n must be at least one")
80
+ iterator = iter(iterable)
81
+ while batch := tuple(itertools.islice(iterator, n)):
82
+ if strict and len(batch) != n:
83
+ raise ValueError("batched(): incomplete batch")
84
+ yield batch
@@ -28,7 +28,9 @@ from babeldoc.format.pdf.document_il.utils.extract_char import (
28
28
  )
29
29
  from babeldoc.format.pdf.document_il.utils.fontmap import FontMapper
30
30
  from babeldoc.format.pdf.document_il.utils.layout_helper import SPACE_REGEX
31
- from babeldoc.format.pdf.document_il.utils.mupdf_helper import get_no_rotation_img
31
+ from babeldoc.format.pdf.document_il.utils.mupdf_helper import (
32
+ get_no_rotation_img_multiprocess,
33
+ )
32
34
 
33
35
  logger = logging.getLogger(__name__)
34
36
  DPI = 150
@@ -141,7 +143,7 @@ def predict_layout(
141
143
  f"{host}/inference",
142
144
  json=request_data,
143
145
  headers={"Accept": "application/json", "Content-Type": "application/json"},
144
- timeout=1800,
146
+ timeout=30,
145
147
  follow_redirects=True,
146
148
  )
147
149
 
@@ -233,7 +235,7 @@ def predict_layout2(
233
235
  "Content-Type": "application/msgpack",
234
236
  "Accept": "application/msgpack",
235
237
  },
236
- timeout=480,
238
+ timeout=30,
237
239
  follow_redirects=True,
238
240
  )
239
241
 
@@ -569,18 +571,19 @@ class RpcDocLayoutModel(DocLayoutModel):
569
571
 
570
572
  return results
571
573
 
572
- def predict_page(
573
- self, page, mupdf_doc: pymupdf.Document, translate_config, save_debug_image
574
- ):
574
+ def predict_page(self, page, pdf_bytes: Path, translate_config, save_debug_image):
575
575
  translate_config.raise_if_cancelled()
576
- with self.lock:
577
- # pix = mupdf_doc[page.page_number].get_pixmap(dpi=72)
578
- pix = get_no_rotation_img(mupdf_doc[page.page_number], dpi=DPI)
579
- image = np.frombuffer(pix.samples, np.uint8).reshape(
580
- pix.height,
581
- pix.width,
582
- 3,
583
- )[:, :, ::-1]
576
+ # doc = pymupdf.open(io.BytesIO(pdf_bytes))
577
+ # with self.lock:
578
+ # pix = mupdf_doc[page.page_number].get_pixmap(dpi=72)
579
+ image = get_no_rotation_img_multiprocess(
580
+ pdf_bytes.as_posix(), page.page_number, dpi=DPI
581
+ )
582
+ # image = np.frombuffer(pix.samples, np.uint8).reshape(
583
+ # pix.height,
584
+ # pix.width,
585
+ # 3,
586
+ # )[:, :, ::-1]
584
587
  char_boxes = convert_page_to_char_boxes(page)
585
588
  lines = process_page_chars_to_lines(char_boxes)
586
589
  predict_result = self.predict_image(image, 800, lines)
@@ -594,11 +597,13 @@ class RpcDocLayoutModel(DocLayoutModel):
594
597
  translate_config,
595
598
  save_debug_image,
596
599
  ):
600
+ layout_temp_path = translate_config.get_working_file_path("layout.temp.pdf")
601
+ mupdf_doc.save(layout_temp_path.as_posix())
597
602
  with ThreadPoolExecutor(max_workers=32) as executor:
598
603
  yield from executor.map(
599
604
  self.predict_page,
600
605
  pages,
601
- (mupdf_doc for _ in range(len(pages))),
606
+ (layout_temp_path for _ in range(len(pages))),
602
607
  (translate_config for _ in range(len(pages))),
603
608
  (save_debug_image for _ in range(len(pages))),
604
609
  )
@@ -9,6 +9,7 @@ from skimage.metrics import structural_similarity
9
9
  from babeldoc.babeldoc_exception.BabelDOCException import ScannedPDFError
10
10
  from babeldoc.format.pdf.document_il import il_version_1
11
11
  from babeldoc.format.pdf.document_il.backend.pdf_creater import PDFCreater
12
+ from babeldoc.format.pdf.document_il.utils.style_helper import BLACK
12
13
  from babeldoc.format.pdf.document_il.utils.style_helper import GREEN
13
14
  from babeldoc.format.pdf.translation_config import TranslationConfig
14
15
 
@@ -143,6 +144,8 @@ class DetectScannedFile:
143
144
  for page in docs.page:
144
145
  for char in page.pdf_character:
145
146
  char.render_order = None
147
+ if not char.debug_info:
148
+ char.pdf_style.graphic_state = BLACK
146
149
 
147
150
  def detect_page_is_scanned(
148
151
  self, page: il_version_1.Page, pdf: pymupdf.Document, pdf_creater: PDFCreater
@@ -1,4 +1,7 @@
1
1
  import logging
2
+ import math
3
+ import os
4
+ from concurrent.futures import ThreadPoolExecutor
2
5
  from pathlib import Path
3
6
 
4
7
  import cv2
@@ -7,7 +10,6 @@ from pymupdf import Document
7
10
 
8
11
  import babeldoc.format.pdf.document_il.utils.extract_char
9
12
  from babeldoc.format.pdf.document_il import il_version_1
10
- from babeldoc.format.pdf.document_il.utils.mupdf_helper import get_no_rotation_img
11
13
  from babeldoc.format.pdf.document_il.utils.style_helper import GREEN
12
14
  from babeldoc.format.pdf.translation_config import TranslationConfig
13
15
 
@@ -120,7 +122,7 @@ class LayoutParser:
120
122
  total = len(docs.page)
121
123
  with self.translation_config.progress_monitor.stage_start(
122
124
  self.stage_name,
123
- total,
125
+ total * 2,
124
126
  ) as progress:
125
127
  # Process predictions for each page
126
128
  for page, layouts in self.model.handle_document(
@@ -134,9 +136,15 @@ class LayoutParser:
134
136
  # Convert coordinate system from picture to il
135
137
  # system to the il coordinate system
136
138
  x0, y0, x1, y1 = layout.xyxy
137
- pix = get_no_rotation_img(mupdf_doc[page.page_number])
139
+ # pix = get_no_rotation_img(mupdf_doc[page.page_number])
138
140
  # pix = mupdf_doc[page.page_number].get_pixmap()
139
- h, w = pix.height, pix.width
141
+ # h, w = pix.height, pix.width
142
+ box = mupdf_doc[page.page_number].mediabox_size
143
+ b_h = math.ceil(box.y)
144
+ b_w = math.ceil(box.x)
145
+ # if b_h != h or b_w != w:
146
+ # logger.warning(f"page {page.page_number} mediabox is not correct, b_h: {b_h}, h: {h}, b_w: {b_w}, w: {w}")
147
+ h, w = b_h, b_w
140
148
  x0, y0, x1, y1 = (
141
149
  np.clip(int(x0 - 1), 0, w - 1),
142
150
  np.clip(int(h - y1 - 1), 0, h - 1),
@@ -157,39 +165,47 @@ class LayoutParser:
157
165
  page_layouts.append(page_layout)
158
166
 
159
167
  page.page_layout = page_layouts
160
- self.generate_fallback_line_layout_for_page(page)
161
- self._save_debug_box_to_page(page)
168
+ # self.generate_fallback_line_layout_for_page(page)
169
+ # self._save_debug_box_to_page(page)
162
170
  progress.advance(1)
163
-
171
+ with ThreadPoolExecutor(max_workers=os.cpu_count()) as executor:
172
+ for page in docs.page:
173
+ executor.submit(
174
+ self.generate_fallback_line_layout_for_page, page, progress
175
+ )
164
176
  return docs
165
177
 
166
- def generate_fallback_line_layout_for_page(self, page: il_version_1.Page):
167
- exists_page_layouts = page.page_layout
168
- char_boxes = babeldoc.format.pdf.document_il.utils.extract_char.convert_page_to_char_boxes(
169
- page
170
- )
171
- if not char_boxes:
172
- return
178
+ def generate_fallback_line_layout_for_page(self, page: il_version_1.Page, progress):
179
+ try:
180
+ exists_page_layouts = page.page_layout
181
+ char_boxes = babeldoc.format.pdf.document_il.utils.extract_char.convert_page_to_char_boxes(
182
+ page
183
+ )
184
+ if not char_boxes:
185
+ return
173
186
 
174
- clusters = babeldoc.format.pdf.document_il.utils.extract_char.process_page_chars_to_lines(
175
- char_boxes
176
- )
177
- for cluster in clusters:
178
- boxes = [c[0] for c in cluster.chars]
179
- min_x = min(b.x for b in boxes)
180
- max_x = max(b.x2 for b in boxes)
181
- min_y = min(b.y for b in boxes)
182
- max_y = max(b.y2 for b in boxes)
183
- cluster.chars = il_version_1.Box(min_x, min_y, max_x, max_y)
184
- page_layout = il_version_1.PageLayout(
185
- id=len(exists_page_layouts) + 1,
186
- box=il_version_1.Box(
187
- min_x,
188
- min_y,
189
- max_x,
190
- max_y,
191
- ),
192
- conf=1,
193
- class_name="fallback_line",
187
+ clusters = babeldoc.format.pdf.document_il.utils.extract_char.process_page_chars_to_lines(
188
+ char_boxes
194
189
  )
195
- exists_page_layouts.append(page_layout)
190
+ for cluster in clusters:
191
+ boxes = [c[0] for c in cluster.chars]
192
+ min_x = min(b.x for b in boxes)
193
+ max_x = max(b.x2 for b in boxes)
194
+ min_y = min(b.y for b in boxes)
195
+ max_y = max(b.y2 for b in boxes)
196
+ cluster.chars = il_version_1.Box(min_x, min_y, max_x, max_y)
197
+ page_layout = il_version_1.PageLayout(
198
+ id=len(exists_page_layouts) + 1,
199
+ box=il_version_1.Box(
200
+ min_x,
201
+ min_y,
202
+ max_x,
203
+ max_y,
204
+ ),
205
+ conf=1,
206
+ class_name="fallback_line",
207
+ )
208
+ exists_page_layouts.append(page_layout)
209
+ self._save_debug_box_to_page(page)
210
+ finally:
211
+ progress.advance(1)
@@ -462,11 +462,17 @@ class StylesAndFormulas:
462
462
  line.pdf_character[i + 1] if i < len(line.pdf_character) - 1 else None
463
463
  )
464
464
  isspace = char.char_unicode.isspace() if char.char_unicode else False
465
+ prev_is_space = (
466
+ previous_char.char_unicode.isspace()
467
+ if previous_char and previous_char.char_unicode
468
+ else False
469
+ )
465
470
 
466
471
  is_corner_mark = (
467
472
  (
468
473
  previous_char is not None
469
474
  and not isspace
475
+ and not prev_is_space
470
476
  and not first_is_bullet
471
477
  # 角标字体,有 0.76 的角标和 0.799 的大写,这里用 0.79 取中,同时考虑首字母放大的情况
472
478
  and char.pdf_style.font_size
@@ -476,6 +482,7 @@ class StylesAndFormulas:
476
482
  or (
477
483
  previous_char is not None
478
484
  and not isspace
485
+ and not prev_is_space
479
486
  and not first_is_bullet
480
487
  # 角标字体,有 0.76 的角标和 0.799 的大写,这里用 0.79 取中,同时考虑首字母放大的情况
481
488
  and char.pdf_style.font_size
@@ -487,6 +494,7 @@ class StylesAndFormulas:
487
494
  previous_char is None
488
495
  and next_char is not None
489
496
  and not isspace
497
+ and not prev_is_space
490
498
  and not first_is_bullet
491
499
  # 当前字符字体大小明显小于下一个字符,判定为角标
492
500
  and char.pdf_style.font_size < next_char.pdf_style.font_size * 0.79
@@ -11,6 +11,7 @@ from sklearn.cluster import DBSCAN
11
11
 
12
12
  import babeldoc.format.pdf.high_level
13
13
  import babeldoc.format.pdf.translation_config
14
+ from babeldoc.const import get_process_pool
14
15
  from babeldoc.format.pdf.document_il import il_version_1
15
16
 
16
17
  logger = logging.getLogger(__name__)
@@ -571,6 +572,15 @@ def _merge_lines_on_page(page_lines: list[Line]) -> list[Line]:
571
572
 
572
573
  def process_page_chars_to_lines(
573
574
  chars: list[tuple[il_version_1.Box, str, bool]],
575
+ ) -> list[Line]:
576
+ pool = get_process_pool()
577
+ if pool is None:
578
+ return process_page_chars_to_lines_internal(chars)
579
+ return pool.apply(process_page_chars_to_lines_internal, (chars,))
580
+
581
+
582
+ def process_page_chars_to_lines_internal(
583
+ chars: list[tuple[il_version_1.Box, str, bool]],
574
584
  ) -> list[Line]:
575
585
  """
576
586
  Process characters on a single page to cluster them into lines.
@@ -0,0 +1,42 @@
1
+ import numpy as np
2
+ import pymupdf
3
+
4
+ from babeldoc.const import get_process_pool
5
+
6
+
7
+ def get_no_rotation_img(page: pymupdf.Page, dpi: int = 72) -> pymupdf.Pixmap:
8
+ # return page.get_pixmap(dpi=72)
9
+ original_rotation = page.rotation
10
+ page.set_rotation(0)
11
+ pix = page.get_pixmap(dpi=dpi)
12
+ page.set_rotation(original_rotation)
13
+ return pix
14
+
15
+
16
+ def get_no_rotation_img_multiprocess_internal(
17
+ pdf_bytes: str, pagenum: int, dpi: int = 72
18
+ ) -> np.ndarray:
19
+ # return page.get_pixmap(dpi=72)
20
+ doc = pymupdf.open(pdf_bytes)
21
+ try:
22
+ page = doc[pagenum]
23
+ original_rotation = page.rotation
24
+ page.set_rotation(0)
25
+ pix = page.get_pixmap(dpi=dpi)
26
+ page.set_rotation(original_rotation)
27
+ return np.frombuffer(pix.samples, np.uint8).reshape(
28
+ pix.height,
29
+ pix.width,
30
+ 3,
31
+ )[:, :, ::-1]
32
+ finally:
33
+ doc.close()
34
+
35
+
36
+ def get_no_rotation_img_multiprocess(pdf_bytes: str, pagenum: int, dpi: int = 72):
37
+ pool = get_process_pool()
38
+ if pool is None:
39
+ return get_no_rotation_img_multiprocess_internal(pdf_bytes, pagenum, dpi)
40
+ return pool.apply(
41
+ get_no_rotation_img_multiprocess_internal, (pdf_bytes, pagenum, dpi)
42
+ )
@@ -1,6 +1,9 @@
1
1
  import asyncio
2
2
  import logging
3
+ import multiprocessing as mp
3
4
  import queue
5
+ import random
6
+ import sys
4
7
  from pathlib import Path
5
8
  from typing import Any
6
9
 
@@ -15,6 +18,7 @@ from rich.progress import TimeRemainingColumn
15
18
 
16
19
  import babeldoc.assets.assets
17
20
  import babeldoc.format.pdf.high_level
21
+ from babeldoc.const import enable_process_pool
18
22
  from babeldoc.format.pdf.translation_config import TranslationConfig
19
23
  from babeldoc.format.pdf.translation_config import WatermarkOutputMode
20
24
  from babeldoc.glossary import Glossary
@@ -22,7 +26,7 @@ from babeldoc.translator.translator import OpenAITranslator
22
26
  from babeldoc.translator.translator import set_translate_rate_limiter
23
27
 
24
28
  logger = logging.getLogger(__name__)
25
- __version__ = "0.5.11"
29
+ __version__ = "0.5.12"
26
30
 
27
31
 
28
32
  def create_parser():
@@ -103,6 +107,11 @@ def create_parser():
103
107
  default=None,
104
108
  help="Extra data for metadata",
105
109
  )
110
+ parser.add_argument(
111
+ "--enable-process-pool",
112
+ action="store_true",
113
+ help="DEBUG ONLY",
114
+ )
106
115
  # translation option argument group
107
116
  translation_group = parser.add_argument_group(
108
117
  "Translation",
@@ -460,6 +469,9 @@ async def main():
460
469
  if args.openai and not args.openai_api_key:
461
470
  parser.error("使用 OpenAI 服务时必须提供 API key")
462
471
 
472
+ if args.enable_process_pool:
473
+ enable_process_pool()
474
+
463
475
  # 实例化翻译器
464
476
  if args.openai:
465
477
  translator = OpenAITranslator(
@@ -688,7 +700,9 @@ async def main():
688
700
 
689
701
  getattr(doc_layout_model, "init_font_mapper", nop)(config)
690
702
  # Create progress handler
691
- progress_context, progress_handler = create_progress_handler(config)
703
+ progress_context, progress_handler = create_progress_handler(
704
+ config, show_log=False
705
+ )
692
706
 
693
707
  # 开始翻译
694
708
  with progress_context:
@@ -725,7 +739,9 @@ async def main():
725
739
  )
726
740
 
727
741
 
728
- def create_progress_handler(translation_config: TranslationConfig):
742
+ def create_progress_handler(
743
+ translation_config: TranslationConfig, show_log: bool = False
744
+ ):
729
745
  """Create a progress handler function based on the configuration.
730
746
 
731
747
  Args:
@@ -748,6 +764,8 @@ def create_progress_handler(translation_config: TranslationConfig):
748
764
  stage_tasks = {}
749
765
 
750
766
  def progress_handler(event):
767
+ if show_log and random.random() <= 0.1: # noqa: S311
768
+ logger.info(event)
751
769
  if event["type"] == "progress_start":
752
770
  if event["stage"] not in stage_tasks:
753
771
  stage_tasks[event["stage"]] = progress.add_task(
@@ -876,4 +894,8 @@ def cli():
876
894
 
877
895
 
878
896
  if __name__ == "__main__":
897
+ if sys.platform == "darwin" or sys.platform == "win32":
898
+ mp.set_start_method("spawn")
899
+ else:
900
+ mp.set_start_method("forkserver")
879
901
  cli()
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.5.11"
3
+ version = "0.5.12"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -162,7 +162,7 @@ pythonpath = [".", "src"]
162
162
  testpaths = ["tests"]
163
163
 
164
164
  [bumpver]
165
- current_version = "0.5.11"
165
+ current_version = "0.5.12"
166
166
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
167
167
 
168
168
  [bumpver.file_patterns]
@@ -1 +0,0 @@
1
- __version__ = "0.5.11"
@@ -1,10 +0,0 @@
1
- import pymupdf
2
-
3
-
4
- def get_no_rotation_img(page: pymupdf.Page, dpi: int = 72) -> pymupdf.Pixmap:
5
- # return page.get_pixmap(dpi=72)
6
- original_rotation = page.rotation
7
- page.set_rotation(0)
8
- pix = page.get_pixmap(dpi=dpi)
9
- page.set_rotation(original_rotation)
10
- return pix
File without changes
File without changes
File without changes
File without changes
File without changes