BabelDOC 0.1.18__tar.gz → 0.1.19__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 (77) hide show
  1. {babeldoc-0.1.18 → babeldoc-0.1.19}/PKG-INFO +4 -1
  2. {babeldoc-0.1.18 → babeldoc-0.1.19}/README.md +3 -0
  3. babeldoc-0.1.19/babeldoc/__init__.py +1 -0
  4. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/const.py +1 -1
  5. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/backend/pdf_creater.py +15 -15
  6. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/main.py +1 -1
  7. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/pdfinterp.py +7 -1
  8. {babeldoc-0.1.18 → babeldoc-0.1.19}/pyproject.toml +2 -2
  9. {babeldoc-0.1.18 → babeldoc-0.1.19}/uv.lock +1 -1
  10. babeldoc-0.1.18/babeldoc/__init__.py +0 -1
  11. {babeldoc-0.1.18 → babeldoc-0.1.19}/.cursorignore +0 -0
  12. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
  13. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
  14. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/dependabot.yml +0 -0
  15. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/labels.yml +0 -0
  16. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/release-drafter.yml +0 -0
  17. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/workflows/codeql.yml +0 -0
  18. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/workflows/docs.yml +0 -0
  19. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/workflows/labeler.yml +0 -0
  20. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/workflows/publish-to-pypi.yml +0 -0
  21. {babeldoc-0.1.18 → babeldoc-0.1.19}/.github/workflows/test.yml +0 -0
  22. {babeldoc-0.1.18 → babeldoc-0.1.19}/.gitignore +0 -0
  23. {babeldoc-0.1.18 → babeldoc-0.1.19}/.pre-commit-config.yaml +0 -0
  24. {babeldoc-0.1.18 → babeldoc-0.1.19}/LICENSE +0 -0
  25. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/asynchronize/__init__.py +0 -0
  26. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/converter.py +0 -0
  27. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/__init__.py +0 -0
  28. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/backend/__init__.py +0 -0
  29. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/frontend/__init__.py +0 -0
  30. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/frontend/il_creater.py +0 -0
  31. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/il_version_1.py +0 -0
  32. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/il_version_1.rnc +0 -0
  33. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/il_version_1.rng +0 -0
  34. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/il_version_1.xsd +0 -0
  35. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/__init__.py +0 -0
  36. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/add_debug_information.py +0 -0
  37. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/il_translator.py +0 -0
  38. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/layout_parser.py +0 -0
  39. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/paragraph_finder.py +0 -0
  40. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/remove_descent.py +0 -0
  41. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/styles_and_formulas.py +0 -0
  42. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/midend/typesetting.py +0 -0
  43. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/translator/__init__.py +0 -0
  44. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/translator/cache.py +0 -0
  45. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/translator/translator.py +0 -0
  46. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/utils/fontmap.py +0 -0
  47. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/utils/layout_helper.py +0 -0
  48. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/utils/style_helper.py +0 -0
  49. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/document_il/xml_converter.py +0 -0
  50. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/docvision/README.md +0 -0
  51. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/docvision/__init__.py +0 -0
  52. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/docvision/doclayout.py +0 -0
  53. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/docvision/rpc_doclayout.py +0 -0
  54. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/high_level.py +0 -0
  55. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/progress_monitor.py +0 -0
  56. {babeldoc-0.1.18 → babeldoc-0.1.19}/babeldoc/translation_config.py +0 -0
  57. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/CODE_OF_CONDUCT.md +0 -0
  58. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/CONTRIBUTING.md +0 -0
  59. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/CONTRIBUTOR_REWARD.md +0 -0
  60. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
  61. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
  62. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
  63. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
  64. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
  65. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/README.md +0 -0
  66. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
  67. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
  68. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/README.md +0 -0
  69. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/deploy.sh +0 -0
  70. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/images/babeldoc-banner.png +0 -0
  71. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/images/babeldoc-contributor_reward_example.png +0 -0
  72. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/images/babeldoc-preview.gif +0 -0
  73. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/index.md +0 -0
  74. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/intro-to-pdf-object.md +0 -0
  75. {babeldoc-0.1.18 → babeldoc-0.1.19}/docs/requirements.txt +0 -0
  76. {babeldoc-0.1.18 → babeldoc-0.1.19}/mkdocs.yml +0 -0
  77. {babeldoc-0.1.18 → babeldoc-0.1.19}/tests/test_translation_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BabelDOC
3
- Version: 0.1.18
3
+ Version: 0.1.19
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
@@ -134,7 +134,10 @@ uv run babeldoc --bing --files example.pdf --files example2.pdf
134
134
 
135
135
  > [!TIP]
136
136
  > Currently, this project mainly focuses on English-to-Chinese translation, and other scenarios have not been tested yet.
137
+ >
137
138
  > (2025.3.1 update): Basic English target language support has been added, primarily to minimize line breaks within words([0-9A-Za-z]+).
139
+ >
140
+ > [HELP WANTED: Collecting word regular expressions for more languages](https://github.com/funstory-ai/BabelDOC/issues/129)
138
141
 
139
142
  ### PDF Processing Options
140
143
 
@@ -100,7 +100,10 @@ uv run babeldoc --bing --files example.pdf --files example2.pdf
100
100
 
101
101
  > [!TIP]
102
102
  > Currently, this project mainly focuses on English-to-Chinese translation, and other scenarios have not been tested yet.
103
+ >
103
104
  > (2025.3.1 update): Basic English target language support has been added, primarily to minimize line breaks within words([0-9A-Za-z]+).
105
+ >
106
+ > [HELP WANTED: Collecting word regular expressions for more languages](https://github.com/funstory-ai/BabelDOC/issues/129)
104
107
 
105
108
  ### PDF Processing Options
106
109
 
@@ -0,0 +1 @@
1
+ __version__ = "0.1.19"
@@ -2,7 +2,7 @@ import shutil
2
2
  import subprocess
3
3
  from pathlib import Path
4
4
 
5
- __version__ = "0.1.18"
5
+ __version__ = "0.1.19"
6
6
 
7
7
  CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
8
8
 
@@ -413,11 +413,11 @@ class PDFCreater:
413
413
 
414
414
  # 使用子进程进行字体子集化
415
415
  if not translation_config.skip_clean:
416
- pdf = self.subset_fonts_in_subprocess(pdf, translation_config)
416
+ pdf = self.subset_fonts_in_subprocess(pdf, translation_config, tag="debug")
417
417
  return pdf
418
418
 
419
419
  def subset_fonts_in_subprocess(
420
- self, pdf: pymupdf.Document, translation_config: TranslationConfig
420
+ self, pdf: pymupdf.Document, translation_config: TranslationConfig, tag: str
421
421
  ) -> pymupdf.Document:
422
422
  """Run font subsetting in a subprocess with timeout.
423
423
 
@@ -431,14 +431,10 @@ class PDFCreater:
431
431
  original_pdf = pdf
432
432
  # Create temporary file paths
433
433
  temp_input = str(
434
- translation_config.get_working_file_path(
435
- f"temp_subset_input_{int(time.time())}.pdf"
436
- )
434
+ translation_config.get_working_file_path(f"temp_subset_input_{tag}.pdf")
437
435
  )
438
436
  temp_output = str(
439
- translation_config.get_working_file_path(
440
- f"temp_subset_output_{int(time.time())}.pdf"
441
- )
437
+ translation_config.get_working_file_path(f"temp_subset_output_{tag}.pdf")
442
438
  )
443
439
 
444
440
  # Save PDF to temporary file without subsetting
@@ -504,6 +500,7 @@ class PDFCreater:
504
500
  deflate_fonts: bool = True,
505
501
  linear: bool = False,
506
502
  timeout: int = 120,
503
+ tag: str = "",
507
504
  ) -> bool:
508
505
  """Save a PDF document with a timeout for the clean=True operation.
509
506
 
@@ -523,14 +520,10 @@ class PDFCreater:
523
520
  """
524
521
  # Create temporary file paths
525
522
  temp_input = str(
526
- translation_config.get_working_file_path(
527
- f"temp_save_input_{int(time.time())}.pdf"
528
- )
523
+ translation_config.get_working_file_path(f"temp_save_input_{tag}.pdf")
529
524
  )
530
525
  temp_output = str(
531
- translation_config.get_working_file_path(
532
- f"temp_save_output_{int(time.time())}.pdf"
533
- )
526
+ translation_config.get_working_file_path(f"temp_save_output_{tag}.pdf")
534
527
  )
535
528
 
536
529
  # Save PDF to temporary file first
@@ -614,6 +607,9 @@ class PDFCreater:
614
607
  logger.error(f"Error copying saved PDF: {e}")
615
608
  pdf.save(output_path) # Fallback to direct save
616
609
  return False
610
+ finally:
611
+ Path(temp_input).unlink()
612
+ Path(temp_output).unlink()
617
613
  else:
618
614
  logger.warning(
619
615
  f"PDF save with clean=True failed with exit code {exit_code} or produced empty file"
@@ -748,7 +744,9 @@ class PDFCreater:
748
744
  1,
749
745
  ) as pbar:
750
746
  if not translation_config.skip_clean:
751
- pdf = self.subset_fonts_in_subprocess(pdf, translation_config)
747
+ pdf = self.subset_fonts_in_subprocess(
748
+ pdf, translation_config, tag="mono"
749
+ )
752
750
 
753
751
  pbar.advance()
754
752
  with self.translation_config.progress_monitor.stage_start(
@@ -773,6 +771,7 @@ class PDFCreater:
773
771
  clean=not translation_config.skip_clean,
774
772
  deflate_fonts=True,
775
773
  linear=False,
774
+ tag="mono",
776
775
  )
777
776
  pbar.advance()
778
777
  dual_out_path = None
@@ -823,6 +822,7 @@ class PDFCreater:
823
822
  clean=not translation_config.skip_clean,
824
823
  deflate_fonts=True,
825
824
  linear=False,
825
+ tag="dual",
826
826
  )
827
827
  if translation_config.debug:
828
828
  translation_config.raise_if_cancelled()
@@ -23,7 +23,7 @@ from babeldoc.docvision.rpc_doclayout import RpcDocLayoutModel
23
23
  from babeldoc.translation_config import TranslationConfig
24
24
 
25
25
  logger = logging.getLogger(__name__)
26
- __version__ = "0.1.18"
26
+ __version__ = "0.1.19"
27
27
 
28
28
 
29
29
  def create_parser():
@@ -249,7 +249,13 @@ class PDFPageInterpreterEx(PDFPageInterpreter):
249
249
  subtype = xobj.get("Subtype")
250
250
  if subtype is LITERAL_FORM and "BBox" in xobj:
251
251
  interpreter = self.dup()
252
- bbox = cast(Rect, list_value(xobj["BBox"]))
252
+
253
+ # In extremely rare cases, a none might be mixed in the bbox, for example
254
+ # /BBox [ 0 3.052 null 274.9 157.3 ]
255
+ bbox = list(
256
+ filter(lambda x: x is not None, cast(Rect, list_value(xobj["BBox"])))
257
+ )
258
+
253
259
  matrix = cast(Matrix, list_value(xobj.get("Matrix", MATRIX_IDENTITY)))
254
260
  # According to PDF reference 1.7 section 4.9.1, XObjects in
255
261
  # earlier PDFs (prior to v1.2) use the page's Resources entry
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "BabelDOC"
3
- version = "0.1.18"
3
+ version = "0.1.19"
4
4
  description = "Yet Another Document Translator"
5
5
  license = "AGPL-3.0"
6
6
  readme = "README.md"
@@ -132,7 +132,7 @@ pythonpath = [".", "src"]
132
132
  testpaths = ["tests"]
133
133
 
134
134
  [bumpver]
135
- current_version = "0.1.18"
135
+ current_version = "0.1.19"
136
136
  version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
137
137
 
138
138
  [bumpver.file_patterns]
@@ -48,7 +48,7 @@ wheels = [
48
48
 
49
49
  [[package]]
50
50
  name = "babeldoc"
51
- version = "0.1.18"
51
+ version = "0.1.19"
52
52
  source = { editable = "." }
53
53
  dependencies = [
54
54
  { name = "bitstring" },
@@ -1 +0,0 @@
1
- __version__ = "0.1.18"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes