PDF craft can convert PDF files into various other formats. This project will focus on processing PDF files of scanned books.
This report summarizes scanner evidence for oomol-lab/pdf-craft, a Python project with 6,360 GitHub stars. SynthScan examined 67,981 lines of code across 342 source files, recording 1521 pattern matches distributed across 13 syntactic categories. The legacy adjusted pattern signal is 24.8 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1041 finding(s).
Are imports declared and package/API names verified? 361 finding(s).
Are wrappers, guards, and repeated structures necessary? 1003 finding(s).
Which changes need focused human review? 1521 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1521 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft_tool/runtime.py | 61 | def create_ocr_config_from_env(mode: OCRMode | None = None) -> OCRConfig: | CODE |
| LOW | pdf_craft_tool/cli.py | 746 | def _recording_jev_batch_evaluator(evaluator, output_path: Path): | CODE |
| LOW | pdf_craft_tool/cli.py | 807 | def _resolve_page_repair_profile( | CODE |
| LOW | pdf_craft_tool/cli.py | 824 | def _resolve_translation_profiles(translation: dict[str, Any] | None, output_root: Path) -> dict[str, Any] | None: | CODE |
| LOW | pdf_craft_tool/smoke/runner.py | 394 | def _package_render_selection( | CODE |
| LOW | pdf_craft_tool/smoke/runner.py | 441 | def _xml_translation_transformer(run: SmokeRun, run_path: Path) -> XMLTranslator | None: | CODE |
| LOW | tests/test_furniture_translation.py | 57 | def test_internal_pass_reconciles_toc_and_translates_by_scope(self): | CODE |
| LOW | tests/test_furniture_translation.py | 124 | def test_internal_pass_without_furniture_is_a_valid_no_op(self): | CODE |
| LOW | tests/test_furniture_translation.py | 141 | def test_internal_pass_preserves_variable_folio_position(self): | CODE |
| LOW | tests/test_furniture_translation.py | 172 | def test_internal_pass_translates_only_folio_decoration(self): | CODE |
| LOW | tests/test_furniture_translation.py | 207 | def test_translation_coverage_rejects_unknown_furniture_unit(self): | CODE |
| LOW | tests/test_furniture_translation.py | 221 | def test_toc_section_preserves_supported_number_prefixes(self): | CODE |
| LOW | tests/test_furniture_translation.py | 238 | def test_xml_transformer_keeps_template_and_page_payloads_separate(self): | CODE |
| LOW | tests/test_furniture_translation.py | 259 | def _translated_narrative_extraction(root: Path) -> PDFCraftExtraction: | CODE |
| LOW⚡ | tests/test_parser.py | 66 | def test_html_comment_removal(self): | CODE |
| LOW⚡ | tests/test_parser.py | 71 | def test_processing_instruction_removal(self): | CODE |
| LOW⚡ | tests/test_parser.py | 76 | def test_cdata_section_removal(self): | CODE |
| LOW⚡ | tests/test_parser.py | 86 | def test_gfm_tagfilter_script(self): | CODE |
| LOW⚡ | tests/test_parser.py | 96 | def test_gfm_tagfilter_iframe(self): | CODE |
| LOW⚡ | tests/test_parser.py | 130 | def test_allowed_url_protocol_https(self): | CODE |
| LOW⚡ | tests/test_parser.py | 139 | def test_allowed_url_protocol_http(self): | CODE |
| LOW⚡ | tests/test_parser.py | 148 | def test_allowed_url_protocol_mailto(self): | CODE |
| LOW⚡ | tests/test_parser.py | 157 | def test_allowed_relative_url(self): | CODE |
| LOW⚡ | tests/test_parser.py | 166 | def test_disallowed_url_protocol_javascript(self): | CODE |
| LOW⚡ | tests/test_parser.py | 176 | def test_disallowed_url_protocol_data(self): | CODE |
| LOW | tests/test_parser.py | 43 | def test_inline_tag_with_text(self): | CODE |
| LOW | tests/test_parser.py | 119 | def test_disallowed_attributes_filtered(self): | CODE |
| LOW | tests/test_parser.py | 188 | def test_disallowed_tag_escaped(self): | CODE |
| LOW | tests/test_parser.py | 196 | def test_disallowed_tag_with_allowed_child(self): | CODE |
| LOW | tests/test_parser.py | 235 | def test_blockquote_with_cite(self): | CODE |
| LOW | tests/test_parser.py | 263 | def test_multiple_tags_in_sequence(self): | CODE |
| LOW | tests/test_parser.py | 299 | def test_html_entities_in_attributes(self): | CODE |
| LOW | tests/test_parser.py | 340 | def test_mixed_content_complex(self): | CODE |
| LOW | tests/test_parser.py | 352 | def test_incomplete_tag_treated_as_text(self): | CODE |
| LOW | tests/test_parser.py | 357 | def test_video_tag_with_attributes(self): | CODE |
| LOW | tests/test_parser.py | 385 | def test_multiple_attributes_filtering(self): | CODE |
| LOW | tests/test_parser.py | 401 | def test_case_insensitive_tag_names(self): | CODE |
| LOW | tests/test_parser.py | 433 | def test_single_quoted_attributes(self): | CODE |
| LOW | tests/test_subprocess_lifecycle.py | 133 | async def test_direct_commands_reap_children_after_success_and_failure(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 152 | async def test_direct_async_command_cancellation_reaps_children(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 165 | async def test_pdftotext_success_and_failure_are_reaped(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 191 | async def test_extract_cancellation_reaps_pdftotext_process_tree(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 209 | async def test_qt_patch_success_and_failure_reap_ghostscript(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 231 | async def test_qt_patch_cancellation_reaps_ghostscript_process_tree(self): | STRING |
| LOW | tests/test_subprocess_lifecycle.py | 276 | async def _run_subprocess_sync_async(*command: str) -> tuple[bytes, bytes]: | STRING |
| LOW | tests/test_llm_loop.py | 12 | async def test_retries_with_typed_protocol_and_bounded_history(self): | CODE |
| LOW | tests/test_llm_loop.py | 39 | async def test_preserves_initial_messages_when_history_is_cropped(self): | CODE |
| LOW | tests/test_llm_loop.py | 63 | async def test_reset_history_discards_previous_retry_messages_but_keeps_initial(self): | CODE |
| LOW | tests/test_llm_loop.py | 86 | async def test_max_attempts_is_total_requests_and_transport_errors_propagate(self): | CODE |
| LOW | tests/test_llm_loop.py | 114 | async def test_protocol_callback_exceptions_propagate(self): | CODE |
| LOW⚡ | tests/test_jointer.py | 550 | def test_single_dollar_inline_formula(self): | CODE |
| LOW⚡ | tests/test_jointer.py | 560 | def test_double_dollar_formula(self): | CODE |
| LOW⚡ | tests/test_jointer.py | 570 | def test_parenthesis_inline_formula(self): | CODE |
| LOW⚡ | tests/test_jointer.py | 580 | def test_bracket_display_formula(self): | CODE |
| LOW | tests/test_jointer.py | 19 | def test_equation_with_bracket_notation(self): | CODE |
| LOW | tests/test_jointer.py | 35 | def test_equation_with_double_dollar(self): | CODE |
| LOW | tests/test_jointer.py | 51 | def test_equation_with_parenthesis_notation(self): | CODE |
| LOW | tests/test_jointer.py | 67 | def test_equation_with_single_dollar(self): | CODE |
| LOW | tests/test_jointer.py | 83 | def test_equation_without_title(self): | CODE |
| LOW | tests/test_jointer.py | 99 | def test_equation_without_caption(self): | CODE |
| 809 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft_tool/smoke/page_repair.py | 3 | CODE | |
| LOW | pdf_craft_tool/smoke/__init__.py | 3 | CODE | |
| LOW | pdf_craft_tool/smoke/__init__.py | 3 | CODE | |
| LOW | pdf_craft_tool/smoke/__init__.py | 3 | CODE | |
| LOW | tests/test_anchored_content_translation.py | 5 | CODE | |
| LOW | tests/test_chapter_formula_translation.py | 5 | CODE | |
| LOW | pdf_craft/jev.py | 3 | CODE | |
| LOW | pdf_craft/_windows_process_wrapper.py | 3 | CODE | |
| LOW | pdf_craft/_process_worker.py | 3 | CODE | |
| LOW | pdf_craft/concurrency.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 1 | CODE | |
| LOW | pdf_craft/__init__.py | 1 | CODE | |
| LOW | pdf_craft/__init__.py | 1 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 3 | CODE | |
| LOW | pdf_craft/__init__.py | 15 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 16 | CODE | |
| LOW | pdf_craft/__init__.py | 30 | CODE | |
| LOW | pdf_craft/__init__.py | 30 | CODE | |
| LOW | pdf_craft/__init__.py | 30 | CODE | |
| LOW | pdf_craft/__init__.py | 31 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 32 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| LOW | pdf_craft/__init__.py | 44 | CODE | |
| 265 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | README.md | 87 | api_key="your-api-key", | CODE |
| HIGH | README.md | 106 | api_key="your-api-key", | CODE |
| HIGH | format.template.json | 2 | "key": "<YOUR_API_KEY>", | CODE |
| HIGH | format.template.json | 2 | "key": "<YOUR_API_KEY>", | CODE |
| HIGH | docs/changelog/v1.0.9.md | 55 | key="your-api-key", | CODE |
| HIGH | docs/changelog/v1.0.10.md | 86 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/API_REFERENCE.md | 408 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/API_REFERENCE.md | 475 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/API_REFERENCE.md | 575 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/PDF_TRANSLATION.md | 33 | api_key="your-api-key", | CODE |
| HIGH | docs/zh-CN/EPUB_TRANSLATION.md | 18 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/EPUB_TRANSLATION.md | 92 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/EPUB_TRANSLATION.md | 108 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/EPUB_TRANSLATION.md | 115 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/EPUB_TRANSLATION.md | 187 | key="your-api-key", | CODE |
| HIGH | docs/zh-CN/OCR_BACKENDS.md | 163 | api_key="your-api-key", | CODE |
| HIGH | docs/zh-CN/OCR_BACKENDS.md | 177 | api_key="your-api-key", | CODE |
| HIGH | docs/zh-CN/OCR_BACKENDS.md | 233 | api_key="your-api-key", | CODE |
| HIGH | docs/zh-CN/OCR_BACKENDS.md | 261 | api_key="your-api-key", | CODE |
| HIGH | docs/en/PDF_TRANSLATION.md | 24 | api_key="your-api-key", | CODE |
| HIGH | docs/en/EPUB_TRANSLATION.md | 17 | key="your-api-key", | CODE |
| HIGH | docs/en/EPUB_TRANSLATION.md | 84 | key="your-api-key", | CODE |
| HIGH | docs/en/EPUB_TRANSLATION.md | 132 | key="your-api-key", url="https://example.com/v1", | CODE |
| HIGH | docs/en/EPUB_TRANSLATION.md | 136 | key="your-api-key", url="https://example.com/v1", | CODE |
| HIGH | docs/en/OCR_BACKENDS.md | 48 | api_key="your-api-key", | CODE |
| HIGH | docs/en/OCR_BACKENDS.md | 85 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-ru.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-ko.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-ja.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-de.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-it.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-es.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-zh-TW.md | 84 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-zh-CN.md | 87 | api_key="your-api-key", | CODE |
| HIGH | docs/readmes/README-fr.md | 84 | api_key="your-api-key", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft_tool/smoke/checks.py | 39 | CODE | |
| LOW | tests/test_subprocess_lifecycle.py | 133 | CODE | |
| LOW | tests/test_subprocess_lifecycle.py | 209 | CODE | |
| LOW | tests/test_furniture.py | 83 | CODE | |
| LOW | tests/test_furniture.py | 162 | CODE | |
| LOW | tests/test_failure_fallback_epub.py | 261 | CODE | |
| LOW | tests/test_pcex_translation_layers.py | 215 | CODE | |
| LOW | tests/test_async_api.py | 950 | CODE | |
| LOW | tests/test_vendor_ocr_concurrency.py | 417 | CODE | |
| LOW | tests/test_vendor_ocr_concurrency.py | 464 | CODE | |
| LOW | tests/test_vendor_ocr_concurrency.py | 869 | CODE | |
| LOW | tests/test_vendor_ocr_concurrency.py | 1737 | CODE | |
| LOW | tests/test_vendor_ocr_concurrency.py | 1942 | CODE | |
| LOW | tests/test_pdf_craft_extraction.py | 188 | CODE | |
| LOW | tests/test_pdf_craft_extraction.py | 242 | CODE | |
| LOW | tests/test_pdf_craft_extraction.py | 266 | CODE | |
| LOW | tests/test_pdf_eraser.py | 100 | CODE | |
| LOW | tests/test_pcex_translation_rendering.py | 53 | CODE | |
| LOW | tests/test_pcex_translation_rendering.py | 362 | CODE | |
| LOW | tests/test_pcex_translation_rendering.py | 441 | CODE | |
| LOW | pdf_craft/jev.py | 77 | CODE | |
| LOW | pdf_craft/concurrency.py | 347 | CODE | |
| LOW | pdf_craft/concurrency.py | 362 | CODE | |
| LOW | pdf_craft/concurrency.py | 474 | CODE | |
| LOW | pdf_craft/runtime.py | 369 | CODE | |
| LOW | pdf_craft/expression.py | 23 | CODE | |
| LOW | pdf_craft/expression.py | 36 | CODE | |
| LOW | pdf_craft/expression.py | 51 | CODE | |
| LOW | pdf_craft/expression.py | 68 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 322 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 528 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 710 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 978 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 1310 | CODE | |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 2347 | CODE | |
| LOW | pdf_craft/pipeline/pdf/visual_base.py | 256 | CODE | |
| LOW | pdf_craft/pipeline/pdf/visual_base.py | 385 | CODE | |
| LOW | pdf_craft/pipeline/pdf/pipeline.py | 342 | CODE | |
| LOW | pdf_craft/pipeline/pdf/pipeline.py | 76 | CODE | |
| LOW | pdf_craft/pipeline/pdf/patcher.py | 88 | CODE | |
| LOW | pdf_craft/pipeline/pdf/patcher.py | 283 | CODE | |
| LOW | pdf_craft/pipeline/epub/translation/translator.py | 51 | CODE | |
| LOW | pdf_craft/pipeline/epub/translation/translator.py | 120 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 107 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 382 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 444 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/zip.py | 28 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/spines.py | 10 | CODE | |
| LOW | pdf_craft/pipeline/epub/adapter/math.py | 56 | CODE | |
| LOW | pdf_craft/renderer/epub/anchored.py | 224 | CODE | |
| LOW | pdf_craft/renderer/epub/render.py | 45 | CODE | |
| LOW | pdf_craft/renderer/epub/render.py | 221 | CODE | |
| LOW | pdf_craft/renderer/epub/render.py | 299 | CODE | |
| LOW | pdf_craft/renderer/epub/render.py | 345 | CODE | |
| LOW | pdf_craft/llm/runtime.py | 389 | CODE | |
| LOW | pdf_craft/llm/runtime.py | 162 | CODE | |
| LOW | pdf_craft/markdown/paragraph/render.py | 63 | CODE | |
| LOW | pdf_craft/markdown/paragraph/render.py | 77 | CODE | |
| LOW | pdf_craft/markdown/paragraph/parser.py | 8 | CODE | |
| LOW | pdf_craft/markdown/paragraph/parser.py | 280 | CODE | |
| 83 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | test.py | 26 | except Exception as e: | CODE |
| LOW | pdf_craft_tool/smoke/runner.py | 83 | except Exception: | CODE |
| LOW | pdf_craft_tool/smoke/runner.py | 166 | except Exception as error: # preserve the full failure report for manual inspection | CODE |
| LOW | pdf_craft_tool/smoke/runner.py | 261 | except Exception as error: | CODE |
| LOW | pdf_craft_tool/smoke/checks.py | 218 | except Exception as error: | CODE |
| LOW | pdf_craft/jev.py | 180 | except Exception as error: | CODE |
| LOW | pdf_craft/craft.py | 832 | except Exception: # pylint: disable=broad-exception-caught | CODE |
| LOW | pdf_craft/concurrency.py | 311 | except Exception as error: | CODE |
| LOW | pdf_craft/concurrency.py | 413 | except Exception as error: | CODE |
| LOW | pdf_craft/runtime.py | 58 | except Exception: | CODE |
| LOW | pdf_craft/runtime.py | 290 | except Exception: | CODE |
| LOW | pdf_craft/runtime.py | 320 | except Exception: | CODE |
| LOW | pdf_craft/transform.py | 382 | except Exception as error: # Metadata is optional; extraction must remain usable. | CODE |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 2342 | except Exception as error: | CODE |
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 2423 | except Exception: | CODE |
| LOW | pdf_craft/pipeline/pdf/patcher.py | 188 | except Exception as error: | CODE |
| LOW | pdf_craft/pipeline/pdf/patcher.py | 197 | except Exception as error: | CODE |
| LOW | pdf_craft/pipeline/pdf/patcher.py | 341 | except Exception as error: | CODE |
| LOW | pdf_craft/pipeline/pdf/inline_formula.py | 118 | except Exception: # local TeX packages and individual expressions vary widely. | CODE |
| LOW | pdf_craft/pipeline/epub/translation/xml_interrupter.py | 157 | except Exception: | CODE |
| LOW | pdf_craft/pipeline/epub/translation/translator.py | 281 | except Exception: | CODE |
| MEDIUM | pdf_craft/pipeline/epub/translation/translator.py | 278 | def _get_version() -> str: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/zip.py | 15 | except Exception: | CODE |
| LOW | pdf_craft/llm/guaranteed.py | 83 | except Exception as error: | CODE |
| LOW | pdf_craft/llm/runtime.py | 194 | except Exception as error: | CODE |
| MEDIUM | pdf_craft/llm/runtime.py | 188 | def invoke_once() -> str: | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 177 | except Exception: | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 202 | except Exception: | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 221 | except Exception: | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 282 | except Exception: # Isolated furniture must never discard a pcex translation. | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 318 | except Exception: # A failed decoration must leave its source folio intact. | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 390 | except Exception: # The failed page's fragments are preserved independently. | CODE |
| LOW | pdf_craft/transformer/anchored_translation.py | 128 | except Exception: | CODE |
| LOW | pdf_craft/transformer/anchored_translation.py | 136 | except Exception: | CODE |
| LOW | pdf_craft/transformer/anchored_translation.py | 177 | except Exception: # Individual asset fallback is deliberately resilient. | CODE |
| LOW | pdf_craft/transformer/anchored_translation.py | 186 | except Exception: # A failed asset remains source content. | CODE |
| LOW | pdf_craft/transformer/xml_translator/xml/xml_like.py | 76 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/vendor_ocr.py | 169 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/vendor_ocr.py | 318 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/vendor_ocr.py | 944 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/handler.py | 151 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/handler.py | 162 | except Exception as error: | CODE |
| MEDIUM | pdf_craft/pdf/handler.py | 84 | def metadata(self) -> PDFDocumentMetadata: | CODE |
| LOW | pdf_craft/pdf/page_ref.py | 23 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/page_ref.py | 51 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/page_ref.py | 107 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/page_extractor.py | 216 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 409 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 443 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 463 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 469 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 503 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 518 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 536 | except Exception as error: | CODE |
| LOW | pdf_craft/pdf/ocr.py | 584 | except Exception as error: | CODE |
| LOW | pdf_craft/extractor/toc/llm_analyser.py | 339 | except Exception as e: | CODE |
| LOW | pdf_craft/extractor/toc/llm_analyser.py | 509 | except Exception as e: | CODE |
| LOW | pdf_craft/extractor/toc/llm_analyser.py | 612 | except Exception as error: | CODE |
| LOW | pdf_craft/extractor/chapter/reader.py | 21 | except Exception as e: | CODE |
| LOW | pdf_craft/document/package.py | 1096 | except Exception: | CODE |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pdf_craft/craft.py | 811 | except (ConnectionError, OSError): | CODE |
| HIGH | pdf_craft/craft.py | 799 | except (EOFError, OSError): | CODE |
| HIGH | pdf_craft/concurrency.py | 180 | except ValueError: | CODE |
| HIGH | pdf_craft/concurrency.py | 557 | except asyncio.CancelledError: | CODE |
| HIGH | pdf_craft/runtime.py | 447 | except FileNotFoundError: | CODE |
| HIGH | pdf_craft/runtime.py | 538 | except ProcessLookupError: | CODE |
| HIGH | pdf_craft/pipeline/epub/translation/xml_interrupter.py | 157 | except Exception: | CODE |
| HIGH | pdf_craft/transformer/anchored_translation.py | 128 | except Exception: | CODE |
| HIGH | pdf_craft/transformer/anchored_translation.py | 177 | except Exception: # Individual asset fallback is deliberately resilient. | CODE |
| HIGH | …t/transformer/xml_translator/segment/inline_segment.py | 347 | except ValueError: | CODE |
| HIGH | pdf_craft/transformer/xml_translator/xml/xml_like.py | 133 | except UnicodeDecodeError: | CODE |
| HIGH | pdf_craft/transformer/xml_translator/xml/xml_like.py | 125 | except (LookupError, UnicodeDecodeError): | CODE |
| HIGH | pdf_craft/pdf/handler.py | 138 | except (ValueError, IndexError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 61 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 63 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 84 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 86 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 101 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 103 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 193 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 195 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 214 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 216 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 229 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 231 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 453 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 455 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 530 | # ============================================================================ | COMMENT |
| MEDIUM | pdf_craft/markdown/paragraph/tags.py | 532 | # ============================================================================ | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft_tool/smoke/__init__.py | 5 | __all__ = ["SmokeRun", "expand_matrix", "run_smoke"] | CODE |
| LOW | pdf_craft/pipeline/__init__.py | 3 | __all__ = ["PDFPatcher", "PDFTranslationPipeline"] | CODE |
| LOW | pdf_craft/pipeline/pdf/metadata.py | 38 | def _set_string(result: dict[str, str], key: str, value: Any) -> None: | CODE |
| LOW | pdf_craft/pipeline/pdf/__init__.py | 12 | __all__ = [ | CODE |
| LOW | pdf_craft/pipeline/epub/__init__.py | 5 | __all__ = ["translate", "translate_epub"] | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 88 | def _update_ncx_document_title(root: Element, title: str) -> None: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 192 | def _update_ncx_toc(root: Element, toc_list: list[Toc]) -> None: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 222 | def _update_nav_point_content(nav_point: Element, toc: Toc, ns: str | None, play_order: int) -> None: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 338 | def _update_nav_toc(root: Element, toc_list: list[Toc]) -> None: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 356 | def _update_nav_lis(ol: Element, toc_list: list[Toc], ns: str | None) -> None: | CODE |
| LOW | pdf_craft/pipeline/epub/adapter/toc.py | 382 | def _update_nav_li_content(li: Element, toc: Toc, ns: str | None) -> None: | CODE |
| LOW | pdf_craft/renderer/__init__.py | 5 | __all__ = ["EpubRenderer", "MarkdownRenderer"] | CODE |
| LOW | pdf_craft/renderer/markdown/__init__.py | 4 | __all__ = ["MarkdownRenderer"] | CODE |
| LOW | pdf_craft/renderer/epub/__init__.py | 4 | __all__ = ["EpubRenderer"] | CODE |
| LOW | pdf_craft/renderer/epub/latex_to_text.py | 5 | __all__ = ["latex_to_plain_text"] | CODE |
| LOW | pdf_craft/llm/__init__.py | 10 | __all__ = ["LLM", "LLMContext", "LLMRuntime", "Message", "MessageRole", "runtime_for", | CODE |
| LOW | pdf_craft/transformer/__init__.py | 16 | __all__ = ["AnchoredContent", "AnchoredContentExtractionTransformer", "AnchoredContentTransformer", "AnchoredContentTran | CODE |
| LOW | pdf_craft/transformer/furniture_translation.py | 333 | def _set_optional_attribute(element: Element, name: str, value: str) -> None: | CODE |
| LOW | pdf_craft/transformer/xml_translator/__init__.py | 4 | __all__ = ["FillFailedEvent", "SubmitKind", "TranslationTask", "XMLTranslator", "TranslationEvent", "TranslationEventKin | CODE |
| LOW | pdf_craft/extractor/__init__.py | 4 | __all__ = ["PDFExtractor"] | CODE |
| LOW | pdf_craft/extractor/toc/analysing.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | pdf_craft/extractor/pdf/__init__.py | 4 | __all__ = ["PDFExtractor"] | CODE |
| LOW | pdf_craft/document/__init__.py | 13 | __all__ = [ | CODE |
| LOW | pdf_craft/formula/__init__.py | 5 | __all__ = ["latex_to_plain_text"] | CODE |
| LOW | pdf_craft/sync/__init__.py | 6 | __all__ = ["PDFCraft", "SyncAnchoredContentTransformer"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft/craft.py | 282 | CODE | |
| LOW | pdf_craft/craft.py | 373 | CODE | |
| LOW | pdf_craft/craft.py | 407 | CODE | |
| LOW | pdf_craft/transform.py | 218 | CODE | |
| LOW | pdf_craft/pipeline/epub/translation/translator.py | 51 | CODE | |
| LOW | pdf_craft/renderer/epub/renderer.py | 17 | CODE | |
| LOW | pdf_craft/renderer/epub/renderer.py | 38 | CODE | |
| LOW | …ransformer/xml_translator/xml_translator/translator.py | 141 | CODE | |
| LOW | …ransformer/xml_translator/xml_translator/translator.py | 199 | CODE | |
| LOW | …ransformer/xml_translator/xml_translator/translator.py | 308 | CODE | |
| LOW | pdf_craft/pdf/ocr.py | 102 | CODE | |
| LOW | pdf_craft/pdf/ocr.py | 624 | CODE | |
| LOW | pdf_craft/sync/craft.py | 110 | CODE | |
| LOW | pdf_craft/sync/craft.py | 167 | CODE | |
| LOW | pdf_craft/sync/craft.py | 188 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft/markdown/paragraph/parser.py | 125 | # Check if it's a closing tag | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 147 | # Check if this tag should be filtered by GFM tagfilter | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 152 | # Check if tag is in whitelist | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 170 | # Check if this tag should be filtered by GFM tagfilter | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 175 | # Check if this tag should be ignored (removed but children preserved) | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 194 | # Check if tag is in whitelist | COMMENT |
| LOW | pdf_craft/markdown/paragraph/parser.py | 383 | # Check if attribute is allowed for this tag | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pdf_craft/pipeline/pdf/text_layout.py | 601 | # Test doubles and external subclasses may report a successful | COMMENT |
| LOW | pdf_craft/pipeline/epub/translation/xml_interrupter.py | 101 | block_depth=find_block_depth(parent_stack), | COMMENT |
| LOW | pdf_craft/transformer/xml_translator/xml/xml_like.py | 41 | # attribute, including ones that should remain unprefixed (e.g., <link type="text/css">). | COMMENT |
| LOW | …transformer/xml_translator/xml_translator/submitter.py | 301 | # 需要翻译的文字会被嵌套到两种不同的结构中。 | COMMENT |
| LOW | pdf_craft/extractor/toc/text.py | 1 | import re | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pdf_craft/extractor/metadata.py | 376 | {"name": evidence, "original_name": evidence-or-null, "nationality": evidence-or-null}. | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_pdf_windowed_layout.py | 511 | # retains PDF ActualText wrapping for robust extraction. | COMMENT |
| MEDIUM | pdf_craft/pipeline/pdf/eraser.py | 119 | """Return a robust, hue-preserving RGB median for one source rectangle. | STRING |