BabelDOC 0.3.21__tar.gz → 0.3.23__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.
- {babeldoc-0.3.21 → babeldoc-0.3.23}/PKG-INFO +1 -1
- babeldoc-0.3.23/babeldoc/__init__.py +1 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/const.py +1 -1
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/frontend/il_creater.py +3 -1
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/translator/translator.py +13 -6
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/high_level.py +7 -2
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/main.py +4 -1
- {babeldoc-0.3.21 → babeldoc-0.3.23}/pyproject.toml +2 -2
- {babeldoc-0.3.21 → babeldoc-0.3.23}/uv.lock +169 -169
- babeldoc-0.3.21/babeldoc/__init__.py +0 -1
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.cursorignore +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/dependabot.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/labels.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/release-drafter.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/codeql.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/docs.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/labeler.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/lint.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/pr-lint.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/publish-to-pypi.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.github/workflows/test.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.gitignore +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/.pre-commit-config.yaml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/LICENSE +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/README.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/assets/assets.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/assets/embedding_assets_metadata.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/asynchronize/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/converter.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/backend/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/backend/pdf_creater.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/frontend/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/il_version_1.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/il_version_1.rnc +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/il_version_1.rng +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/il_version_1.xsd +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/add_debug_information.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/il_translator.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/layout_parser.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/paragraph_finder.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/remove_descent.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/table_parser.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/midend/typesetting.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/translator/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/translator/cache.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/utils/atomic_integer.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/utils/fontmap.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/utils/layout_helper.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/utils/priority_thread_pool_executor.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/utils/style_helper.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/document_il/xml_converter.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/docvision/README.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/docvision/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/docvision/doclayout.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/docvision/rpc_doclayout.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/format/office/__init__.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/pdfinterp.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/progress_monitor.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/result_merger.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/split_manager.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/tools/generate_font_metadata.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/tools/italic_assistance.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/tools/italic_recognize_tool.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/babeldoc/translation_config.py +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/CODE_OF_CONDUCT.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/CONTRIBUTING.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/CONTRIBUTOR_REWARD.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/README.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/README.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/deploy.sh +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-banner.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-big-logo.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-contributor_reward_example.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-preview.gif +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/images/babeldoc-small-logo.png +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/index.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/intro-to-pdf-object.md +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/docs/requirements.txt +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/mkdocs.yml +0 -0
- {babeldoc-0.3.21 → babeldoc-0.3.23}/tests/test_translation_config.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.23"
|
|
@@ -346,6 +346,7 @@ def parse_font_file(doc, idx, encoding, differences):
|
|
|
346
346
|
bbox_list = []
|
|
347
347
|
data = doc.xref_stream(idx)
|
|
348
348
|
face = freetype.Face(BytesIO(data))
|
|
349
|
+
scale = 1000 / face.units_per_EM
|
|
349
350
|
for charmap in face.charmaps:
|
|
350
351
|
if charmap.encoding_name == "FT_ENCODING_ADOBE_CUSTOM":
|
|
351
352
|
face.select_charmap(freetype.FT_ENCODING_ADOBE_CUSTOM)
|
|
@@ -354,7 +355,8 @@ def parse_font_file(doc, idx, encoding, differences):
|
|
|
354
355
|
if differences:
|
|
355
356
|
for code, name in differences:
|
|
356
357
|
bbox_list[code] = get_name_cbox(face, name.encode("U8"))
|
|
357
|
-
|
|
358
|
+
norm_bbox_list = [[v * scale for v in box] for box in bbox_list]
|
|
359
|
+
return norm_bbox_list
|
|
358
360
|
|
|
359
361
|
|
|
360
362
|
def parse_encoding(obj_str):
|
|
@@ -215,9 +215,7 @@ class OpenAITranslator(BaseTranslator):
|
|
|
215
215
|
**self.options,
|
|
216
216
|
messages=self.prompt(text),
|
|
217
217
|
)
|
|
218
|
-
self.
|
|
219
|
-
self.prompt_token_count.inc(response.usage.prompt_tokens)
|
|
220
|
-
self.completion_token_count.inc(response.usage.completion_tokens)
|
|
218
|
+
self.update_token_count(response)
|
|
221
219
|
return response.choices[0].message.content.strip()
|
|
222
220
|
|
|
223
221
|
def prompt(self, text):
|
|
@@ -255,11 +253,20 @@ class OpenAITranslator(BaseTranslator):
|
|
|
255
253
|
},
|
|
256
254
|
],
|
|
257
255
|
)
|
|
258
|
-
self.
|
|
259
|
-
self.prompt_token_count.inc(response.usage.prompt_tokens)
|
|
260
|
-
self.completion_token_count.inc(response.usage.completion_tokens)
|
|
256
|
+
self.update_token_count(response)
|
|
261
257
|
return response.choices[0].message.content.strip()
|
|
262
258
|
|
|
259
|
+
def update_token_count(self, response):
|
|
260
|
+
try:
|
|
261
|
+
if response.usage and response.usage.total_tokens:
|
|
262
|
+
self.token_count.inc(response.usage.total_tokens)
|
|
263
|
+
if response.usage and response.usage.prompt_tokens:
|
|
264
|
+
self.prompt_token_count.inc(response.usage.prompt_tokens)
|
|
265
|
+
if response.usage and response.usage.completion_tokens:
|
|
266
|
+
self.completion_token_count.inc(response.usage.completion_tokens)
|
|
267
|
+
except Exception as e:
|
|
268
|
+
logger.exception("Error updating token count")
|
|
269
|
+
|
|
263
270
|
def get_formular_placeholder(self, placeholder_id: int):
|
|
264
271
|
return "{{v" + str(placeholder_id) + "}}"
|
|
265
272
|
return "{{" + str(placeholder_id) + "}}"
|
|
@@ -547,7 +547,8 @@ def do_translate(
|
|
|
547
547
|
return result
|
|
548
548
|
|
|
549
549
|
except Exception as e:
|
|
550
|
-
logger.
|
|
550
|
+
logger.error(f"translate error: {e}")
|
|
551
|
+
pm.disable = False
|
|
551
552
|
pm.translate_error(e)
|
|
552
553
|
raise
|
|
553
554
|
finally:
|
|
@@ -712,7 +713,9 @@ def _do_translate_single(
|
|
|
712
713
|
try:
|
|
713
714
|
if translation_config.watermark_output_mode == WatermarkOutputMode.Both:
|
|
714
715
|
mono_watermark_first_page_doc_bytes, dual_watermark_first_page_doc_bytes = (
|
|
715
|
-
generate_first_page_with_watermark(
|
|
716
|
+
generate_first_page_with_watermark(
|
|
717
|
+
doc_pdf2zh, translation_config, docs, mediabox_data
|
|
718
|
+
)
|
|
716
719
|
)
|
|
717
720
|
except Exception:
|
|
718
721
|
logger.warning(
|
|
@@ -762,6 +765,7 @@ def generate_first_page_with_watermark(
|
|
|
762
765
|
mupdf: Document,
|
|
763
766
|
translation_config: TranslationConfig,
|
|
764
767
|
doc_il: il_version_1.Document,
|
|
768
|
+
mediabox_data: dict[int, Any] | None = None,
|
|
765
769
|
) -> (io.BytesIO, io.BytesIO):
|
|
766
770
|
first_page_doc = Document()
|
|
767
771
|
first_page_doc.insert_pdf(mupdf, from_page=0, to_page=0)
|
|
@@ -784,6 +788,7 @@ def generate_first_page_with_watermark(
|
|
|
784
788
|
watermarked_temp_pdf_path.as_posix(),
|
|
785
789
|
il_only_first_page_doc,
|
|
786
790
|
watermarked_config,
|
|
791
|
+
mediabox_data,
|
|
787
792
|
)
|
|
788
793
|
result = pdf_creater.write(watermarked_config)
|
|
789
794
|
mono_pdf_bytes = None
|
|
@@ -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.
|
|
26
|
+
__version__ = "0.3.23"
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
def create_parser():
|
|
@@ -395,6 +395,9 @@ async def main():
|
|
|
395
395
|
progress_handler(event)
|
|
396
396
|
if config.debug:
|
|
397
397
|
logger.debug(event)
|
|
398
|
+
if event["type"] == "error":
|
|
399
|
+
logger.error(f"Error: {event['error']}")
|
|
400
|
+
break
|
|
398
401
|
if event["type"] == "finish":
|
|
399
402
|
result = event["translate_result"]
|
|
400
403
|
logger.info(str(result))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "BabelDOC"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.23"
|
|
4
4
|
description = "Yet Another Document Translator"
|
|
5
5
|
license = "AGPL-3.0"
|
|
6
6
|
readme = "README.md"
|
|
@@ -149,7 +149,7 @@ pythonpath = [".", "src"]
|
|
|
149
149
|
testpaths = ["tests"]
|
|
150
150
|
|
|
151
151
|
[bumpver]
|
|
152
|
-
current_version = "0.3.
|
|
152
|
+
current_version = "0.3.23"
|
|
153
153
|
version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
|
|
154
154
|
|
|
155
155
|
[bumpver.file_patterns]
|