BabelDOC 0.5.11__tar.gz → 0.5.12__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.5.11 → babeldoc-0.5.12}/PKG-INFO +1 -1
- babeldoc-0.5.12/babeldoc/__init__.py +1 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/const.py +44 -1
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout6.py +20 -15
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py +3 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/layout_parser.py +51 -35
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py +8 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/extract_char.py +10 -0
- babeldoc-0.5.12/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +42 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/main.py +25 -3
- {babeldoc-0.5.11 → babeldoc-0.5.12}/pyproject.toml +2 -2
- babeldoc-0.5.11/babeldoc/__init__.py +0 -1
- babeldoc-0.5.11/babeldoc/format/pdf/document_il/utils/mupdf_helper.py +0 -10
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.cursorignore +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/PULL_REQUEST_TEMPLATE/pr_form.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/dependabot.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/labels.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/release-drafter.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/codeql.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/docs.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/labeler.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/lint.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/pr-lint.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/publish-to-pypi.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.github/workflows/test.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.gitignore +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/.pre-commit-config.yaml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/LICENSE +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/README.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/assets/assets.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/assets/embedding_assets_metadata.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/asynchronize/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/babeldoc_exception/BabelDOCException.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/babeldoc_exception/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/README.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/base_doclayout.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/doclayout.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout2.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout3.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout4.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout5.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/rpc_doclayout7.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/docvision/table_detection/rapidocr.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/base14.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/cidfont.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/encoding.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/utils.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/babelpdf/win_core.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/converter.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/backend/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/backend/pdf_creater.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/frontend/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/frontend/il_creater.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.rnc +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.rng +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/il_version_1.xsd +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/add_debug_information.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/automatic_term_extractor.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/il_translator.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/remove_descent.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/table_parser.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/typesetting.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/fontmap.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/formular_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/layout_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/matrix_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/paragraph_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/spatial_analyzer.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/style_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/utils/zstd_helper.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/xml_converter.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/high_level.py +1 -1
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/pdfinterp.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/result_merger.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/split_manager.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/translation_config.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/glossary.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/LICENSE +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/_saslprep.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/arcfour.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/ascii85.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/casting.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/ccitt.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78ms-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/78ms-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/83pv-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/83pv-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90ms-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90ms-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90msp-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90msp-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90pv-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/90pv-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Add-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5pc-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/B5pc-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS1-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS1-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS2-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/CNS2-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETHK-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETHK-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETen-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETen-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETenms-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/ETenms-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Ext-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GB-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK2K-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBK2K-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBKp-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBKp-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBT-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBTpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBTpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/GBpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdla-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdla-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdlb-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKdlb-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKgccs-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKgccs-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm314-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm314-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm471-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKm471-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKscs-B5-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/HKscs-B5-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hankaku-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hankaku-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hiragana-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Hiragana-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-Johab-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-Johab-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-HW-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCms-UHC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCpc-EUC-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/KSCpc-EUC-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Katakana-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Katakana-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/NWP-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/NWP-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/README.txt +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/RKSJ-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/RKSJ-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Roman-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/Roman-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniCNS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniGB-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-HW-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJIS2004-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX0213-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniJISX02132004-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UCS2-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UCS2-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF16-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF16-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF32-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF32-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF8-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/UniKS-UTF8-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/WP-Symbol-H.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/WP-Symbol-V.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-CNS1.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-GB1.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Japan1.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmap/to-unicode-Adobe-Korea1.pickle.gz +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/cmapdb.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/converter.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/data_structures.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/encodingdb.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/fontmetrics.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/glyphlist.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/high_level.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/image.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/jbig2.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/latin_enc.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/layout.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/lzw.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfcolor.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfdevice.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfdocument.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfexceptions.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdffont.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfinterp.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfpage.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdfparser.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/pdftypes.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/psexceptions.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/psparser.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/py.typed +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/runlength.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/settings.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/pdfminer/utils.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/progress_monitor.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/generate_font_metadata.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/italic_assistance.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/tools/italic_recognize_tool.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/cache.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/translator/translator.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/__init__.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/atomic_integer.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/utils/priority_thread_pool_executor.py +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CODE_OF_CONDUCT.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CONTRIBUTING.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/CONTRIBUTOR_REWARD.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/AsyncTranslate/AsyncTranslate.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/ILTranslator/ILTranslator.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/PDFCreation/PDFCreation.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/PDFParsing/PDFParsing.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/ParagraphFinding/ParagraphFinding.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/README.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/StylesAndFormulas/StylesAndFormulas.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/ImplementationDetails/Typesetting/Typesetting.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/README.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/deploy.sh +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/example/demo_glossary.csv +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-banner.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-darkmode-with-transparent-background.svg +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-with-transparent-background.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-big-logo.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-contributor_reward_example.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-preview.gif +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo-with-transparent-background.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo-with-transparent-background.svg +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/images/babeldoc-small-logo.png +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/index.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/intro-to-pdf-object.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/requirements.txt +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/docs/supported_languages.md +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/mkdocs.yml +0 -0
- {babeldoc-0.5.11 → babeldoc-0.5.12}/tests/test_translation_cache_cleanup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.5.12"
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
import multiprocessing as mp
|
|
1
3
|
import os
|
|
2
4
|
import shutil
|
|
3
5
|
import subprocess
|
|
6
|
+
import threading
|
|
4
7
|
from pathlib import Path
|
|
5
8
|
|
|
6
|
-
__version__ = "0.5.
|
|
9
|
+
__version__ = "0.5.12"
|
|
7
10
|
|
|
8
11
|
CACHE_FOLDER = Path.home() / ".cache" / "babeldoc"
|
|
9
12
|
|
|
@@ -39,3 +42,43 @@ except (OSError, FileNotFoundError, subprocess.CalledProcessError):
|
|
|
39
42
|
TIKTOKEN_CACHE_FOLDER = CACHE_FOLDER / "tiktoken"
|
|
40
43
|
TIKTOKEN_CACHE_FOLDER.mkdir(parents=True, exist_ok=True)
|
|
41
44
|
os.environ["TIKTOKEN_CACHE_DIR"] = str(TIKTOKEN_CACHE_FOLDER)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
_process_pool = None
|
|
48
|
+
_process_pool_lock = threading.Lock()
|
|
49
|
+
_ENABLE_PROCESS_POOL = False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def enable_process_pool():
|
|
53
|
+
# Development and Testing ONLY API
|
|
54
|
+
global _ENABLE_PROCESS_POOL
|
|
55
|
+
_ENABLE_PROCESS_POOL = True
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# macos & windows use spawn mode
|
|
59
|
+
# linux use forkserver mode
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def get_process_pool():
|
|
63
|
+
if not _ENABLE_PROCESS_POOL:
|
|
64
|
+
return None
|
|
65
|
+
global _process_pool
|
|
66
|
+
with _process_pool_lock:
|
|
67
|
+
if _process_pool is None:
|
|
68
|
+
# Create pool only in main process
|
|
69
|
+
if mp.current_process().name != "MainProcess":
|
|
70
|
+
return None
|
|
71
|
+
|
|
72
|
+
_process_pool = mp.Pool()
|
|
73
|
+
return _process_pool
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def batched(iterable, n, *, strict=False):
|
|
77
|
+
# batched('ABCDEFG', 3) → ABC DEF G
|
|
78
|
+
if n < 1:
|
|
79
|
+
raise ValueError("n must be at least one")
|
|
80
|
+
iterator = iter(iterable)
|
|
81
|
+
while batch := tuple(itertools.islice(iterator, n)):
|
|
82
|
+
if strict and len(batch) != n:
|
|
83
|
+
raise ValueError("batched(): incomplete batch")
|
|
84
|
+
yield batch
|
|
@@ -28,7 +28,9 @@ from babeldoc.format.pdf.document_il.utils.extract_char import (
|
|
|
28
28
|
)
|
|
29
29
|
from babeldoc.format.pdf.document_il.utils.fontmap import FontMapper
|
|
30
30
|
from babeldoc.format.pdf.document_il.utils.layout_helper import SPACE_REGEX
|
|
31
|
-
from babeldoc.format.pdf.document_il.utils.mupdf_helper import
|
|
31
|
+
from babeldoc.format.pdf.document_il.utils.mupdf_helper import (
|
|
32
|
+
get_no_rotation_img_multiprocess,
|
|
33
|
+
)
|
|
32
34
|
|
|
33
35
|
logger = logging.getLogger(__name__)
|
|
34
36
|
DPI = 150
|
|
@@ -141,7 +143,7 @@ def predict_layout(
|
|
|
141
143
|
f"{host}/inference",
|
|
142
144
|
json=request_data,
|
|
143
145
|
headers={"Accept": "application/json", "Content-Type": "application/json"},
|
|
144
|
-
timeout=
|
|
146
|
+
timeout=30,
|
|
145
147
|
follow_redirects=True,
|
|
146
148
|
)
|
|
147
149
|
|
|
@@ -233,7 +235,7 @@ def predict_layout2(
|
|
|
233
235
|
"Content-Type": "application/msgpack",
|
|
234
236
|
"Accept": "application/msgpack",
|
|
235
237
|
},
|
|
236
|
-
timeout=
|
|
238
|
+
timeout=30,
|
|
237
239
|
follow_redirects=True,
|
|
238
240
|
)
|
|
239
241
|
|
|
@@ -569,18 +571,19 @@ class RpcDocLayoutModel(DocLayoutModel):
|
|
|
569
571
|
|
|
570
572
|
return results
|
|
571
573
|
|
|
572
|
-
def predict_page(
|
|
573
|
-
self, page, mupdf_doc: pymupdf.Document, translate_config, save_debug_image
|
|
574
|
-
):
|
|
574
|
+
def predict_page(self, page, pdf_bytes: Path, translate_config, save_debug_image):
|
|
575
575
|
translate_config.raise_if_cancelled()
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
image =
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
576
|
+
# doc = pymupdf.open(io.BytesIO(pdf_bytes))
|
|
577
|
+
# with self.lock:
|
|
578
|
+
# pix = mupdf_doc[page.page_number].get_pixmap(dpi=72)
|
|
579
|
+
image = get_no_rotation_img_multiprocess(
|
|
580
|
+
pdf_bytes.as_posix(), page.page_number, dpi=DPI
|
|
581
|
+
)
|
|
582
|
+
# image = np.frombuffer(pix.samples, np.uint8).reshape(
|
|
583
|
+
# pix.height,
|
|
584
|
+
# pix.width,
|
|
585
|
+
# 3,
|
|
586
|
+
# )[:, :, ::-1]
|
|
584
587
|
char_boxes = convert_page_to_char_boxes(page)
|
|
585
588
|
lines = process_page_chars_to_lines(char_boxes)
|
|
586
589
|
predict_result = self.predict_image(image, 800, lines)
|
|
@@ -594,11 +597,13 @@ class RpcDocLayoutModel(DocLayoutModel):
|
|
|
594
597
|
translate_config,
|
|
595
598
|
save_debug_image,
|
|
596
599
|
):
|
|
600
|
+
layout_temp_path = translate_config.get_working_file_path("layout.temp.pdf")
|
|
601
|
+
mupdf_doc.save(layout_temp_path.as_posix())
|
|
597
602
|
with ThreadPoolExecutor(max_workers=32) as executor:
|
|
598
603
|
yield from executor.map(
|
|
599
604
|
self.predict_page,
|
|
600
605
|
pages,
|
|
601
|
-
(
|
|
606
|
+
(layout_temp_path for _ in range(len(pages))),
|
|
602
607
|
(translate_config for _ in range(len(pages))),
|
|
603
608
|
(save_debug_image for _ in range(len(pages))),
|
|
604
609
|
)
|
{babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/detect_scanned_file.py
RENAMED
|
@@ -9,6 +9,7 @@ from skimage.metrics import structural_similarity
|
|
|
9
9
|
from babeldoc.babeldoc_exception.BabelDOCException import ScannedPDFError
|
|
10
10
|
from babeldoc.format.pdf.document_il import il_version_1
|
|
11
11
|
from babeldoc.format.pdf.document_il.backend.pdf_creater import PDFCreater
|
|
12
|
+
from babeldoc.format.pdf.document_il.utils.style_helper import BLACK
|
|
12
13
|
from babeldoc.format.pdf.document_il.utils.style_helper import GREEN
|
|
13
14
|
from babeldoc.format.pdf.translation_config import TranslationConfig
|
|
14
15
|
|
|
@@ -143,6 +144,8 @@ class DetectScannedFile:
|
|
|
143
144
|
for page in docs.page:
|
|
144
145
|
for char in page.pdf_character:
|
|
145
146
|
char.render_order = None
|
|
147
|
+
if not char.debug_info:
|
|
148
|
+
char.pdf_style.graphic_state = BLACK
|
|
146
149
|
|
|
147
150
|
def detect_page_is_scanned(
|
|
148
151
|
self, page: il_version_1.Page, pdf: pymupdf.Document, pdf_creater: PDFCreater
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
|
+
import math
|
|
3
|
+
import os
|
|
4
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
2
5
|
from pathlib import Path
|
|
3
6
|
|
|
4
7
|
import cv2
|
|
@@ -7,7 +10,6 @@ from pymupdf import Document
|
|
|
7
10
|
|
|
8
11
|
import babeldoc.format.pdf.document_il.utils.extract_char
|
|
9
12
|
from babeldoc.format.pdf.document_il import il_version_1
|
|
10
|
-
from babeldoc.format.pdf.document_il.utils.mupdf_helper import get_no_rotation_img
|
|
11
13
|
from babeldoc.format.pdf.document_il.utils.style_helper import GREEN
|
|
12
14
|
from babeldoc.format.pdf.translation_config import TranslationConfig
|
|
13
15
|
|
|
@@ -120,7 +122,7 @@ class LayoutParser:
|
|
|
120
122
|
total = len(docs.page)
|
|
121
123
|
with self.translation_config.progress_monitor.stage_start(
|
|
122
124
|
self.stage_name,
|
|
123
|
-
total,
|
|
125
|
+
total * 2,
|
|
124
126
|
) as progress:
|
|
125
127
|
# Process predictions for each page
|
|
126
128
|
for page, layouts in self.model.handle_document(
|
|
@@ -134,9 +136,15 @@ class LayoutParser:
|
|
|
134
136
|
# Convert coordinate system from picture to il
|
|
135
137
|
# system to the il coordinate system
|
|
136
138
|
x0, y0, x1, y1 = layout.xyxy
|
|
137
|
-
pix = get_no_rotation_img(mupdf_doc[page.page_number])
|
|
139
|
+
# pix = get_no_rotation_img(mupdf_doc[page.page_number])
|
|
138
140
|
# pix = mupdf_doc[page.page_number].get_pixmap()
|
|
139
|
-
h, w = pix.height, pix.width
|
|
141
|
+
# h, w = pix.height, pix.width
|
|
142
|
+
box = mupdf_doc[page.page_number].mediabox_size
|
|
143
|
+
b_h = math.ceil(box.y)
|
|
144
|
+
b_w = math.ceil(box.x)
|
|
145
|
+
# if b_h != h or b_w != w:
|
|
146
|
+
# logger.warning(f"page {page.page_number} mediabox is not correct, b_h: {b_h}, h: {h}, b_w: {b_w}, w: {w}")
|
|
147
|
+
h, w = b_h, b_w
|
|
140
148
|
x0, y0, x1, y1 = (
|
|
141
149
|
np.clip(int(x0 - 1), 0, w - 1),
|
|
142
150
|
np.clip(int(h - y1 - 1), 0, h - 1),
|
|
@@ -157,39 +165,47 @@ class LayoutParser:
|
|
|
157
165
|
page_layouts.append(page_layout)
|
|
158
166
|
|
|
159
167
|
page.page_layout = page_layouts
|
|
160
|
-
self.generate_fallback_line_layout_for_page(page)
|
|
161
|
-
self._save_debug_box_to_page(page)
|
|
168
|
+
# self.generate_fallback_line_layout_for_page(page)
|
|
169
|
+
# self._save_debug_box_to_page(page)
|
|
162
170
|
progress.advance(1)
|
|
163
|
-
|
|
171
|
+
with ThreadPoolExecutor(max_workers=os.cpu_count()) as executor:
|
|
172
|
+
for page in docs.page:
|
|
173
|
+
executor.submit(
|
|
174
|
+
self.generate_fallback_line_layout_for_page, page, progress
|
|
175
|
+
)
|
|
164
176
|
return docs
|
|
165
177
|
|
|
166
|
-
def generate_fallback_line_layout_for_page(self, page: il_version_1.Page):
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
178
|
+
def generate_fallback_line_layout_for_page(self, page: il_version_1.Page, progress):
|
|
179
|
+
try:
|
|
180
|
+
exists_page_layouts = page.page_layout
|
|
181
|
+
char_boxes = babeldoc.format.pdf.document_il.utils.extract_char.convert_page_to_char_boxes(
|
|
182
|
+
page
|
|
183
|
+
)
|
|
184
|
+
if not char_boxes:
|
|
185
|
+
return
|
|
173
186
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
)
|
|
177
|
-
for cluster in clusters:
|
|
178
|
-
boxes = [c[0] for c in cluster.chars]
|
|
179
|
-
min_x = min(b.x for b in boxes)
|
|
180
|
-
max_x = max(b.x2 for b in boxes)
|
|
181
|
-
min_y = min(b.y for b in boxes)
|
|
182
|
-
max_y = max(b.y2 for b in boxes)
|
|
183
|
-
cluster.chars = il_version_1.Box(min_x, min_y, max_x, max_y)
|
|
184
|
-
page_layout = il_version_1.PageLayout(
|
|
185
|
-
id=len(exists_page_layouts) + 1,
|
|
186
|
-
box=il_version_1.Box(
|
|
187
|
-
min_x,
|
|
188
|
-
min_y,
|
|
189
|
-
max_x,
|
|
190
|
-
max_y,
|
|
191
|
-
),
|
|
192
|
-
conf=1,
|
|
193
|
-
class_name="fallback_line",
|
|
187
|
+
clusters = babeldoc.format.pdf.document_il.utils.extract_char.process_page_chars_to_lines(
|
|
188
|
+
char_boxes
|
|
194
189
|
)
|
|
195
|
-
|
|
190
|
+
for cluster in clusters:
|
|
191
|
+
boxes = [c[0] for c in cluster.chars]
|
|
192
|
+
min_x = min(b.x for b in boxes)
|
|
193
|
+
max_x = max(b.x2 for b in boxes)
|
|
194
|
+
min_y = min(b.y for b in boxes)
|
|
195
|
+
max_y = max(b.y2 for b in boxes)
|
|
196
|
+
cluster.chars = il_version_1.Box(min_x, min_y, max_x, max_y)
|
|
197
|
+
page_layout = il_version_1.PageLayout(
|
|
198
|
+
id=len(exists_page_layouts) + 1,
|
|
199
|
+
box=il_version_1.Box(
|
|
200
|
+
min_x,
|
|
201
|
+
min_y,
|
|
202
|
+
max_x,
|
|
203
|
+
max_y,
|
|
204
|
+
),
|
|
205
|
+
conf=1,
|
|
206
|
+
class_name="fallback_line",
|
|
207
|
+
)
|
|
208
|
+
exists_page_layouts.append(page_layout)
|
|
209
|
+
self._save_debug_box_to_page(page)
|
|
210
|
+
finally:
|
|
211
|
+
progress.advance(1)
|
{babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/styles_and_formulas.py
RENAMED
|
@@ -462,11 +462,17 @@ class StylesAndFormulas:
|
|
|
462
462
|
line.pdf_character[i + 1] if i < len(line.pdf_character) - 1 else None
|
|
463
463
|
)
|
|
464
464
|
isspace = char.char_unicode.isspace() if char.char_unicode else False
|
|
465
|
+
prev_is_space = (
|
|
466
|
+
previous_char.char_unicode.isspace()
|
|
467
|
+
if previous_char and previous_char.char_unicode
|
|
468
|
+
else False
|
|
469
|
+
)
|
|
465
470
|
|
|
466
471
|
is_corner_mark = (
|
|
467
472
|
(
|
|
468
473
|
previous_char is not None
|
|
469
474
|
and not isspace
|
|
475
|
+
and not prev_is_space
|
|
470
476
|
and not first_is_bullet
|
|
471
477
|
# 角标字体,有 0.76 的角标和 0.799 的大写,这里用 0.79 取中,同时考虑首字母放大的情况
|
|
472
478
|
and char.pdf_style.font_size
|
|
@@ -476,6 +482,7 @@ class StylesAndFormulas:
|
|
|
476
482
|
or (
|
|
477
483
|
previous_char is not None
|
|
478
484
|
and not isspace
|
|
485
|
+
and not prev_is_space
|
|
479
486
|
and not first_is_bullet
|
|
480
487
|
# 角标字体,有 0.76 的角标和 0.799 的大写,这里用 0.79 取中,同时考虑首字母放大的情况
|
|
481
488
|
and char.pdf_style.font_size
|
|
@@ -487,6 +494,7 @@ class StylesAndFormulas:
|
|
|
487
494
|
previous_char is None
|
|
488
495
|
and next_char is not None
|
|
489
496
|
and not isspace
|
|
497
|
+
and not prev_is_space
|
|
490
498
|
and not first_is_bullet
|
|
491
499
|
# 当前字符字体大小明显小于下一个字符,判定为角标
|
|
492
500
|
and char.pdf_style.font_size < next_char.pdf_style.font_size * 0.79
|
|
@@ -11,6 +11,7 @@ from sklearn.cluster import DBSCAN
|
|
|
11
11
|
|
|
12
12
|
import babeldoc.format.pdf.high_level
|
|
13
13
|
import babeldoc.format.pdf.translation_config
|
|
14
|
+
from babeldoc.const import get_process_pool
|
|
14
15
|
from babeldoc.format.pdf.document_il import il_version_1
|
|
15
16
|
|
|
16
17
|
logger = logging.getLogger(__name__)
|
|
@@ -571,6 +572,15 @@ def _merge_lines_on_page(page_lines: list[Line]) -> list[Line]:
|
|
|
571
572
|
|
|
572
573
|
def process_page_chars_to_lines(
|
|
573
574
|
chars: list[tuple[il_version_1.Box, str, bool]],
|
|
575
|
+
) -> list[Line]:
|
|
576
|
+
pool = get_process_pool()
|
|
577
|
+
if pool is None:
|
|
578
|
+
return process_page_chars_to_lines_internal(chars)
|
|
579
|
+
return pool.apply(process_page_chars_to_lines_internal, (chars,))
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
def process_page_chars_to_lines_internal(
|
|
583
|
+
chars: list[tuple[il_version_1.Box, str, bool]],
|
|
574
584
|
) -> list[Line]:
|
|
575
585
|
"""
|
|
576
586
|
Process characters on a single page to cluster them into lines.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pymupdf
|
|
3
|
+
|
|
4
|
+
from babeldoc.const import get_process_pool
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_no_rotation_img(page: pymupdf.Page, dpi: int = 72) -> pymupdf.Pixmap:
|
|
8
|
+
# return page.get_pixmap(dpi=72)
|
|
9
|
+
original_rotation = page.rotation
|
|
10
|
+
page.set_rotation(0)
|
|
11
|
+
pix = page.get_pixmap(dpi=dpi)
|
|
12
|
+
page.set_rotation(original_rotation)
|
|
13
|
+
return pix
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_no_rotation_img_multiprocess_internal(
|
|
17
|
+
pdf_bytes: str, pagenum: int, dpi: int = 72
|
|
18
|
+
) -> np.ndarray:
|
|
19
|
+
# return page.get_pixmap(dpi=72)
|
|
20
|
+
doc = pymupdf.open(pdf_bytes)
|
|
21
|
+
try:
|
|
22
|
+
page = doc[pagenum]
|
|
23
|
+
original_rotation = page.rotation
|
|
24
|
+
page.set_rotation(0)
|
|
25
|
+
pix = page.get_pixmap(dpi=dpi)
|
|
26
|
+
page.set_rotation(original_rotation)
|
|
27
|
+
return np.frombuffer(pix.samples, np.uint8).reshape(
|
|
28
|
+
pix.height,
|
|
29
|
+
pix.width,
|
|
30
|
+
3,
|
|
31
|
+
)[:, :, ::-1]
|
|
32
|
+
finally:
|
|
33
|
+
doc.close()
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def get_no_rotation_img_multiprocess(pdf_bytes: str, pagenum: int, dpi: int = 72):
|
|
37
|
+
pool = get_process_pool()
|
|
38
|
+
if pool is None:
|
|
39
|
+
return get_no_rotation_img_multiprocess_internal(pdf_bytes, pagenum, dpi)
|
|
40
|
+
return pool.apply(
|
|
41
|
+
get_no_rotation_img_multiprocess_internal, (pdf_bytes, pagenum, dpi)
|
|
42
|
+
)
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
|
+
import multiprocessing as mp
|
|
3
4
|
import queue
|
|
5
|
+
import random
|
|
6
|
+
import sys
|
|
4
7
|
from pathlib import Path
|
|
5
8
|
from typing import Any
|
|
6
9
|
|
|
@@ -15,6 +18,7 @@ from rich.progress import TimeRemainingColumn
|
|
|
15
18
|
|
|
16
19
|
import babeldoc.assets.assets
|
|
17
20
|
import babeldoc.format.pdf.high_level
|
|
21
|
+
from babeldoc.const import enable_process_pool
|
|
18
22
|
from babeldoc.format.pdf.translation_config import TranslationConfig
|
|
19
23
|
from babeldoc.format.pdf.translation_config import WatermarkOutputMode
|
|
20
24
|
from babeldoc.glossary import Glossary
|
|
@@ -22,7 +26,7 @@ from babeldoc.translator.translator import OpenAITranslator
|
|
|
22
26
|
from babeldoc.translator.translator import set_translate_rate_limiter
|
|
23
27
|
|
|
24
28
|
logger = logging.getLogger(__name__)
|
|
25
|
-
__version__ = "0.5.
|
|
29
|
+
__version__ = "0.5.12"
|
|
26
30
|
|
|
27
31
|
|
|
28
32
|
def create_parser():
|
|
@@ -103,6 +107,11 @@ def create_parser():
|
|
|
103
107
|
default=None,
|
|
104
108
|
help="Extra data for metadata",
|
|
105
109
|
)
|
|
110
|
+
parser.add_argument(
|
|
111
|
+
"--enable-process-pool",
|
|
112
|
+
action="store_true",
|
|
113
|
+
help="DEBUG ONLY",
|
|
114
|
+
)
|
|
106
115
|
# translation option argument group
|
|
107
116
|
translation_group = parser.add_argument_group(
|
|
108
117
|
"Translation",
|
|
@@ -460,6 +469,9 @@ async def main():
|
|
|
460
469
|
if args.openai and not args.openai_api_key:
|
|
461
470
|
parser.error("使用 OpenAI 服务时必须提供 API key")
|
|
462
471
|
|
|
472
|
+
if args.enable_process_pool:
|
|
473
|
+
enable_process_pool()
|
|
474
|
+
|
|
463
475
|
# 实例化翻译器
|
|
464
476
|
if args.openai:
|
|
465
477
|
translator = OpenAITranslator(
|
|
@@ -688,7 +700,9 @@ async def main():
|
|
|
688
700
|
|
|
689
701
|
getattr(doc_layout_model, "init_font_mapper", nop)(config)
|
|
690
702
|
# Create progress handler
|
|
691
|
-
progress_context, progress_handler = create_progress_handler(
|
|
703
|
+
progress_context, progress_handler = create_progress_handler(
|
|
704
|
+
config, show_log=False
|
|
705
|
+
)
|
|
692
706
|
|
|
693
707
|
# 开始翻译
|
|
694
708
|
with progress_context:
|
|
@@ -725,7 +739,9 @@ async def main():
|
|
|
725
739
|
)
|
|
726
740
|
|
|
727
741
|
|
|
728
|
-
def create_progress_handler(
|
|
742
|
+
def create_progress_handler(
|
|
743
|
+
translation_config: TranslationConfig, show_log: bool = False
|
|
744
|
+
):
|
|
729
745
|
"""Create a progress handler function based on the configuration.
|
|
730
746
|
|
|
731
747
|
Args:
|
|
@@ -748,6 +764,8 @@ def create_progress_handler(translation_config: TranslationConfig):
|
|
|
748
764
|
stage_tasks = {}
|
|
749
765
|
|
|
750
766
|
def progress_handler(event):
|
|
767
|
+
if show_log and random.random() <= 0.1: # noqa: S311
|
|
768
|
+
logger.info(event)
|
|
751
769
|
if event["type"] == "progress_start":
|
|
752
770
|
if event["stage"] not in stage_tasks:
|
|
753
771
|
stage_tasks[event["stage"]] = progress.add_task(
|
|
@@ -876,4 +894,8 @@ def cli():
|
|
|
876
894
|
|
|
877
895
|
|
|
878
896
|
if __name__ == "__main__":
|
|
897
|
+
if sys.platform == "darwin" or sys.platform == "win32":
|
|
898
|
+
mp.set_start_method("spawn")
|
|
899
|
+
else:
|
|
900
|
+
mp.set_start_method("forkserver")
|
|
879
901
|
cli()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "BabelDOC"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.12"
|
|
4
4
|
description = "Yet Another Document Translator"
|
|
5
5
|
license = "AGPL-3.0"
|
|
6
6
|
readme = "README.md"
|
|
@@ -162,7 +162,7 @@ pythonpath = [".", "src"]
|
|
|
162
162
|
testpaths = ["tests"]
|
|
163
163
|
|
|
164
164
|
[bumpver]
|
|
165
|
-
current_version = "0.5.
|
|
165
|
+
current_version = "0.5.12"
|
|
166
166
|
version_pattern = "MAJOR.MINOR.PATCH[.PYTAGNUM]"
|
|
167
167
|
|
|
168
168
|
[bumpver.file_patterns]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.5.11"
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import pymupdf
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def get_no_rotation_img(page: pymupdf.Page, dpi: int = 72) -> pymupdf.Pixmap:
|
|
5
|
-
# return page.get_pixmap(dpi=72)
|
|
6
|
-
original_rotation = page.rotation
|
|
7
|
-
page.set_rotation(0)
|
|
8
|
-
pix = page.get_pixmap(dpi=dpi)
|
|
9
|
-
page.set_rotation(original_rotation)
|
|
10
|
-
return pix
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/add_debug_information.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/il_translator_llm_only.py
RENAMED
|
File without changes
|
{babeldoc-0.5.11 → babeldoc-0.5.12}/babeldoc/format/pdf/document_il/midend/paragraph_finder.py
RENAMED
|
File without changes
|