BabelDOC 0.3.30__tar.gz → 0.3.31__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 (106) hide show
  1. {babeldoc-0.3.30 → babeldoc-0.3.31}/PKG-INFO +1 -1
  2. babeldoc-0.3.31/babeldoc/__init__.py +1 -0
  3. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/const.py +1 -1
  4. babeldoc-0.3.31/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +8 -0
  5. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/detect_scanned_file.py +1 -1
  6. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/il_translator_llm_only.py +3 -0
  7. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/paragraph_finder.py +22 -0
  8. babeldoc-0.3.31/babeldoc/document_il/utils/paragraph_helper.py +35 -0
  9. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/main.py +1 -1
  10. {babeldoc-0.3.30 → babeldoc-0.3.31}/pyproject.toml +2 -2
  11. {babeldoc-0.3.30 → babeldoc-0.3.31}/uv.lock +1 -1
  12. babeldoc-0.3.30/babeldoc/__init__.py +0 -1
  13. babeldoc-0.3.30/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -3
  14. {babeldoc-0.3.30 → babeldoc-0.3.31}/.cursorignore +0 -0
  15. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  16. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  17. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
  18. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/dependabot.yml +0 -0
  19. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/labels.yml +0 -0
  20. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/release-drafter.yml +0 -0
  21. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/codeql.yml +0 -0
  22. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/docs.yml +0 -0
  23. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/labeler.yml +0 -0
  24. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/lint.yml +0 -0
  25. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/pr-lint.yml +0 -0
  26. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/publish-to-pypi.yml +0 -0
  27. {babeldoc-0.3.30 → babeldoc-0.3.31}/.github/workflows/test.yml +0 -0
  28. {babeldoc-0.3.30 → babeldoc-0.3.31}/.gitignore +0 -0
  29. {babeldoc-0.3.30 → babeldoc-0.3.31}/.pre-commit-config.yaml +0 -0
  30. {babeldoc-0.3.30 → babeldoc-0.3.31}/LICENSE +0 -0
  31. {babeldoc-0.3.30 → babeldoc-0.3.31}/README.md +0 -0
  32. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/assets/assets.py +0 -0
  33. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/assets/embedding_assets_metadata.py +0 -0
  34. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/asynchronize/__init__.py +0 -0
  35. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/converter.py +0 -0
  36. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/__init__.py +0 -0
  37. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/backend/__init__.py +0 -0
  38. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/backend/pdf_creater.py +0 -0
  39. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/frontend/__init__.py +0 -0
  40. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/frontend/il_creater.py +0 -0
  41. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/il_version_1.py +0 -0
  42. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/il_version_1.rnc +0 -0
  43. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/il_version_1.rng +0 -0
  44. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/il_version_1.xsd +0 -0
  45. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/__init__.py +0 -0
  46. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/add_debug_information.py +0 -0
  47. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/il_translator.py +0 -0
  48. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/layout_parser.py +0 -0
  49. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/remove_descent.py +0 -0
  50. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
  51. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/table_parser.py +0 -0
  52. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/midend/typesetting.py +0 -0
  53. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/translator/__init__.py +0 -0
  54. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/translator/cache.py +0 -0
  55. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/translator/translator.py +0 -0
  56. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/atomic_integer.py +0 -0
  57. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/fontmap.py +0 -0
  58. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/layout_helper.py +0 -0
  59. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/priority_thread_pool_executor.py +0 -0
  60. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/style_helper.py +0 -0
  61. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/utils/zstd_helper.py +0 -0
  62. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/document_il/xml_converter.py +0 -0
  63. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/docvision/README.md +0 -0
  64. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/docvision/__init__.py +0 -0
  65. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/docvision/doclayout.py +0 -0
  66. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/docvision/rpc_doclayout.py +0 -0
  67. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
  68. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/format/office/__init__.py +0 -0
  69. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/high_level.py +0 -0
  70. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/pdfinterp.py +0 -0
  71. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/progress_monitor.py +0 -0
  72. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/result_merger.py +0 -0
  73. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/split_manager.py +0 -0
  74. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/tools/generate_font_metadata.py +0 -0
  75. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/tools/italic_assistance.py +0 -0
  76. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/tools/italic_recognize_tool.py +0 -0
  77. {babeldoc-0.3.30 → babeldoc-0.3.31}/babeldoc/translation_config.py +0 -0
  78. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/CODE_OF_CONDUCT.md +0 -0
  79. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/CONTRIBUTING.md +0 -0
  80. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/CONTRIBUTOR_REWARD.md +0 -0
  81. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  82. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  83. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  84. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  85. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  86. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/README.md +0 -0
  87. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  88. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  89. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/README.md +0 -0
  90. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/deploy.sh +0 -0
  91. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-banner.png +0 -0
  92. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
  93. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
  94. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
  95. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
  96. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-big-logo.png +0 -0
  97. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  98. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-preview.gif +0 -0
  99. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
  100. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
  101. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/images/babeldoc-small-logo.png +0 -0
  102. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/index.md +0 -0
  103. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/intro-to-pdf-object.md +0 -0
  104. {babeldoc-0.3.30 → babeldoc-0.3.31}/docs/requirements.txt +0 -0
  105. {babeldoc-0.3.30 → babeldoc-0.3.31}/mkdocs.yml +0 -0
  106. {babeldoc-0.3.30 → babeldoc-0.3.31}/tests/test_translation_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.3.30
3
+ Version: 0.3.31
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.3.31"
@@ -3,7 +3,7 @@ import shutil
3
3
  import subprocess
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.3.30"
6
+ __version__ = "0.3.31"
7
7
 
8
8
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
9
9
 
@@ -0,0 +1,8 @@
1
+ class ScannedPDFError(Exception):
2
+ def __init__(self, message):
3
+ super().__init__(message)
4
+
5
+
6
+ class ExtractTextError(Exception):
7
+ def __init__(self, message):
8
+ super().__init__(message)
@@ -130,4 +130,4 @@ class DetectScannedFile:
130
130
  )[:, :, ::-1]
131
131
  before_page_image = cv2.cvtColor(before_page_image, cv2.COLOR_RGB2GRAY)
132
132
  after_page_image = cv2.cvtColor(after_page_image, cv2.COLOR_RGB2GRAY)
133
- return structural_similarity(before_page_image, after_page_image) > 0.9
133
+ return structural_similarity(before_page_image, after_page_image) > 0.98
@@ -16,6 +16,7 @@ from babeldoc.document_il.midend.il_translator import ILTranslator
16
16
  from babeldoc.document_il.midend.il_translator import PageTranslateTracker
17
17
  from babeldoc.document_il.translator.translator import BaseTranslator
18
18
  from babeldoc.document_il.utils.fontmap import FontMapper
19
+ from babeldoc.document_il.utils.paragraph_helper import is_cid_paragraph
19
20
  from babeldoc.document_il.utils.priority_thread_pool_executor import (
20
21
  PriorityThreadPoolExecutor,
21
22
  )
@@ -162,6 +163,8 @@ class ILTranslatorLLMOnly:
162
163
  for paragraph in page.pdf_paragraph:
163
164
  if paragraph.debug_id is None or paragraph.unicode is None:
164
165
  continue
166
+ if is_cid_paragraph(paragraph):
167
+ continue
165
168
  # self.translate_paragraph(paragraph, pbar,tracker.new_paragraph(), page_font_map, page_xobj_font_map)
166
169
  total_token_count += self.calc_token_count(paragraph.unicode)
167
170
  paragraphs.append(paragraph)
@@ -3,16 +3,19 @@ import random
3
3
  import re
4
4
 
5
5
  from babeldoc.document_il import Box
6
+ from babeldoc.document_il import Document
6
7
  from babeldoc.document_il import Page
7
8
  from babeldoc.document_il import PdfCharacter
8
9
  from babeldoc.document_il import PdfLine
9
10
  from babeldoc.document_il import PdfParagraph
10
11
  from babeldoc.document_il import PdfParagraphComposition
11
12
  from babeldoc.document_il import PdfRectangle
13
+ from babeldoc.document_il.babeldoc_exception.BabelDOCException import ExtractTextError
12
14
  from babeldoc.document_il.utils.layout_helper import Layout
13
15
  from babeldoc.document_il.utils.layout_helper import add_space_dummy_chars
14
16
  from babeldoc.document_il.utils.layout_helper import get_char_unicode_string
15
17
  from babeldoc.document_il.utils.layout_helper import is_bullet_point
18
+ from babeldoc.document_il.utils.paragraph_helper import is_cid_paragraph
16
19
  from babeldoc.document_il.utils.style_helper import WHITE
17
20
  from babeldoc.translation_config import TranslationConfig
18
21
 
@@ -132,6 +135,25 @@ class ParagraphFinder:
132
135
  self.process_page(page)
133
136
  pbar.advance()
134
137
 
138
+ if self.check_cid_paragraph(document):
139
+ raise ExtractTextError("The document contains too many CID paragraphs.")
140
+
141
+ total_paragraph_count = 0
142
+ for page in document.page:
143
+ total_paragraph_count += len(page.pdf_paragraph)
144
+ if total_paragraph_count == 0:
145
+ raise ExtractTextError("The document contains no paragraphs.")
146
+
147
+ def check_cid_paragraph(self, doc: Document):
148
+ cid_para_count = 0
149
+ para_total = 0
150
+ for page in doc.page:
151
+ para_total += len(page.pdf_paragraph)
152
+ for para in page.pdf_paragraph:
153
+ if is_cid_paragraph(para):
154
+ cid_para_count += 1
155
+ return cid_para_count / para_total > 0.8
156
+
135
157
  def bbox_overlap(self, bbox1: Box, bbox2: Box) -> bool:
136
158
  return (
137
159
  bbox1.x < bbox2.x2
@@ -0,0 +1,35 @@
1
+ import logging
2
+ import re
3
+
4
+ from babeldoc.document_il import il_version_1
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+
9
+ def is_cid_paragraph(paragraph: il_version_1.PdfParagraph):
10
+ chars: list[il_version_1.PdfCharacter] = []
11
+ for composition in paragraph.pdf_paragraph_composition:
12
+ if composition.pdf_line:
13
+ chars.extend(composition.pdf_line.pdf_character)
14
+ elif composition.pdf_same_style_characters:
15
+ chars.extend(composition.pdf_same_style_characters.pdf_character)
16
+ elif composition.pdf_same_style_unicode_characters:
17
+ chars.extend(composition.pdf_same_style_unicode_characters.unicode)
18
+ elif composition.pdf_formula:
19
+ chars.extend(composition.pdf_formula.pdf_character)
20
+ elif composition.pdf_character:
21
+ chars.append(composition.pdf_character)
22
+ else:
23
+ logger.error(
24
+ f"Unknown composition type. "
25
+ f"Composition: {composition}. "
26
+ f"Paragraph: {paragraph}. ",
27
+ )
28
+ continue
29
+
30
+ cid_count = 0
31
+ for char in chars:
32
+ if re.match(r"^\(cid:\d+\)$", char.char_unicode):
33
+ cid_count += 1
34
+
35
+ return cid_count > len(chars) * 0.8
@@ -23,7 +23,7 @@ from babeldoc.translation_config import TranslationConfig
23
23
  from babeldoc.translation_config import WatermarkOutputMode
24
24
 
25
25
  logger = logging.getLogger(__name__)
26
- __version__ = "0.3.30"
26
+ __version__ = "0.3.31"
27
27
 
28
28
 
29
29
  def create_parser():
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.3.30"
3
+ version = "0.3.31"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -150,7 +150,7 @@ pythonpath = [".", "src"]
150
150
  testpaths = ["tests"]
151
151
 
152
152
  [bumpver]
153
- current_version = "0.3.30"
153
+ current_version = "0.3.31"
154
154
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
155
155
 
156
156
  [bumpver.file_patterns]
@@ -48,7 +48,7 @@ wheels = [
48
48
 
49
49
  [[package]]
50
50
  name = "babeldoc"
51
- version = "0.3.30"
51
+ version = "0.3.31"
52
52
  source = { editable = "." }
53
53
  dependencies = [
54
54
  { name = "bitstring" },
@@ -1 +0,0 @@
1
- __version__ = "0.3.30"
@@ -1,3 +0,0 @@
1
- class ScannedPDFError(Exception):
2
- def __init__(self, message):
3
- super().__init__(message)
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes