BabelDOC 0.3.56__tar.gz → 0.3.58__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.56 → babeldoc-0.3.58}/PKG-INFO +1 -1
- babeldoc-0.3.58/babeldoc/__init__.py +1 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/const.py +1 -1
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/backend/pdf_creater.py +2 -2
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/automatic_term_extractor.py +2 -1
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/il_translator.py +12 -7
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/high_level.py +18 -22
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/main.py +1 -1
- {babeldoc-0.3.56 → babeldoc-0.3.58}/pyproject.toml +2 -2
- {babeldoc-0.3.56 → babeldoc-0.3.58}/uv.lock +398 -333
- babeldoc-0.3.56/babeldoc/__init__.py +0 -1
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.cursorignore +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/dependabot.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/labels.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/release-drafter.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/codeql.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/docs.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/labeler.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/lint.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/pr-lint.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/publish-to-pypi.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.github/workflows/test.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.gitignore +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/.pre-commit-config.yaml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/LICENSE +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/README.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/assets/assets.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/assets/embedding_assets_metadata.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/asynchronize/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/converter.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/backend/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/frontend/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/frontend/il_creater.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.rnc +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.rng +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/il_version_1.xsd +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/add_debug_information.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/layout_parser.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/paragraph_finder.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/remove_descent.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/table_parser.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/midend/typesetting.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/cache.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/translator/translator.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/atomic_integer.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/fontmap.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/layout_helper.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/mupdf_helper.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/paragraph_helper.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/priority_thread_pool_executor.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/style_helper.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/utils/zstd_helper.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/document_il/xml_converter.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/README.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/doclayout.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/rpc_doclayout.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/format/office/__init__.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/glossary.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/pdfinterp.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/progress_monitor.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/result_merger.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/split_manager.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/generate_font_metadata.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/italic_assistance.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/tools/italic_recognize_tool.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/babeldoc/translation_config.py +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CODE_OF_CONDUCT.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CONTRIBUTING.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/CONTRIBUTOR_REWARD.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/README.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/README.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/deploy.sh +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/example/demo_glossary.csv +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-banner.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-big-logo.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-contributor_reward_example.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-preview.gif +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/images/babeldoc-small-logo.png +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/index.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/intro-to-pdf-object.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/requirements.txt +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/docs/supported_languages.md +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/mkdocs.yml +0 -0
- {babeldoc-0.3.56 → babeldoc-0.3.58}/tests/test_translation_config.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.58"
|
|
@@ -781,10 +781,10 @@ class PDFCreater:
|
|
|
781
781
|
return False
|
|
782
782
|
|
|
783
783
|
def restore_media_box(self, doc: pymupdf.Document, mediabox_data: dict) -> None:
|
|
784
|
-
for
|
|
784
|
+
for xref, page_box_data in mediabox_data.items():
|
|
785
785
|
for name, box in page_box_data.items():
|
|
786
786
|
try:
|
|
787
|
-
doc.xref_set_key(
|
|
787
|
+
doc.xref_set_key(xref, name, box)
|
|
788
788
|
except Exception:
|
|
789
789
|
logger.debug(f"Error restoring media box {name} from PDF")
|
|
790
790
|
|
|
@@ -185,6 +185,7 @@ class AutomaticTermExtractor:
|
|
|
185
185
|
total_token_count = 0
|
|
186
186
|
for paragraph in page.pdf_paragraph:
|
|
187
187
|
if paragraph.debug_id is None or paragraph.unicode is None:
|
|
188
|
+
pbar.advance(1)
|
|
188
189
|
continue
|
|
189
190
|
if is_cid_paragraph(paragraph):
|
|
190
191
|
pbar.advance(1)
|
|
@@ -253,7 +254,7 @@ class AutomaticTermExtractor:
|
|
|
253
254
|
)
|
|
254
255
|
|
|
255
256
|
except Exception as e:
|
|
256
|
-
logger.error(f"Error
|
|
257
|
+
logger.error(f"Error during automatic terms extract: {e}")
|
|
257
258
|
return
|
|
258
259
|
finally:
|
|
259
260
|
pbar.advance(len(paragraphs.paragraphs))
|
|
@@ -346,7 +346,7 @@ class ILTranslator:
|
|
|
346
346
|
placeholder, regex_pattern = placeholder
|
|
347
347
|
else:
|
|
348
348
|
regex_pattern = re.escape(placeholder)
|
|
349
|
-
if
|
|
349
|
+
if re.match(regex_pattern, paragraph.unicode, re.IGNORECASE):
|
|
350
350
|
return self.create_formula_placeholder(formula, formula_id + 1, paragraph)
|
|
351
351
|
|
|
352
352
|
return FormulaPlaceholder(formula_id, formula, placeholder, regex_pattern)
|
|
@@ -371,9 +371,10 @@ class ILTranslator:
|
|
|
371
371
|
right_placeholder, right_placeholder_regex_pattern = right_placeholder
|
|
372
372
|
else:
|
|
373
373
|
right_placeholder_regex_pattern = re.escape(right_placeholder)
|
|
374
|
-
if (
|
|
375
|
-
|
|
376
|
-
|
|
374
|
+
if re.match(
|
|
375
|
+
f"{left_placeholder_regex_pattern}|{right_placeholder_regex_pattern}",
|
|
376
|
+
paragraph.unicode,
|
|
377
|
+
re.IGNORECASE,
|
|
377
378
|
):
|
|
378
379
|
return self.create_rich_text_placeholder(
|
|
379
380
|
composition,
|
|
@@ -630,7 +631,8 @@ class ILTranslator:
|
|
|
630
631
|
|
|
631
632
|
# 处理占位符
|
|
632
633
|
if any(
|
|
633
|
-
isinstance(p, FormulaPlaceholder)
|
|
634
|
+
isinstance(p, FormulaPlaceholder)
|
|
635
|
+
and re.match(f"^{p.regex_pattern}$", matched_text, re.IGNORECASE)
|
|
634
636
|
for p in input_text.placeholders
|
|
635
637
|
):
|
|
636
638
|
# 处理公式占位符
|
|
@@ -638,7 +640,7 @@ class ILTranslator:
|
|
|
638
640
|
p
|
|
639
641
|
for p in input_text.placeholders
|
|
640
642
|
if isinstance(p, FormulaPlaceholder)
|
|
641
|
-
and matched_text
|
|
643
|
+
and re.match(f"^{p.regex_pattern}$", matched_text, re.IGNORECASE)
|
|
642
644
|
)
|
|
643
645
|
comp = PdfParagraphComposition()
|
|
644
646
|
comp.pdf_formula = placeholder.formula
|
|
@@ -649,11 +651,14 @@ class ILTranslator:
|
|
|
649
651
|
p
|
|
650
652
|
for p in input_text.placeholders
|
|
651
653
|
if not isinstance(p, FormulaPlaceholder)
|
|
652
|
-
and re.match(
|
|
654
|
+
and re.match(
|
|
655
|
+
f"^{p.left_regex_pattern}", matched_text, re.IGNORECASE
|
|
656
|
+
)
|
|
653
657
|
)
|
|
654
658
|
text = re.match(
|
|
655
659
|
f"^{placeholder.left_regex_pattern}(.*){placeholder.right_regex_pattern}$",
|
|
656
660
|
matched_text,
|
|
661
|
+
re.IGNORECASE,
|
|
657
662
|
).group(1)
|
|
658
663
|
|
|
659
664
|
if isinstance(
|
|
@@ -425,6 +425,8 @@ def fix_null_xref(doc: Document) -> None:
|
|
|
425
425
|
elif obj and "/LZWDecode" in obj:
|
|
426
426
|
data = doc.xref_stream(i)
|
|
427
427
|
doc.update_stream(i, data)
|
|
428
|
+
elif obj and "/Annots" in obj:
|
|
429
|
+
doc.xref_set_key(i, "Annots", "null")
|
|
428
430
|
except Exception:
|
|
429
431
|
doc.update_object(i, "[]")
|
|
430
432
|
|
|
@@ -625,28 +627,22 @@ def do_translate(
|
|
|
625
627
|
|
|
626
628
|
def fix_media_box(doc: Document) -> None:
|
|
627
629
|
mediabox_data = {}
|
|
628
|
-
for
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
if
|
|
632
|
-
mediabox = (
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
x1 = page.cropbox.x1
|
|
645
|
-
y1 = page.cropbox.y1
|
|
646
|
-
page_box_data["CropBox"] = doc.xref_get_key(page.xref, "CropBox")[1]
|
|
647
|
-
doc.xref_set_key(page.xref, "CropBox", f"[0 0 {x1 - x0} {y1 - x0}]")
|
|
648
|
-
if page_box_data:
|
|
649
|
-
mediabox_data[page.number] = page_box_data
|
|
630
|
+
for x in range(1, doc.xref_length()):
|
|
631
|
+
t = doc.xref_get_key(x, "Type")
|
|
632
|
+
box_set = {}
|
|
633
|
+
if t[1] in ["/Pages", "/Page"]:
|
|
634
|
+
mediabox = doc.xref_get_key(x, "MediaBox")
|
|
635
|
+
if mediabox[0] != "null":
|
|
636
|
+
_, _, x1, y1 = mediabox[1].replace("[", "").replace("]", "").split(" ")
|
|
637
|
+
doc.xref_set_key(x, "MediaBox", f"[0 0 {x1} {y1}]")
|
|
638
|
+
box_set["MediaBox"] = mediabox[1]
|
|
639
|
+
for k in ["CropBox", "BleedBox", "TrimBox", "ArtBox"]:
|
|
640
|
+
box = doc.xref_get_key(x, k)
|
|
641
|
+
if box[0] != "null":
|
|
642
|
+
box_set[k] = box[1]
|
|
643
|
+
doc.xref_set_key(x, k, "null")
|
|
644
|
+
if box_set:
|
|
645
|
+
mediabox_data[x] = box_set
|
|
650
646
|
return mediabox_data
|
|
651
647
|
|
|
652
648
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "BabelDOC"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.58"
|
|
4
4
|
description = "Yet Another Document Translator"
|
|
5
5
|
license = "AGPL-3.0"
|
|
6
6
|
readme = "README.md"
|
|
@@ -151,7 +151,7 @@ pythonpath = [".", "src"]
|
|
|
151
151
|
testpaths = ["tests"]
|
|
152
152
|
|
|
153
153
|
[bumpver]
|
|
154
|
-
current_version = "0.3.
|
|
154
|
+
current_version = "0.3.58"
|
|
155
155
|
version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
|
|
156
156
|
|
|
157
157
|
[bumpver.file_patterns]
|