PDF Parser for AI-ready data. Automate PDF accessibility. Open-source.
This report summarizes scanner evidence for opendataloader-project/opendataloader-pdf, a Java project with 29,519 GitHub stars. SynthScan examined 58,793 lines of code across 296 source files, recording 408 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 12.3 (Moderate 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? 227 finding(s).
Are imports declared and package/API names verified? 21 finding(s).
Are wrappers, guards, and repeated structures necessary? 335 finding(s).
Which changes need focused human review? 408 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 408 distinct pattern matches across 16 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 |
|---|---|---|---|---|
| MEDIUM⚡ | verification/ci-verify.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 31 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 57 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 69 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 71 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 90 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 92 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 96 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 98 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 158 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 234 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 236 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 259 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 261 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 321 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 323 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 662 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 670 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 827 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 829 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 838 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 840 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 980 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 982 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 988 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 990 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 999 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1001 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1009 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1011 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1227 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1229 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1239 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1241 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1489 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1491 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1498 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1500 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1507 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1509 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1515 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | verification/ci-verify.py | 1517 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | verification/ci-verify.py | 136 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 138 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 355 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 357 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 376 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 378 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 439 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 455 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 488 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 490 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 512 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 519 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 607 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | verification/ci-verify.py | 614 | # --------------------------------------------------------------------------- | COMMENT |
| 74 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …n/opendataloader-pdf/tests/test_convert_integration.py | 6 | def test_convert_generates_output(input_pdf, output_dir): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 47 | def test_defaults_preserve_prior_behavior(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 56 | def test_disable_ocr_sets_do_ocr_false(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 62 | def test_ocr_engine_tesseract_yields_tesseract_options(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 70 | def test_ocr_engine_rapidocr_yields_rapidocr_options(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 78 | def test_force_full_page_ocr_propagates_to_engine_options(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 86 | def test_ocr_lang_overrides_engine_default(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 94 | def test_psm_is_applied_to_tesseract(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 100 | def test_psm_is_ignored_for_non_tesseract_engines(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 107 | def test_ocr_engine_auto_yields_auto_options(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 115 | def test_unknown_engine_raises_value_error_with_clear_message(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 228 | def test_engine_check_easyocr_always_ok(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 235 | def test_engine_check_auto_always_ok(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 242 | def test_engine_check_unknown_kind_returns_false(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 257 | def test_engine_check_tesseract_missing_binary(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 266 | def test_engine_check_tesseract_present(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 274 | def test_engine_check_tesserocr_missing_package(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 283 | def test_engine_check_rapidocr_missing_package(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 292 | def test_engine_check_rapidocr_missing_onnxruntime(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 374 | def test_no_ocr_no_warning_when_engine_left_default(monkeypatch, caplog): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 382 | def test_no_ocr_warns_when_ocr_lang_set(monkeypatch, caplog): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 389 | def test_no_ocr_warns_when_psm_set(monkeypatch, caplog): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 396 | def test_no_ocr_alone_emits_no_warning(monkeypatch, caplog): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 500 | def test_heading_hierarchy_defaults_off(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 506 | def test_heading_hierarchy_enabled_when_requested(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 516 | def test_heading_hierarchy_keeps_inference_signals_on(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 525 | def test_heading_hierarchy_keeps_parsed_pages_for_style_inference(): | CODE |
| LOW⚡ | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 535 | def test_parsed_pages_not_generated_when_hierarchy_off(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 26 | def _capture_pipeline_options(**kwargs): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 129 | def test_create_converter_rejects_denylisted_engine(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 186 | def test_argparse_no_ocr_and_force_ocr_are_mutually_exclusive(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 194 | def test_argparse_kserve_engine_is_rejected(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 213 | def test_argparse_psm_accepted_as_integer(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 306 | def test_engine_check_ocrmac_off_macos(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 314 | def test_engine_check_ocrmac_on_macos_missing_package(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 352 | def test_no_ocr_warns_when_engine_explicitly_set(monkeypatch, caplog): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 361 | def test_no_ocr_warns_when_engine_explicitly_set_to_easyocr(monkeypatch, caplog): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 409 | def test_main_exits_when_tesseract_binary_missing(monkeypatch, caplog): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 428 | def test_main_skips_engine_check_when_no_ocr(monkeypatch, caplog): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 450 | def test_every_cli_engine_choice_has_a_probe_branch(): | CODE |
| LOW | …dataloader-pdf/tests/test_hybrid_server_ocr_options.py | 478 | def test_converter_restricts_input_to_pdf(): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 32 | def test_partial_success_status(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 45 | def test_partial_success_multiple_failed_pages(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 60 | def test_partial_success_no_page_range_with_total_pages(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 74 | def test_partial_success_no_page_range_fallback(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 86 | def test_success_no_errors_field(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 97 | def test_document_field_present(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 109 | def test_partial_success_first_page_failed_with_page_range(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 120 | def test_partial_success_last_page_failed_with_page_range(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 131 | def test_partial_success_all_pages_failed(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 143 | def test_partial_success_all_pages_failed_with_total_pages(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 156 | def test_failure_status_no_failed_pages_detection(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 168 | def test_partial_success_missing_pages_key(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 184 | def test_std_bad_alloc_errors(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 222 | def test_failed_pages_with_empty_entries_in_pages_dict(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 233 | def test_boundary_pages_detected_via_errors(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 245 | def test_both_strategies_combined(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 260 | def test_overlap_between_gap_and_error_is_deduplicated(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 271 | def test_duplicate_page_in_errors(self): | CODE |
| LOW | …loader-pdf/tests/test_hybrid_server_partial_success.py | 279 | def test_no_page_pattern_errors_falls_back_to_gap(self): | CODE |
| 110 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | …opendataloader/pdf/processors/ParentTreeOrderTest.java | 225 | org.junit.jupiter.api.Assertions.assertEquals(expected, actual, message); | CODE |
| CRITICAL | …g/opendataloader/pdf/processors/DocumentProcessor.java | 649 | // org.verapdf.gf.model.impl.containers.StaticContainers.setFlavour(Collections.singletonList(PDFAFlavour.WCAG_2_ | COMMENT |
| CRITICAL | …g/opendataloader/pdf/processors/DocumentProcessor.java | 788 | org.verapdf.gf.model.impl.containers.StaticContainers.clearAllContainers(); | CODE |
| CRITICAL | …main/java/org/opendataloader/pdf/api/OutputWriter.java | 40 | * org.opendataloader.pdf.processors.DocumentProcessor.extractContents( | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | python/opendataloader-pdf/tests/test_hybrid_server.py | 32 | except ImportError: | CODE |
| HIGH | python/opendataloader-pdf/tests/test_hybrid_server.py | 51 | except ImportError: | CODE |
| HIGH | verification/ci-verify.py | 23 | except AttributeError: | CODE |
| HIGH | skills/odl-pdf/scripts/verify-json.py | 29 | except (AttributeError, OSError): | CODE |
| HIGH | skills/odl-pdf/scripts/quick-eval.py | 30 | except (AttributeError, OSError): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …on/opendataloader-pdf/src/opendataloader_pdf/runner.py | 91 | print("Error running opendataloader-pdf CLI.", file=sys.stderr) | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 329 | except Exception as e: | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 573 | except Exception as e: | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1140 | except Exception as e: | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1391 | except Exception: | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1396 | except Exception as e: | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1532 | except Exception as e: | CODE |
| LOW⚡ | verification/ci-verify.py | 153 | except Exception as exc: | CODE |
| LOW⚡ | verification/ci-verify.py | 229 | except Exception as exc: | CODE |
| LOW⚡ | verification/ci-verify.py | 254 | except Exception as exc: | CODE |
| LOW⚡ | verification/ci-verify.py | 316 | except Exception as exc: | CODE |
| LOW | verification/ci-verify.py | 197 | except Exception as exc: | CODE |
| LOW | verification/ci-verify.py | 213 | except Exception as exc: | CODE |
| LOW | verification/ci-verify.py | 401 | except Exception as exc: | CODE |
| LOW | build-scripts/fetch_shaded_jar.py | 44 | except Exception: | CODE |
| MEDIUM⚡ | build-scripts/set_version.py | 36 | print(f"Error: VERSION file not found at {version_path}") | CODE |
| MEDIUM⚡ | build-scripts/set_version.py | 39 | print(f"Error: Java pom.xml not found at {java_pom_path}") | CODE |
| MEDIUM⚡ | build-scripts/set_version.py | 42 | print(f"Error: Python pyproject.toml not found at {python_pyproject_path}") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 221 | # and timings, so uvicorn's access line would only repeat the request | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 201 | Assertions.assertTrue(chunk1.getIsStrikethroughText(), | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 301 | TextChunk textChunk = new TextChunk(new BoundingBox(0, 10.0, 100.0, 60.0, 120.0), | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 321 | // | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 341 | // TextChunk textChunk = new TextChunk(new BoundingBox(0, 10.0, 100.0, 60.0, 120.0), | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 361 | // | COMMENT |
| LOW | …loader/pdf/processors/TextDecorationProcessorTest.java | 481 | // | COMMENT |
| LOW | …ndataloader/pdf/processors/ParagraphProcessorTest.java | 61 | * {`@code` detectTwoLinesParagraphs}), the right-alignment pass must claim the blocks first, | COMMENT |
| LOW | …g/opendataloader/pdf/processors/DocumentProcessor.java | 381 | HeaderFooterProcessor.processHeadersAndFooters(contents, false); | COMMENT |
| LOW | …endataloader/pdf/processors/ClusterTableProcessor.java | 101 | //// SemanticTextNode semanticTextNode = new SemanticTextNode((TextChunk)chunk); | COMMENT |
| LOW | …pendataloader/pdf/processors/AutoTaggingProcessor.java | 841 | // result is valid for PDF 1.7 tagged-PDF consumers. | COMMENT |
| LOW | …pendataloader/pdf/processors/AutoTaggingProcessor.java | 921 | // children — but it puts the caption's text in the figure's subtree, | COMMENT |
| LOW | …pendataloader/pdf/processors/AutoTaggingProcessor.java | 941 | cosDocument.addChangedObject(figureParent); | COMMENT |
| LOW | …dataloader/pdf/processors/HybridDocumentProcessor.java | 381 | ElementMetadata meta = detached.get(oldId); | COMMENT |
| LOW | …dataloader/pdf/processors/HybridDocumentProcessor.java | 901 | // caption) survives the SemanticPicture → EnrichedImageChunk | COMMENT |
| LOW | …ava/org/opendataloader/pdf/hybrid/TriageProcessor.java | 741 | // Signal 4: Suspicious text patterns (catches borderless tables) | COMMENT |
| LOW | verification/ci-verify.py | 441 | # | COMMENT |
| LOW | verification/ci-verify.py | 741 | COMMENT | |
| LOW | scripts/run-cli.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/bench.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | scripts/preflight.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/build-all.sh | 1 | #!/bin/bash | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 581 | ### What is the best PDF parser for RAG? | COMMENT |
| MEDIUM | README.md | 635 | ### How do I chunk PDFs for RAG? | COMMENT |
| MEDIUM | README.md | 639 | ### How do I cite PDF sources in RAG answers? | COMMENT |
| MEDIUM | examples/python/rag/README.md | 1 | # RAG Examples for OpenDataLoader PDF | COMMENT |
| MEDIUM | skills/odl-pdf/references/integration-examples.md | 68 | ## The RAG handoff — route structured output through a file, then parse it | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | python/opendataloader-pdf/tests/test_hybrid_server.py | 8 | CODE | |
| LOW | python/opendataloader-pdf/tests/test_hybrid_server.py | 38 | CODE | |
| LOW | python/opendataloader-pdf/tests/test_hybrid_server.py | 57 | CODE | |
| LOW | …on/opendataloader-pdf/src/opendataloader_pdf/runner.py | 13 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 645 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1046 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1549 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1170 | CODE | |
| LOW | …r-pdf-core/src/test/resources/generate-cid-test-pdf.py | 53 | CODE | |
| LOW | verification/ci-verify.py | 272 | CODE | |
| LOW | verification/ci-verify.py | 521 | CODE | |
| LOW | verification/ci-verify.py | 831 | CODE | |
| LOW | examples/python/rag/basic_chunking.py | 63 | CODE | |
| LOW | skills/odl-pdf/scripts/verify-json.py | 56 | CODE | |
| LOW | build-scripts/fetch_shaded_jar.py | 19 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | python/opendataloader-pdf/tests/test_hybrid_server.py | 4 | CODE | |
| LOW | …opendataloader-pdf/tests/test_hybrid_server_unicode.py | 10 | CODE | |
| LOW | python/opendataloader-pdf/tests/test_cli_options.py | 3 | CODE | |
| LOW | …n/opendataloader-pdf/src/opendataloader_pdf/wrapper.py | 9 | CODE | |
| LOW | …/opendataloader-pdf/src/opendataloader_pdf/__init__.py | 1 | CODE | |
| LOW | …/opendataloader-pdf/src/opendataloader_pdf/__init__.py | 1 | CODE | |
| LOW | …/opendataloader-pdf/src/opendataloader_pdf/__init__.py | 1 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 79 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 778 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 782 | CODE | |
| LOW | …r-pdf-core/src/test/resources/generate-cid-test-pdf.py | 26 | CODE | |
| LOW | examples/python/batch/batch_processing.py | 16 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/bench.sh | 46 | # Step 1: Build Java if needed | COMMENT |
| LOW⚡ | scripts/bench.sh | 57 | # Step 2: Clone or update bench repo | COMMENT |
| LOW⚡ | scripts/bench.sh | 66 | # Step 3: Find JAR path | COMMENT |
| LOW⚡ | scripts/bench.sh | 73 | # Step 4: Run benchmark with JAR | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/bench.sh | 46 | # Step 1: Build Java if needed | COMMENT |
| LOW⚡ | scripts/bench.sh | 57 | # Step 2: Clone or update bench repo | COMMENT |
| LOW⚡ | scripts/bench.sh | 66 | # Step 3: Find JAR path | COMMENT |
| LOW⚡ | scripts/bench.sh | 73 | # Step 4: Run benchmark with JAR | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | samples/json/lorem.json | 19 | "content" : "Lorem Ipsum" | CODE |
| LOW⚡ | samples/json/lorem.json | 29 | "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW⚡ | samples/json/lorem.json | 29 | "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et | CODE |
| LOW | verification/ci-verify.py | 762 | ("email", "alice.smith@example.org", "email@example.com"), | CODE |
| LOW | node/opendataloader-pdf/test/executeJar.unit.test.ts | 71 | await expect(promise).resolves.toBe('Lorem ipsum dolor'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …n/opendataloader-pdf/src/opendataloader_pdf/wrapper.py | 16 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 887 | CODE | |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 1046 | CODE | |
| LOW | …loader-pdf/src/opendataloader_pdf/convert_generated.py | 12 | CODE | |
| LOW | …ataloader-pdf-mcp/src/opendataloader_pdf_mcp/server.py | 15 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …n/opendataloader-pdf/src/opendataloader_pdf/wrapper.py | 12 | __all__ = ["convert", "run", "run_jar", "main"] | CODE |
| LOW | …/opendataloader-pdf/src/opendataloader_pdf/__init__.py | 3 | __all__ = ["run", "convert", "run_jar"] | CODE |
| LOW | …dataloader-pdf/src/opendataloader_pdf/hybrid_server.py | 239 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/run-cli.sh | 22 | # Check if Java is installed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/bench.sh | 6 | # Usage: | COMMENT |