BabelDOC 0.3.22__tar.gz → 0.3.24__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.22 → babeldoc-0.3.24}/PKG-INFO +1 -1
- babeldoc-0.3.24/babeldoc/__init__.py +1 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/asynchronize/__init__.py +1 -1
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/const.py +1 -1
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/backend/pdf_creater.py +8 -2
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/paragraph_finder.py +104 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/typesetting.py +6 -4
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/high_level.py +6 -2
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/main.py +4 -1
- {babeldoc-0.3.22 → babeldoc-0.3.24}/pyproject.toml +2 -2
- {babeldoc-0.3.22 → babeldoc-0.3.24}/uv.lock +169 -169
- babeldoc-0.3.22/babeldoc/__init__.py +0 -1
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.cursorignore +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/dependabot.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/labels.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/release-drafter.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/codeql.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/docs.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/labeler.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/lint.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/pr-lint.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/publish-to-pypi.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.github/workflows/test.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.gitignore +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/.pre-commit-config.yaml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/LICENSE +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/README.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/assets/assets.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/assets/embedding_assets_metadata.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/converter.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/babeldoc_exception/BabelDOCException.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/backend/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/frontend/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/frontend/il_creater.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/il_version_1.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/il_version_1.rnc +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/il_version_1.rng +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/il_version_1.xsd +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/add_debug_information.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/detect_scanned_file.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/il_translator.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/il_translator_llm_only.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/layout_parser.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/remove_descent.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/midend/table_parser.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/translator/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/translator/cache.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/translator/translator.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/utils/atomic_integer.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/utils/fontmap.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/utils/layout_helper.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/utils/priority_thread_pool_executor.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/utils/style_helper.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/document_il/xml_converter.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/docvision/README.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/docvision/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/docvision/doclayout.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/docvision/rpc_doclayout.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/format/office/__init__.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/pdfinterp.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/progress_monitor.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/result_merger.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/split_manager.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/tools/generate_font_metadata.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/tools/italic_assistance.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/tools/italic_recognize_tool.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/babeldoc/translation_config.py +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/CODE_OF_CONDUCT.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/CONTRIBUTING.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/CONTRIBUTOR_REWARD.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/README.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/README.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/deploy.sh +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-banner.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-big-logo.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-contributor_reward_example.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-preview.gif +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/images/babeldoc-small-logo.png +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/index.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/intro-to-pdf-object.md +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/docs/requirements.txt +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/mkdocs.yml +0 -0
- {babeldoc-0.3.22 → babeldoc-0.3.24}/tests/test_translation_config.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.24"
|
|
@@ -23,7 +23,7 @@ class AsyncCallback:
|
|
|
23
23
|
self.loop.call_soon_threadsafe(self.queue.put_nowait, args)
|
|
24
24
|
|
|
25
25
|
# Add a small delay to release the GIL, ensuring the event loop has time to process messages
|
|
26
|
-
time.sleep(0.
|
|
26
|
+
time.sleep(0.01)
|
|
27
27
|
|
|
28
28
|
def finished_callback(self, *args, **kwargs):
|
|
29
29
|
# Whenever a finished is called, add to the queue as with step, but also set finished to True, so __anext__
|
|
@@ -777,7 +777,10 @@ class PDFCreater:
|
|
|
777
777
|
|
|
778
778
|
def restore_media_box(self, doc: pymupdf.Document, mediabox_data: dict) -> None:
|
|
779
779
|
for pageno, mediabox in mediabox_data.items():
|
|
780
|
-
|
|
780
|
+
try:
|
|
781
|
+
doc.xref_set_key(doc[pageno].xref, "MediaBox", mediabox[1])
|
|
782
|
+
except Exception:
|
|
783
|
+
logger.exception(f"restore media box failed on page: {pageno}")
|
|
781
784
|
|
|
782
785
|
def write(
|
|
783
786
|
self, translation_config: TranslationConfig, check_font_exists: bool = False
|
|
@@ -945,7 +948,10 @@ class PDFCreater:
|
|
|
945
948
|
)
|
|
946
949
|
|
|
947
950
|
pbar.advance()
|
|
948
|
-
|
|
951
|
+
try:
|
|
952
|
+
self.restore_media_box(pdf, self.mediabox_data)
|
|
953
|
+
except Exception:
|
|
954
|
+
logger.exception("restore media box failed")
|
|
949
955
|
with self.translation_config.progress_monitor.stage_start(
|
|
950
956
|
SAVE_PDF_STAGE_NAME,
|
|
951
957
|
2,
|
|
@@ -167,6 +167,8 @@ class ParagraphFinder:
|
|
|
167
167
|
# image characters are not needed
|
|
168
168
|
page.pdf_character = []
|
|
169
169
|
|
|
170
|
+
self.fix_overlapping_paragraphs(page)
|
|
171
|
+
|
|
170
172
|
def is_isolated_formula(self, char: PdfCharacter):
|
|
171
173
|
return char.char_unicode in (
|
|
172
174
|
"(cid:122)",
|
|
@@ -510,3 +512,105 @@ class ParagraphFinder:
|
|
|
510
512
|
break
|
|
511
513
|
j += 1
|
|
512
514
|
i += 1
|
|
515
|
+
|
|
516
|
+
@staticmethod
|
|
517
|
+
def is_bbox_contain_in_vertical(bbox1: Box, bbox2: Box) -> bool:
|
|
518
|
+
"""Check if one bounding box is completely contained within the other."""
|
|
519
|
+
# Check if bbox1 is contained in bbox2
|
|
520
|
+
bbox1_in_bbox2 = bbox1.y >= bbox2.y and bbox1.y2 <= bbox2.y2
|
|
521
|
+
# Check if bbox2 is contained in bbox1
|
|
522
|
+
bbox2_in_bbox1 = bbox2.y >= bbox1.y and bbox2.y2 <= bbox1.y2
|
|
523
|
+
return bbox1_in_bbox2 or bbox2_in_bbox1
|
|
524
|
+
|
|
525
|
+
def fix_overlapping_paragraphs(self, page: Page):
|
|
526
|
+
"""
|
|
527
|
+
Adjusts the bounding boxes of paragraphs on a page to resolve vertical overlaps.
|
|
528
|
+
|
|
529
|
+
Iteratively checks pairs of paragraphs and adjusts their vertical boundaries
|
|
530
|
+
(y and y2) if they overlap, aiming to place the boundary at the midpoint
|
|
531
|
+
of the vertical overlap.
|
|
532
|
+
"""
|
|
533
|
+
paragraphs = page.pdf_paragraph
|
|
534
|
+
if not paragraphs or len(paragraphs) < 2:
|
|
535
|
+
return
|
|
536
|
+
|
|
537
|
+
max_iterations = len(paragraphs) * len(paragraphs) # Safety break
|
|
538
|
+
iterations = 0
|
|
539
|
+
|
|
540
|
+
while iterations < max_iterations:
|
|
541
|
+
iterations += 1
|
|
542
|
+
overlap_found_in_pass = False
|
|
543
|
+
|
|
544
|
+
for i in range(len(paragraphs)):
|
|
545
|
+
for j in range(i + 1, len(paragraphs)):
|
|
546
|
+
para1 = paragraphs[i]
|
|
547
|
+
para2 = paragraphs[j]
|
|
548
|
+
|
|
549
|
+
if para1.box is None or para2.box is None:
|
|
550
|
+
continue
|
|
551
|
+
|
|
552
|
+
if para1.xobj_id != para2.xobj_id:
|
|
553
|
+
continue
|
|
554
|
+
|
|
555
|
+
# Check for overlap using the existing method
|
|
556
|
+
if self.bbox_overlap(para1.box, para2.box):
|
|
557
|
+
if self.is_bbox_contain_in_vertical(para1.box, para2.box):
|
|
558
|
+
continue
|
|
559
|
+
# Calculate vertical overlap details
|
|
560
|
+
overlap_y_start = max(para1.box.y, para2.box.y)
|
|
561
|
+
overlap_y_end = min(para1.box.y2, para2.box.y2)
|
|
562
|
+
overlap_height = overlap_y_end - overlap_y_start
|
|
563
|
+
|
|
564
|
+
# Calculate horizontal overlap details
|
|
565
|
+
overlap_x_start = max(para1.box.x, para2.box.x)
|
|
566
|
+
overlap_x_end = min(para1.box.x2, para2.box.x2)
|
|
567
|
+
overlap_width = overlap_x_end - overlap_x_start
|
|
568
|
+
|
|
569
|
+
# Ensure there's a real 2D overlap, focusing on vertical adjustment
|
|
570
|
+
if overlap_height > 1e-6 and overlap_width > 1e-6:
|
|
571
|
+
overlap_found_in_pass = True
|
|
572
|
+
|
|
573
|
+
# Determine which paragraph is visually higher
|
|
574
|
+
if para1.box.y2 > para2.box.y and para1.box.y < para2.box.y:
|
|
575
|
+
lower_para = para1
|
|
576
|
+
higher_para = para2
|
|
577
|
+
# Handle cases where y values are identical (or very close)
|
|
578
|
+
# Prefer the one with smaller y2 as the higher one, or break tie arbitrarily
|
|
579
|
+
elif para1.box.y2 < para2.box.y2:
|
|
580
|
+
lower_para = para1
|
|
581
|
+
higher_para = para2
|
|
582
|
+
else:
|
|
583
|
+
lower_para = para2
|
|
584
|
+
higher_para = para1
|
|
585
|
+
|
|
586
|
+
# Calculate the midpoint of the vertical overlap
|
|
587
|
+
mid_y = overlap_y_start + overlap_height / 2
|
|
588
|
+
|
|
589
|
+
# Adjust boxes, ensuring they remain valid (y2 > y)
|
|
590
|
+
if mid_y > higher_para.box.y and mid_y < lower_para.box.y2:
|
|
591
|
+
higher_para.box.y = mid_y + 1
|
|
592
|
+
lower_para.box.y2 = mid_y - 1
|
|
593
|
+
else:
|
|
594
|
+
# This might happen if one box is fully contained vertically
|
|
595
|
+
# within another, or due to floating point issues.
|
|
596
|
+
# Log a warning and skip adjustment for this pair in this iteration.
|
|
597
|
+
# A more complex strategy might be needed for full containment.
|
|
598
|
+
logger.warning(
|
|
599
|
+
"Could not resolve overlap between paragraphs"
|
|
600
|
+
f" {higher_para.debug_id} and {lower_para.debug_id}"
|
|
601
|
+
" using simple midpoint strategy."
|
|
602
|
+
f" Midpoint: {mid_y},"
|
|
603
|
+
f" Higher Box: {higher_para.box},"
|
|
604
|
+
f" Lower Box: {lower_para.box}"
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
# If no overlaps were found and adjusted in this pass, we're done.
|
|
608
|
+
if not overlap_found_in_pass:
|
|
609
|
+
break
|
|
610
|
+
|
|
611
|
+
if iterations == max_iterations:
|
|
612
|
+
logger.warning(
|
|
613
|
+
f"Maximum iterations ({max_iterations}) reached in"
|
|
614
|
+
f" fix_overlapping_paragraphs for page {page.page_number}."
|
|
615
|
+
" Some overlaps might remain."
|
|
616
|
+
)
|
|
@@ -645,7 +645,7 @@ class Typesetting:
|
|
|
645
645
|
current_x = box.x
|
|
646
646
|
current_y = box.y2 - avg_height
|
|
647
647
|
box = copy.deepcopy(box)
|
|
648
|
-
box.y -= avg_height * (line_spacing - 1)
|
|
648
|
+
# box.y -= avg_height * (line_spacing - 1.01)
|
|
649
649
|
line_height = 0
|
|
650
650
|
current_line_heights = [] # 存储当前行所有元素的高度
|
|
651
651
|
|
|
@@ -722,7 +722,8 @@ class Typesetting:
|
|
|
722
722
|
current_line_heights = [] # 清空当前行高度列表
|
|
723
723
|
|
|
724
724
|
# 检查是否超出底部边界
|
|
725
|
-
if current_y - unit_height < box.y:
|
|
725
|
+
# if current_y - unit_height < box.y:
|
|
726
|
+
if current_y < box.y:
|
|
726
727
|
all_units_fit = False
|
|
727
728
|
break
|
|
728
729
|
|
|
@@ -750,8 +751,9 @@ class Typesetting:
|
|
|
750
751
|
# 处理最后一行的行高
|
|
751
752
|
if current_line_heights:
|
|
752
753
|
mode_height = statistics.mode(current_line_heights)
|
|
753
|
-
max_height = max(current_line_heights)
|
|
754
|
-
line_height = max(mode_height, max_height)
|
|
754
|
+
# max_height = max(current_line_heights)
|
|
755
|
+
# line_height = max(mode_height, max_height)
|
|
756
|
+
line_height = mode_height
|
|
755
757
|
|
|
756
758
|
return typeset_units, all_units_fit
|
|
757
759
|
|
|
@@ -547,7 +547,7 @@ 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
551
|
pm.disable = False
|
|
552
552
|
pm.translate_error(e)
|
|
553
553
|
raise
|
|
@@ -713,7 +713,9 @@ def _do_translate_single(
|
|
|
713
713
|
try:
|
|
714
714
|
if translation_config.watermark_output_mode == WatermarkOutputMode.Both:
|
|
715
715
|
mono_watermark_first_page_doc_bytes, dual_watermark_first_page_doc_bytes = (
|
|
716
|
-
generate_first_page_with_watermark(
|
|
716
|
+
generate_first_page_with_watermark(
|
|
717
|
+
doc_pdf2zh, translation_config, docs, mediabox_data
|
|
718
|
+
)
|
|
717
719
|
)
|
|
718
720
|
except Exception:
|
|
719
721
|
logger.warning(
|
|
@@ -763,6 +765,7 @@ def generate_first_page_with_watermark(
|
|
|
763
765
|
mupdf: Document,
|
|
764
766
|
translation_config: TranslationConfig,
|
|
765
767
|
doc_il: il_version_1.Document,
|
|
768
|
+
mediabox_data: dict[int, Any] | None = None,
|
|
766
769
|
) -> (io.BytesIO, io.BytesIO):
|
|
767
770
|
first_page_doc = Document()
|
|
768
771
|
first_page_doc.insert_pdf(mupdf, from_page=0, to_page=0)
|
|
@@ -785,6 +788,7 @@ def generate_first_page_with_watermark(
|
|
|
785
788
|
watermarked_temp_pdf_path.as_posix(),
|
|
786
789
|
il_only_first_page_doc,
|
|
787
790
|
watermarked_config,
|
|
791
|
+
mediabox_data,
|
|
788
792
|
)
|
|
789
793
|
result = pdf_creater.write(watermarked_config)
|
|
790
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.24"
|
|
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.24"
|
|
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.24"
|
|
153
153
|
version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
|
|
154
154
|
|
|
155
155
|
[bumpver.file_patterns]
|