BabelDOC 0.4.1__tar.gz → 0.4.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. {babeldoc-0.4.1 → babeldoc-0.4.6}/PKG-INFO +1 -1
  2. babeldoc-0.4.6/babeldoc/__init__.py +1 -0
  3. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/const.py +1 -1
  4. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/rpc_doclayout2.py +1 -1
  5. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/backend/pdf_creater.py +1 -1
  6. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/frontend/il_creater.py +1 -1
  7. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/add_debug_information.py +3 -4
  8. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py +98 -69
  9. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/typesetting.py +11 -8
  10. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/formular_helper.py +31 -0
  11. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/layout_helper.py +2 -0
  12. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/high_level.py +19 -2
  13. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/result_merger.py +4 -2
  14. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/translation_config.py +2 -2
  15. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/glossary.py +11 -1
  16. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/main.py +1 -1
  17. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdffont.py +7 -89
  18. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/tools/italic_assistance.py +2 -3
  19. {babeldoc-0.4.1 → babeldoc-0.4.6}/pyproject.toml +7 -3
  20. {babeldoc-0.4.1 → babeldoc-0.4.6}/uv.lock +2 -1
  21. babeldoc-0.4.1/babeldoc/__init__.py +0 -1
  22. {babeldoc-0.4.1 → babeldoc-0.4.6}/.cursorignore +0 -0
  23. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  24. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  25. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
  26. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  27. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/dependabot.yml +0 -0
  28. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/labels.yml +0 -0
  29. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/release-drafter.yml +0 -0
  30. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/codeql.yml +0 -0
  31. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/docs.yml +0 -0
  32. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/labeler.yml +0 -0
  33. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/lint.yml +0 -0
  34. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/pr-lint.yml +0 -0
  35. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/publish-to-pypi.yml +0 -0
  36. {babeldoc-0.4.1 → babeldoc-0.4.6}/.github/workflows/test.yml +0 -0
  37. {babeldoc-0.4.1 → babeldoc-0.4.6}/.gitignore +0 -0
  38. {babeldoc-0.4.1 → babeldoc-0.4.6}/.pre-commit-config.yaml +0 -0
  39. {babeldoc-0.4.1 → babeldoc-0.4.6}/LICENSE +0 -0
  40. {babeldoc-0.4.1 → babeldoc-0.4.6}/README.md +0 -0
  41. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/assets/assets.py +0 -0
  42. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  43. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/asynchronize/__init__.py +0 -0
  44. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/babeldoc_exception/BabelDOCException.py +0 -0
  45. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/babeldoc_exception/__init__.py +0 -0
  46. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/README.md +0 -0
  47. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/__init__.py +0 -0
  48. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/base_doclayout.py +0 -0
  49. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/doclayout.py +0 -0
  50. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/rpc_doclayout.py +0 -0
  51. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
  52. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/__init__.py +0 -0
  53. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/__init__.py +0 -0
  54. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/converter.py +0 -0
  55. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/__init__.py +0 -0
  56. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/backend/__init__.py +0 -0
  57. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/frontend/__init__.py +0 -0
  58. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/il_version_1.py +0 -0
  59. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/il_version_1.rnc +0 -0
  60. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/il_version_1.rng +0 -0
  61. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/il_version_1.xsd +0 -0
  62. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/__init__.py +0 -0
  63. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/automatic_term_extractor.py +0 -0
  64. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py +0 -0
  65. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/il_translator.py +0 -0
  66. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py +0 -0
  67. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/layout_parser.py +0 -0
  68. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py +0 -0
  69. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/remove_descent.py +0 -0
  70. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/midend/table_parser.py +0 -0
  71. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/__init__.py +0 -0
  72. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/fontmap.py +0 -0
  73. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +0 -0
  74. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/paragraph_helper.py +0 -0
  75. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/style_helper.py +0 -0
  76. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/utils/zstd_helper.py +0 -0
  77. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/document_il/xml_converter.py +0 -0
  78. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/pdfinterp.py +0 -0
  79. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/format/pdf/split_manager.py +0 -0
  80. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/LICENSE +0 -0
  81. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/__init__.py +0 -0
  82. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/_saslprep.py +0 -0
  83. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/arcfour.py +0 -0
  84. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/ascii85.py +0 -0
  85. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/casting.py +0 -0
  86. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/ccitt.py +0 -0
  87. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-EUC-H.pickle.gz +0 -0
  88. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-EUC-V.pickle.gz +0 -0
  89. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-H.pickle.gz +0 -0
  90. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-RKSJ-H.pickle.gz +0 -0
  91. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-RKSJ-V.pickle.gz +0 -0
  92. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78-V.pickle.gz +0 -0
  93. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78ms-RKSJ-H.pickle.gz +0 -0
  94. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/78ms-RKSJ-V.pickle.gz +0 -0
  95. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/83pv-RKSJ-H.pickle.gz +0 -0
  96. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/83pv-RKSJ-V.pickle.gz +0 -0
  97. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90ms-RKSJ-H.pickle.gz +0 -0
  98. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90ms-RKSJ-V.pickle.gz +0 -0
  99. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90msp-RKSJ-H.pickle.gz +0 -0
  100. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90msp-RKSJ-V.pickle.gz +0 -0
  101. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90pv-RKSJ-H.pickle.gz +0 -0
  102. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/90pv-RKSJ-V.pickle.gz +0 -0
  103. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Add-H.pickle.gz +0 -0
  104. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Add-RKSJ-H.pickle.gz +0 -0
  105. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Add-RKSJ-V.pickle.gz +0 -0
  106. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Add-V.pickle.gz +0 -0
  107. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/B5-H.pickle.gz +0 -0
  108. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/B5-V.pickle.gz +0 -0
  109. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/B5pc-H.pickle.gz +0 -0
  110. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/B5pc-V.pickle.gz +0 -0
  111. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS-EUC-H.pickle.gz +0 -0
  112. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS-EUC-V.pickle.gz +0 -0
  113. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS1-H.pickle.gz +0 -0
  114. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS1-V.pickle.gz +0 -0
  115. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS2-H.pickle.gz +0 -0
  116. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/CNS2-V.pickle.gz +0 -0
  117. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETHK-B5-H.pickle.gz +0 -0
  118. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETHK-B5-V.pickle.gz +0 -0
  119. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETen-B5-H.pickle.gz +0 -0
  120. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETen-B5-V.pickle.gz +0 -0
  121. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETenms-B5-H.pickle.gz +0 -0
  122. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/ETenms-B5-V.pickle.gz +0 -0
  123. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/EUC-H.pickle.gz +0 -0
  124. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/EUC-V.pickle.gz +0 -0
  125. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Ext-H.pickle.gz +0 -0
  126. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Ext-RKSJ-H.pickle.gz +0 -0
  127. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Ext-RKSJ-V.pickle.gz +0 -0
  128. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Ext-V.pickle.gz +0 -0
  129. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GB-EUC-H.pickle.gz +0 -0
  130. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GB-EUC-V.pickle.gz +0 -0
  131. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GB-H.pickle.gz +0 -0
  132. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GB-V.pickle.gz +0 -0
  133. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBK-EUC-H.pickle.gz +0 -0
  134. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBK-EUC-V.pickle.gz +0 -0
  135. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBK2K-H.pickle.gz +0 -0
  136. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBK2K-V.pickle.gz +0 -0
  137. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBKp-EUC-H.pickle.gz +0 -0
  138. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBKp-EUC-V.pickle.gz +0 -0
  139. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBT-EUC-H.pickle.gz +0 -0
  140. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBT-EUC-V.pickle.gz +0 -0
  141. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBT-H.pickle.gz +0 -0
  142. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBT-V.pickle.gz +0 -0
  143. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBTpc-EUC-H.pickle.gz +0 -0
  144. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBTpc-EUC-V.pickle.gz +0 -0
  145. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBpc-EUC-H.pickle.gz +0 -0
  146. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/GBpc-EUC-V.pickle.gz +0 -0
  147. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/H.pickle.gz +0 -0
  148. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKdla-B5-H.pickle.gz +0 -0
  149. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKdla-B5-V.pickle.gz +0 -0
  150. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKdlb-B5-H.pickle.gz +0 -0
  151. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKdlb-B5-V.pickle.gz +0 -0
  152. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKgccs-B5-H.pickle.gz +0 -0
  153. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKgccs-B5-V.pickle.gz +0 -0
  154. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKm314-B5-H.pickle.gz +0 -0
  155. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKm314-B5-V.pickle.gz +0 -0
  156. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKm471-B5-H.pickle.gz +0 -0
  157. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKm471-B5-V.pickle.gz +0 -0
  158. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKscs-B5-H.pickle.gz +0 -0
  159. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/HKscs-B5-V.pickle.gz +0 -0
  160. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Hankaku-H.pickle.gz +0 -0
  161. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Hankaku-V.pickle.gz +0 -0
  162. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Hiragana-H.pickle.gz +0 -0
  163. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Hiragana-V.pickle.gz +0 -0
  164. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-EUC-H.pickle.gz +0 -0
  165. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-EUC-V.pickle.gz +0 -0
  166. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-H.pickle.gz +0 -0
  167. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-Johab-H.pickle.gz +0 -0
  168. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-Johab-V.pickle.gz +0 -0
  169. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSC-V.pickle.gz +0 -0
  170. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCms-UHC-H.pickle.gz +0 -0
  171. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-H.pickle.gz +0 -0
  172. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-V.pickle.gz +0 -0
  173. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCms-UHC-V.pickle.gz +0 -0
  174. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCpc-EUC-H.pickle.gz +0 -0
  175. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/KSCpc-EUC-V.pickle.gz +0 -0
  176. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Katakana-H.pickle.gz +0 -0
  177. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Katakana-V.pickle.gz +0 -0
  178. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/NWP-H.pickle.gz +0 -0
  179. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/NWP-V.pickle.gz +0 -0
  180. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/README.txt +0 -0
  181. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/RKSJ-H.pickle.gz +0 -0
  182. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/RKSJ-V.pickle.gz +0 -0
  183. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Roman-H.pickle.gz +0 -0
  184. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/Roman-V.pickle.gz +0 -0
  185. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UCS2-H.pickle.gz +0 -0
  186. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UCS2-V.pickle.gz +0 -0
  187. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF16-H.pickle.gz +0 -0
  188. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF16-V.pickle.gz +0 -0
  189. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF32-H.pickle.gz +0 -0
  190. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF32-V.pickle.gz +0 -0
  191. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF8-H.pickle.gz +0 -0
  192. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniCNS-UTF8-V.pickle.gz +0 -0
  193. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UCS2-H.pickle.gz +0 -0
  194. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UCS2-V.pickle.gz +0 -0
  195. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF16-H.pickle.gz +0 -0
  196. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF16-V.pickle.gz +0 -0
  197. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF32-H.pickle.gz +0 -0
  198. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF32-V.pickle.gz +0 -0
  199. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF8-H.pickle.gz +0 -0
  200. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniGB-UTF8-V.pickle.gz +0 -0
  201. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UCS2-H.pickle.gz +0 -0
  202. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-H.pickle.gz +0 -0
  203. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-V.pickle.gz +0 -0
  204. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UCS2-V.pickle.gz +0 -0
  205. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF16-H.pickle.gz +0 -0
  206. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF16-V.pickle.gz +0 -0
  207. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF32-H.pickle.gz +0 -0
  208. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF32-V.pickle.gz +0 -0
  209. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF8-H.pickle.gz +0 -0
  210. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS-UTF8-V.pickle.gz +0 -0
  211. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-H.pickle.gz +0 -0
  212. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-V.pickle.gz +0 -0
  213. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-H.pickle.gz +0 -0
  214. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-V.pickle.gz +0 -0
  215. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-H.pickle.gz +0 -0
  216. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-V.pickle.gz +0 -0
  217. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-H.pickle.gz +0 -0
  218. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-V.pickle.gz +0 -0
  219. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-H.pickle.gz +0 -0
  220. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-V.pickle.gz +0 -0
  221. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UCS2-H.pickle.gz +0 -0
  222. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UCS2-V.pickle.gz +0 -0
  223. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF16-H.pickle.gz +0 -0
  224. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF16-V.pickle.gz +0 -0
  225. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF32-H.pickle.gz +0 -0
  226. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF32-V.pickle.gz +0 -0
  227. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF8-H.pickle.gz +0 -0
  228. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/UniKS-UTF8-V.pickle.gz +0 -0
  229. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/V.pickle.gz +0 -0
  230. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/WP-Symbol-H.pickle.gz +0 -0
  231. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/WP-Symbol-V.pickle.gz +0 -0
  232. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/to-unicode-Adobe-CNS1.pickle.gz +0 -0
  233. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/to-unicode-Adobe-GB1.pickle.gz +0 -0
  234. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Japan1.pickle.gz +0 -0
  235. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Korea1.pickle.gz +0 -0
  236. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/cmapdb.py +0 -0
  237. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/converter.py +0 -0
  238. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/data_structures.py +0 -0
  239. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/encodingdb.py +0 -0
  240. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/fontmetrics.py +0 -0
  241. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/glyphlist.py +0 -0
  242. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/high_level.py +0 -0
  243. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/image.py +0 -0
  244. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/jbig2.py +0 -0
  245. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/latin_enc.py +0 -0
  246. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/layout.py +0 -0
  247. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/lzw.py +0 -0
  248. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfcolor.py +0 -0
  249. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfdevice.py +0 -0
  250. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfdocument.py +0 -0
  251. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfexceptions.py +0 -0
  252. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfinterp.py +0 -0
  253. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfpage.py +0 -0
  254. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdfparser.py +0 -0
  255. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/pdftypes.py +0 -0
  256. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/psexceptions.py +0 -0
  257. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/psparser.py +0 -0
  258. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/py.typed +0 -0
  259. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/runlength.py +0 -0
  260. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/settings.py +0 -0
  261. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/pdfminer/utils.py +0 -0
  262. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/progress_monitor.py +0 -0
  263. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/tools/generate_font_metadata.py +0 -0
  264. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/tools/italic_recognize_tool.py +0 -0
  265. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/translator/__init__.py +0 -0
  266. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/translator/cache.py +0 -0
  267. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/translator/translator.py +0 -0
  268. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/utils/__init__.py +0 -0
  269. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/utils/atomic_integer.py +0 -0
  270. {babeldoc-0.4.1 → babeldoc-0.4.6}/babeldoc/utils/priority_thread_pool_executor.py +0 -0
  271. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/CODE_OF_CONDUCT.md +0 -0
  272. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/CONTRIBUTING.md +0 -0
  273. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/CONTRIBUTOR_REWARD.md +0 -0
  274. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  275. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  276. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  277. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  278. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  279. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/README.md +0 -0
  280. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  281. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  282. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/README.md +0 -0
  283. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/deploy.sh +0 -0
  284. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/example/demo_glossary.csv +0 -0
  285. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-banner.png +0 -0
  286. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  287. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  288. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  289. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  290. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-big-logo.png +0 -0
  291. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  292. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-preview.gif +0 -0
  293. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  294. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  295. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/images/babeldoc-small-logo.png +0 -0
  296. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/index.md +0 -0
  297. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/intro-to-pdf-object.md +0 -0
  298. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/requirements.txt +0 -0
  299. {babeldoc-0.4.1 → babeldoc-0.4.6}/docs/supported_languages.md +0 -0
  300. {babeldoc-0.4.1 → babeldoc-0.4.6}/mkdocs.yml +0 -0
  301. {babeldoc-0.4.1 → babeldoc-0.4.6}/tests/test_translation_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.4.1
3
+ Version: 0.4.6
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.4.6"
@@ -3,7 +3,7 @@ import shutil
3
3
  import subprocess
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.4.1"
6
+ __version__ = "0.4.6"
7
7
 
8
8
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
9
 
@@ -286,7 +286,7 @@ class RpcDocLayoutModel(DocLayoutModel):
286
286
  translate_config,
287
287
  save_debug_image,
288
288
  ):
289
- with ThreadPoolExecutor(max_workers=64) as executor:
289
+ with ThreadPoolExecutor(max_workers=128) as executor:
290
290
  yield from executor.map(
291
291
  self.predict_page,
292
292
  pages,
@@ -331,7 +331,7 @@ class PDFCreater:
331
331
  self,
332
332
  draw_op: BitStream,
333
333
  rectangle: il_version_1.PdfRectangle,
334
- line_width: float = 0.5,
334
+ line_width: float = 0.4,
335
335
  ):
336
336
  """Draw a rectangle in PDF for visualization purposes.
337
337
 
@@ -656,7 +656,7 @@ class ILCreater:
656
656
  _, encoding = self.mupdf.xref_get_key(xref_id, "Encoding")
657
657
  if encoding == "/Identity-H" or encoding == "/Identity-V":
658
658
  encoding_length = 2
659
- if encoding == "/WinAnsiEncoding":
659
+ elif encoding == "/WinAnsiEncoding":
660
660
  encoding_length = 1
661
661
  else:
662
662
  _, to_unicode_id = self.mupdf.xref_get_key(xref_id, "ToUnicode")
@@ -3,7 +3,6 @@ import logging
3
3
  import babeldoc.format.pdf.document_il.il_version_1 as il_version_1
4
4
  from babeldoc.format.pdf.document_il import GraphicState
5
5
  from babeldoc.format.pdf.document_il.utils.style_helper import BLUE
6
- from babeldoc.format.pdf.document_il.utils.style_helper import CYAN
7
6
  from babeldoc.format.pdf.document_il.utils.style_helper import ORANGE
8
7
  from babeldoc.format.pdf.document_il.utils.style_helper import TEAL
9
8
  from babeldoc.format.pdf.document_il.utils.style_helper import YELLOW
@@ -133,9 +132,9 @@ class AddDebugInformation:
133
132
  char.visual_bbox.box, TEAL, line_width=0.2
134
133
  ),
135
134
  )
136
- page.pdf_rectangle.append(
137
- self._create_rectangle(char.box, CYAN, line_width=0.2),
138
- )
135
+ # page.pdf_rectangle.append(
136
+ # self._create_rectangle(char.box, CYAN, line_width=0.2),
137
+ # )
139
138
 
140
139
  for xobj in page.pdf_xobject:
141
140
  new_paragraphs.append(
@@ -19,15 +19,14 @@ from babeldoc.format.pdf.document_il.utils.formular_helper import (
19
19
  is_formulas_middle_char,
20
20
  )
21
21
  from babeldoc.format.pdf.document_il.utils.formular_helper import is_formulas_start_char
22
+ from babeldoc.format.pdf.document_il.utils.formular_helper import update_formula_data
22
23
  from babeldoc.format.pdf.document_il.utils.layout_helper import LEFT_BRACKET
23
24
  from babeldoc.format.pdf.document_il.utils.layout_helper import RIGHT_BRACKET
24
25
  from babeldoc.format.pdf.document_il.utils.layout_helper import build_layout_index
26
+ from babeldoc.format.pdf.document_il.utils.layout_helper import calculate_iou_for_boxes
25
27
  from babeldoc.format.pdf.document_il.utils.layout_helper import (
26
28
  calculate_y_iou_for_boxes,
27
29
  )
28
- from babeldoc.format.pdf.document_il.utils.layout_helper import (
29
- formular_height_ignore_char,
30
- )
31
30
  from babeldoc.format.pdf.document_il.utils.layout_helper import is_bullet_point
32
31
  from babeldoc.format.pdf.document_il.utils.layout_helper import is_same_style
33
32
  from babeldoc.format.pdf.translation_config import TranslationConfig
@@ -40,6 +39,9 @@ class StylesAndFormulas:
40
39
  self.translation_config = translation_config
41
40
  self.font_mapper = FontMapper(translation_config)
42
41
 
42
+ def update_formula_data(self, formula: PdfFormula):
43
+ update_formula_data(formula)
44
+
43
45
  def process(self, document: Document):
44
46
  with self.translation_config.progress_monitor.stage_start(
45
47
  self.stage_name,
@@ -50,6 +52,12 @@ class StylesAndFormulas:
50
52
  self.process_page(page)
51
53
  pbar.advance()
52
54
 
55
+ def update_all_formula_data(self, page: Page):
56
+ for para in page.pdf_paragraph:
57
+ for comp in para.pdf_paragraph_composition:
58
+ if comp.pdf_formula:
59
+ self.update_formula_data(comp.pdf_formula)
60
+
53
61
  def process_page(self, page: Page):
54
62
  """处理页面,包括公式识别和偏移量计算"""
55
63
  build_layout_index(page)
@@ -59,7 +67,9 @@ class StylesAndFormulas:
59
67
  self.merge_overlapping_formulas(page)
60
68
  # self.process_page_offsets(page)
61
69
  self.process_translatable_formulas(page)
70
+ self.update_all_formula_data(page)
62
71
  self.process_page_offsets(page)
72
+ self.update_all_formula_data(page)
63
73
  self.process_page_styles(page)
64
74
 
65
75
  # clean up to save memory
@@ -468,6 +478,8 @@ class StylesAndFormulas:
468
478
  return
469
479
 
470
480
  for paragraph in page.pdf_paragraph:
481
+ if paragraph.debug_id is None:
482
+ continue
471
483
  if not paragraph.pdf_paragraph_composition:
472
484
  continue
473
485
 
@@ -491,22 +503,28 @@ class StylesAndFormulas:
491
503
  comp = paragraph.pdf_paragraph_composition[j]
492
504
  if comp.pdf_line:
493
505
  for char in reversed(comp.pdf_line.pdf_character):
506
+ if not char.pdf_character_id:
507
+ continue
494
508
  # 检查 y 坐标是否接近,判断是否在同一行
495
509
  left_iou = calculate_y_iou_for_boxes(char.box, formula.box)
496
510
  if left_iou > 0.6:
497
511
  left_char = char
498
512
  break
513
+ break
499
514
 
500
515
  # 查找右边最近的同一行的文本
501
516
  for j in range(i + 1, len(paragraph.pdf_paragraph_composition)):
502
517
  comp = paragraph.pdf_paragraph_composition[j]
503
518
  if comp.pdf_line:
504
519
  for char in comp.pdf_line.pdf_character:
520
+ if not char.pdf_character_id:
521
+ continue
505
522
  # 检查 y 坐标是否接近,判断是否在同一行
506
523
  right_iou = calculate_y_iou_for_boxes(char.box, formula.box)
507
524
  if right_iou > 0.6:
508
525
  right_char = char
509
526
  break
527
+ break
510
528
 
511
529
  # If both text segments exist, keep the one with higher IOU
512
530
  if left_char and right_char:
@@ -590,33 +608,11 @@ class StylesAndFormulas:
590
608
  self.update_line_data(new_line)
591
609
  return PdfParagraphComposition(pdf_line=new_line)
592
610
 
593
- def update_formula_data(self, formula: PdfFormula):
594
- min_x = min(char.visual_bbox.box.x for char in formula.pdf_character)
595
- max_x = max(char.visual_bbox.box.x2 for char in formula.pdf_character)
596
- if not all(map(formular_height_ignore_char, formula.pdf_character)):
597
- min_y = min(
598
- char.visual_bbox.box.y
599
- for char in formula.pdf_character
600
- if not formular_height_ignore_char(char)
601
- )
602
- max_y = max(
603
- char.visual_bbox.box.y2
604
- for char in formula.pdf_character
605
- if not formular_height_ignore_char(char)
606
- )
607
- else:
608
- min_y = min(char.visual_bbox.box.y for char in formula.pdf_character)
609
- max_y = max(char.visual_bbox.box.y2 for char in formula.pdf_character)
610
- formula.box = Box(min_x, min_y, max_x, max_y)
611
- if not formula.y_offset:
612
- formula.y_offset = 0
613
- if not formula.x_offset:
614
- formula.x_offset = 0
615
- if not formula.x_advance:
616
- formula.x_advance = 0
617
-
618
611
  def is_translatable_formula(self, formula: PdfFormula) -> bool:
619
612
  """判断公式是否只包含需要正常翻译的字符(数字、空格和英文逗号)"""
613
+ if all(char.formula_layout_id for char in formula.pdf_character):
614
+ return False
615
+
620
616
  text = "".join(char.char_unicode for char in formula.pdf_character)
621
617
  if formula.y_offset > 0.1:
622
618
  return False
@@ -727,8 +723,11 @@ class StylesAndFormulas:
727
723
 
728
724
  def merge_overlapping_formulas(self, page: Page):
729
725
  """
730
- 合并 x 轴重叠且 y 轴有交集的相邻公式,或者 x 轴相邻且 y 轴 IOU > 0.5 的公式,
731
- 或者所有字符的 layout id 都相同的公式
726
+ 合并符合以下条件的公式:
727
+ 1. x 轴重叠且 y 轴有交集的相邻公式,或者
728
+ 2. x 轴相邻且 y 轴 IOU > 0.5 的相邻公式,或者
729
+ 3. 所有字符的 layout id 都相同的相邻公式,或者
730
+ 4. 任意两个公式的 IOU > 0.8
732
731
  角标可能会被识别成单独的公式,需要合并
733
732
  """
734
733
  if not page.pdf_paragraph:
@@ -738,46 +737,76 @@ class StylesAndFormulas:
738
737
  if not paragraph.pdf_paragraph_composition:
739
738
  continue
740
739
 
741
- i = 0
742
- while i < len(paragraph.pdf_paragraph_composition) - 1:
743
- comp1 = paragraph.pdf_paragraph_composition[i]
744
- comp2 = paragraph.pdf_paragraph_composition[i + 1]
745
-
746
- # 检查是否都是公式
747
- if comp1.pdf_formula is None or comp2.pdf_formula is None:
748
- i += 1
749
- continue
750
-
751
- formula1 = comp1.pdf_formula
752
- formula2 = comp2.pdf_formula
753
-
754
- # 检查合并条件:
755
- # 1. x 轴重叠且 y 轴有交集,或者
756
- # 2. x 轴相邻且 y 轴 IOU > 0.5,或者
757
- # 3. 所有字符的 layout id 都相同
758
- should_merge = (
759
- (
760
- self.is_x_axis_contained(formula1.box, formula2.box)
761
- and self.has_y_intersection(formula1.box, formula2.box)
762
- )
763
- or (
764
- self.is_x_axis_adjacent(formula1.box, formula2.box)
765
- and self.calculate_y_iou(formula1.box, formula2.box) > 0.5
766
- )
767
- or (self._have_same_layout_ids(formula1, formula2, page))
768
- )
740
+ # 重复执行合并过程,直到没有更多可以合并的公式
741
+ merged = True
742
+ while merged:
743
+ merged = False
744
+ for i in range(len(paragraph.pdf_paragraph_composition)):
745
+ if merged:
746
+ break
747
+ comp1 = paragraph.pdf_paragraph_composition[i]
748
+ if comp1.pdf_formula is None:
749
+ continue
750
+
751
+ for j in range(i + 1, len(paragraph.pdf_paragraph_composition)):
752
+ comp2 = paragraph.pdf_paragraph_composition[j]
753
+ if comp2.pdf_formula is None:
754
+ continue
755
+
756
+ formula1 = comp1.pdf_formula
757
+ formula2 = comp2.pdf_formula
758
+
759
+ # 检查合并条件:
760
+ # 1. x 轴重叠且 y 轴有交集,或者
761
+ # 2. x 轴相邻且 y 轴 IOU > 0.5,或者
762
+ # 3. 所有字符的 layout id 都相同,或者
763
+ # 4. 任意两个公式的 IOU > 0.8
764
+ should_merge = (
765
+ (
766
+ j == i + 1
767
+ and (
768
+ (
769
+ self.is_x_axis_contained(
770
+ formula1.box, formula2.box
771
+ )
772
+ and self.has_y_intersection(
773
+ formula1.box, formula2.box
774
+ )
775
+ )
776
+ or (
777
+ self.is_x_axis_adjacent(
778
+ formula1.box, formula2.box
779
+ )
780
+ and self.calculate_y_iou(
781
+ formula1.box, formula2.box
782
+ )
783
+ > 0.5
784
+ )
785
+ )
786
+ )
787
+ or (self._have_same_layout_ids(formula1, formula2, page))
788
+ or (
789
+ calculate_iou_for_boxes(formula1.box, formula2.box)
790
+ > 0.8
791
+ )
792
+ or (
793
+ calculate_iou_for_boxes(formula2.box, formula1.box)
794
+ > 0.8
795
+ )
796
+ )
769
797
 
770
- if should_merge:
771
- # 合并公式
772
- merged_formula = self.merge_formulas(formula1, formula2)
773
- paragraph.pdf_paragraph_composition[i] = PdfParagraphComposition(
774
- pdf_formula=merged_formula,
775
- )
776
- # 删除第二个公式
777
- del paragraph.pdf_paragraph_composition[i + 1]
778
- # 不增加 i,因为合并后的公式可能还需要和下一个公式合并
779
- else:
780
- i += 1
798
+ if should_merge:
799
+ # 合并公式
800
+ merged_formula = self.merge_formulas(formula1, formula2)
801
+ paragraph.pdf_paragraph_composition[i] = (
802
+ PdfParagraphComposition(
803
+ pdf_formula=merged_formula,
804
+ )
805
+ )
806
+ # 删除第二个公式
807
+ del paragraph.pdf_paragraph_composition[j]
808
+ merged = True
809
+ break
781
810
 
782
811
  def _have_same_layout_ids(
783
812
  self, formula1: PdfFormula, formula2: PdfFormula, page: Page
@@ -15,6 +15,7 @@ from babeldoc.format.pdf.document_il import PdfParagraphComposition
15
15
  from babeldoc.format.pdf.document_il import PdfStyle
16
16
  from babeldoc.format.pdf.document_il import il_version_1
17
17
  from babeldoc.format.pdf.document_il.utils.fontmap import FontMapper
18
+ from babeldoc.format.pdf.document_il.utils.formular_helper import update_formula_data
18
19
  from babeldoc.format.pdf.translation_config import TranslationConfig
19
20
  from babeldoc.format.pdf.translation_config import WatermarkOutputMode
20
21
 
@@ -349,11 +350,12 @@ class TypesettingUnit:
349
350
 
350
351
  return box
351
352
  elif self.formular:
352
- if self.formular.x_offset <= 0.5:
353
- return self.formular.box
354
- formular_box = copy.copy(self.formular.box)
355
- formular_box.x2 += self.formular.x_advance
356
- return formular_box
353
+ return self.formular.box
354
+ # if self.formular.x_offset <= 0.5:
355
+ # return self.formular.box
356
+ # formular_box = copy.copy(self.formular.box)
357
+ # formular_box.x2 += self.formular.x_advance
358
+ # return formular_box
357
359
  elif self.unicode:
358
360
  char_width = self.font.char_lengths(self.unicode, self.font_size)[0]
359
361
  if self.x is None or self.y is None or self.scale is None:
@@ -406,8 +408,8 @@ class TypesettingUnit:
406
408
  elif self.formular:
407
409
  # 创建新的公式对象,保持内部字符的相对位置
408
410
  new_chars = []
409
- min_x = min(char.visual_bbox.box.x for char in self.formular.pdf_character)
410
- min_y = min(char.visual_bbox.box.y for char in self.formular.pdf_character)
411
+ min_x = self.formular.box.x
412
+ min_y = self.formular.box.y
411
413
 
412
414
  for char in self.formular.pdf_character:
413
415
  # 计算相对位置
@@ -481,6 +483,7 @@ class TypesettingUnit:
481
483
  y_offset=self.formular.y_offset * scale,
482
484
  x_advance=self.formular.x_advance * scale,
483
485
  )
486
+ update_formula_data(new_formula)
484
487
  return TypesettingUnit(formular=new_formula)
485
488
 
486
489
  elif self.unicode:
@@ -819,7 +822,7 @@ class Typesetting:
819
822
  # 更新 x 坐标
820
823
  current_x = relocated_unit.box.x2
821
824
  if prev_x > current_x:
822
- logger.warning(f"坐标回绕!!!TypesettingUnit: {unit}, ")
825
+ logger.warning(f"坐标回绕!!!TypesettingUnit: {unit.box}, ")
823
826
 
824
827
  last_unit = relocated_unit
825
828
 
@@ -3,8 +3,13 @@ import functools
3
3
  import re
4
4
  import unicodedata
5
5
 
6
+ from babeldoc.format.pdf.document_il.il_version_1 import Box
6
7
  from babeldoc.format.pdf.document_il.il_version_1 import Page
8
+ from babeldoc.format.pdf.document_il.il_version_1 import PdfFormula
7
9
  from babeldoc.format.pdf.document_il.utils.fontmap import FontMapper
10
+ from babeldoc.format.pdf.document_il.utils.layout_helper import (
11
+ formular_height_ignore_char,
12
+ )
8
13
  from babeldoc.format.pdf.translation_config import TranslationConfig
9
14
 
10
15
 
@@ -301,3 +306,29 @@ def is_formulas_font(font_name: str, formular_font_pattern: str | None) -> bool:
301
306
  return True
302
307
 
303
308
  return False
309
+
310
+
311
+ def update_formula_data(formula: PdfFormula):
312
+ min_x = min(char.visual_bbox.box.x for char in formula.pdf_character)
313
+ max_x = max(char.visual_bbox.box.x2 for char in formula.pdf_character)
314
+ if not all(map(formular_height_ignore_char, formula.pdf_character)):
315
+ min_y = min(
316
+ char.visual_bbox.box.y
317
+ for char in formula.pdf_character
318
+ if not formular_height_ignore_char(char)
319
+ )
320
+ max_y = max(
321
+ char.visual_bbox.box.y2
322
+ for char in formula.pdf_character
323
+ if not formular_height_ignore_char(char)
324
+ )
325
+ else:
326
+ min_y = min(char.visual_bbox.box.y for char in formula.pdf_character)
327
+ max_y = max(char.visual_bbox.box.y2 for char in formula.pdf_character)
328
+ formula.box = Box(min_x, min_y, max_x, max_y)
329
+ if not formula.y_offset:
330
+ formula.y_offset = 0
331
+ if not formula.x_offset:
332
+ formula.x_offset = 0
333
+ if not formula.x_advance:
334
+ formula.x_advance = 0
@@ -634,6 +634,7 @@ def get_character_layout(
634
634
  "abstract",
635
635
  "content",
636
636
  "figure_title",
637
+ "chart_title",
637
638
  "table_title",
638
639
  "doc_title",
639
640
  "footnote",
@@ -722,6 +723,7 @@ def is_text_layout(layout: Layout):
722
723
  "footer",
723
724
  "seal",
724
725
  "text",
726
+ "chart_title",
725
727
  ]
726
728
 
727
729
 
@@ -491,7 +491,7 @@ def do_translate(
491
491
  pm.total_parts = len(split_points)
492
492
 
493
493
  # Process parts serially
494
- results: dict[int, TranslateResult] = {}
494
+ results: dict[int, TranslateResult | None] = {}
495
495
  original_watermark_mode = (
496
496
  translation_config.watermark_output_mode
497
497
  )
@@ -515,6 +515,12 @@ def do_translate(
515
515
  part_config.page_ranges = [
516
516
  (x, x) for x in should_translate_pages
517
517
  ]
518
+ if (
519
+ translation_config.only_include_translated_page
520
+ and not should_translate_pages
521
+ ):
522
+ results[i] = None
523
+ continue
518
524
 
519
525
  # Only first part should do scanned detection if enabled
520
526
  if i > 0:
@@ -640,7 +646,6 @@ def migrate_toc(
640
646
  old_doc = Document(translation_config.input_file)
641
647
  if not old_doc:
642
648
  return
643
-
644
649
  try:
645
650
  fix_filter(old_doc)
646
651
  fix_null_xref(old_doc)
@@ -653,6 +658,15 @@ def migrate_toc(
653
658
  logger.info("No TOC found in the original PDF, skipping migration.")
654
659
  return
655
660
 
661
+ if translation_config.only_include_translated_page:
662
+ total_page = set(range(0, len(old_doc)))
663
+
664
+ pages_to_translate = {
665
+ i for i in len(old_doc) if translation_config.should_translate_page(i + 1)
666
+ }
667
+
668
+ should_removed_page = list(total_page - pages_to_translate)
669
+
656
670
  files = {
657
671
  translate_result.dual_pdf_path,
658
672
  # translate_result.mono_pdf_path,
@@ -797,6 +811,9 @@ def _do_translate_single(
797
811
  docs = il_creater.create_il()
798
812
  logger.debug(f"finish create il from {temp_pdf_path}")
799
813
  del il_creater
814
+ if translation_config.only_include_translated_page and not docs.page:
815
+ return None
816
+
800
817
  if translation_config.debug:
801
818
  xml_converter.write_json(
802
819
  docs,
@@ -16,7 +16,9 @@ class ResultMerger:
16
16
  def __init__(self, translation_config: TranslationConfig):
17
17
  self.config = translation_config
18
18
 
19
- def merge_results(self, results: dict[int, TranslateResult]) -> TranslateResult:
19
+ def merge_results(
20
+ self, results: dict[int, TranslateResult | None]
21
+ ) -> TranslateResult:
20
22
  """Merge multiple translation results into one"""
21
23
  if not results:
22
24
  raise ValueError("No results to merge")
@@ -35,7 +37,7 @@ class ResultMerger:
35
37
  dual_file_name_no_watermark = (
36
38
  f"{basename}{debug_suffix}.{self.config.lang_out}.dual.pdf"
37
39
  )
38
-
40
+ results = {k: v for k, v in results.items() if v is not None}
39
41
  # Sort results by part index
40
42
  sorted_results = dict(sorted(results.items()))
41
43
  first_result = next(iter(sorted_results.values()))
@@ -354,7 +354,7 @@ class TranslationConfig:
354
354
  if part_index in self._part_working_dirs:
355
355
  part_dir = self._part_working_dirs[part_index]
356
356
  if part_dir.exists():
357
- shutil.rmtree(part_dir)
357
+ shutil.rmtree(part_dir, ignore_errors=True)
358
358
  del self._part_working_dirs[part_index]
359
359
 
360
360
  def cleanup_temp_files(self):
@@ -364,7 +364,7 @@ class TranslationConfig:
364
364
  self.cleanup_part_working_dir(part_index)
365
365
  if self._is_temp_dir:
366
366
  logger.info(f"cleanup temp files: {self.working_dir}")
367
- shutil.rmtree(self.working_dir)
367
+ shutil.rmtree(self.working_dir, ignore_errors=True)
368
368
  except Exception:
369
369
  logger.exception("Error cleaning up temporary files")
370
370
 
@@ -39,7 +39,17 @@ TERM_NORM_PATTERN = re.compile(r"\s+", regex.UNICODE)
39
39
  class Glossary:
40
40
  def __init__(self, name: str, entries: list[GlossaryEntry]):
41
41
  self.name = name
42
- self.entries = entries
42
+
43
+ # Deduplicate entries based on normalized source
44
+ unique_entries = []
45
+ seen_normalized_sources = set()
46
+ for entry in entries:
47
+ normalized_source = self.normalize_source(entry.source)
48
+ if normalized_source not in seen_normalized_sources:
49
+ unique_entries.append(entry)
50
+ seen_normalized_sources.add(normalized_source)
51
+ self.entries = unique_entries
52
+
43
53
  self.normalized_lookup: dict[str, tuple[str, str]] = {}
44
54
  self.id_lookup: list[tuple[str, str]] = []
45
55
  self.hs_dbs: list[hyperscan.Database] | None = None
@@ -21,7 +21,7 @@ from babeldoc.translator.translator import OpenAITranslator
21
21
  from babeldoc.translator.translator import set_translate_rate_limiter
22
22
 
23
23
  logger = logging.getLogger(__name__)
24
- __version__ = "0.4.1"
24
+ __version__ = "0.4.6"
25
25
 
26
26
 
27
27
  def create_parser():