A pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files
This report summarizes scanner evidence for py-pdf/pypdf, a Python project with 10,250 GitHub stars. SynthScan examined 90,493 lines of code across 187 source files, recording 1379 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 17.4 (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? 1078 finding(s).
Are imports declared and package/API names verified? 149 finding(s).
Are wrappers, guards, and repeated structures necessary? 1031 finding(s).
Which changes need focused human review? 1379 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 1379 distinct pattern matches across 22 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 | make_release.py | 332 | def get_git_commits_since_tag(git_tag: str) -> list[Change]: | CODE |
| LOW | tests/test_forms.py | 12 | def test_form_button__v_value_should_be_name_object(): | CODE |
| LOW | tests/test_workflows.py | 117 | def test_pdfreader_jpeg_image(): | CODE |
| LOW⚡ | tests/test_workflows.py | 155 | def test_text_extraction_encrypted(): | CODE |
| LOW | tests/test_workflows.py | 268 | def test_transform_compress_identical_objects(): | CODE |
| LOW | tests/test_workflows.py | 573 | def test_get_fields_no_warning(tmp_path, url, name): | CODE |
| LOW | tests/test_workflows.py | 584 | def test_scale_rectangle_indirect_object(): | CODE |
| LOW | tests/test_workflows.py | 695 | def test_image_extraction_strict(): | CODE |
| LOW | tests/test_workflows.py | 888 | def test_tounicode_is_identity(): | CODE |
| LOW | tests/test_workflows.py | 952 | def test_fields_returning_stream(): | CODE |
| LOW | tests/test_workflows.py | 1071 | def test_cr_with_cm_operation(): | CODE |
| LOW | tests/test_workflows.py | 1088 | def remove_trailing_whitespace(text: str) -> str: | CODE |
| LOW | tests/test_workflows.py | 1107 | def test_text_extraction_layout_mode(pdf_path, expected_path): | CODE |
| LOW | tests/test_workflows.py | 1116 | def test_layout_mode_space_vertically(): | CODE |
| LOW | tests/test_workflows.py | 1131 | def test_layout_mode_rotations(rotation, strip_rotated): | CODE |
| LOW | tests/test_workflows.py | 1149 | def test_text_extraction_invalid_mode(): | CODE |
| LOW | tests/test_workflows.py | 1157 | def test_get_page_showing_field(): | CODE |
| LOW⚡ | tests/test_reader.py | 1577 | def test_outline_with_missing_named_destination(): | CODE |
| LOW⚡ | tests/test_reader.py | 1586 | def test_outline_with_empty_action(): | CODE |
| LOW⚡ | tests/test_reader.py | 1595 | def test_outline_with_invalid_destinations(): | CODE |
| LOW⚡ | tests/test_reader.py | 1603 | def test_pdfreader_multiple_definitions(caplog): | CODE |
| LOW⚡ | tests/test_reader.py | 1614 | def test_wrong_password_error(): | CODE |
| LOW⚡ | tests/test_reader.py | 1623 | def test_get_page_number_by_indirect(): | CODE |
| LOW⚡ | tests/test_reader.py | 1629 | def test_corrupted_xref_table(): | CODE |
| LOW | tests/test_reader.py | 382 | def test_startxref_corrupt_trailing_pointer(caplog): | CODE |
| LOW | tests/test_reader.py | 436 | def test_find_previous_startxref_pos_recovery_variants(): | CODE |
| LOW | tests/test_reader.py | 476 | def test_duplicate_eof_markers(caplog, suffix, duplicates, strict): | CODE |
| LOW | tests/test_reader.py | 504 | def test_duplicate_eof_markers_without_startxref(pdf_data): | CODE |
| LOW | tests/test_reader.py | 544 | def test_eof_marker_not_at_line_start( | CODE |
| LOW | tests/test_reader.py | 578 | def test_get_page_of_encrypted_file(pdffile, password, should_fail): | CODE |
| LOW | tests/test_reader.py | 646 | def test_reading_choice_field_without_opt_key(): | CODE |
| LOW | tests/test_reader.py | 704 | def test_read_malformed_header(caplog): | CODE |
| LOW | tests/test_reader.py | 761 | def test_circular_xref_prev_reference(caplog): | CODE |
| LOW | tests/test_reader.py | 1095 | def test_user_access_permissions(): | CODE |
| LOW | tests/test_reader.py | 1160 | def test_convert_to_int_error(): | CODE |
| LOW | tests/test_reader.py | 1186 | def test_extract_text_hello_world(): | CODE |
| LOW | tests/test_reader.py | 1211 | def test_read_not_binary_mode(caplog): | CODE |
| LOW | tests/test_reader.py | 1231 | def test_form_topname_with_and_without_acroform(caplog): | CODE |
| LOW | tests/test_reader.py | 1319 | def test_get_full_qualified_fields(): | CODE |
| LOW | tests/test_reader.py | 1340 | def test_get_fields_read_else_block(): | CODE |
| LOW | tests/test_reader.py | 1373 | def test_get_fields_read_write_report(txt_file_path): | CODE |
| LOW | tests/test_reader.py | 1541 | def test_outline_missing_title(caplog): | CODE |
| LOW | tests/test_reader.py | 1848 | def test_xyz_with_missing_param(): | CODE |
| LOW | tests/test_reader.py | 1916 | def test_context_manager_with_stream(): | CODE |
| LOW | tests/test_reader.py | 2013 | def test_space_in_names_to_continue_processing(caplog): | CODE |
| LOW | tests/test_reader.py | 2059 | def test_unbalanced_brackets_in_dictionary_object(caplog): | CODE |
| LOW | tests/test_reader.py | 2178 | def test_root_object__not_a_dictionary(caplog, root_body): | CODE |
| LOW | tests/test_reader.py | 2208 | def test_negative_startxref_is_treated_as_zero(caplog): | CODE |
| LOW | tests/test_reader.py | 2251 | def test_infinite_loop_for_length_value(): | CODE |
| LOW | tests/test_reader.py | 2264 | def test_trailer_cannot_be_read(): | CODE |
| LOW | tests/test_reader.py | 2288 | def test_read_standard_xref_table__two_whitespace_characters_between_offset_and_generation(): | CODE |
| LOW | tests/test_reader.py | 2298 | def test_read_standard_xref_table__entry_invalid_but_object_found(caplog): | CODE |
| LOW | tests/test_reader.py | 2325 | def test_root_object_recovery_limit(caplog): | CODE |
| LOW | tests/test_reader.py | 2368 | def test_rebuild_xref_table__speed(): | CODE |
| LOW | tests/test_reader.py | 2382 | def test_rebuild_xref_table_with_cross_reference_stream(caplog, strict): | CODE |
| LOW | tests/test_reader.py | 2479 | def test_cache_indirect_object_strict_overwrite_error(): | CODE |
| LOW | tests/test_reader.py | 2487 | def test_objstm_batch_parse_caches_all_objects(): | CODE |
| LOW | tests/test_reader.py | 2501 | def test_objstm_cache_hit_returns_target(): | CODE |
| LOW | tests/test_reader.py | 2516 | def test_objstm_skips_cache_for_overridden_objects(): | CODE |
| LOW | tests/test_reader.py | 2535 | def test_objstm_does_not_cache_stale_objects_from_non_authoritative_stream(): | CODE |
| 815 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | resources/afm_to_dataclass.py | 136 | except KeyError: | CODE |
| HIGH | resources/afm_to_dataclass.py | 163 | except TypeError: | CODE |
| HIGH | tests/test_workflows.py | 264 | except PdfReadWarning: | CODE |
| HIGH | tests/test_reader.py | 711 | except Exception: | CODE |
| HIGH | pypdf/_writer.py | 542 | except Exception: | CODE |
| HIGH | pypdf/_writer.py | 1270 | except AttributeError: | CODE |
| HIGH | pypdf/_writer.py | 386 | except (KeyError, AttributeError): | CODE |
| HIGH | pypdf/_writer.py | 780 | except KeyError: | CODE |
| HIGH | pypdf/_writer.py | 1726 | except AttributeError: | CODE |
| HIGH | pypdf/_writer.py | 2206 | except (TypeError, KeyError): | CODE |
| HIGH | pypdf/_writer.py | 3325 | except Exception: | CODE |
| HIGH | pypdf/_writer.py | 2874 | except KeyError: | CODE |
| HIGH | pypdf/_writer.py | 2913 | except KeyError: | CODE |
| HIGH | pypdf/_writer.py | 3330 | except Exception: | CODE |
| HIGH | pypdf/_writer.py | 2190 | except AttributeError: # pragma: no cover | CODE |
| HIGH | pypdf/_reader.py | 1498 | except Exception: # could be multiple causes | CODE |
| HIGH | pypdf/_reader.py | 1078 | except Exception: | CODE |
| HIGH | pypdf/_reader.py | 1082 | except Exception: | CODE |
| HIGH | pypdf/_page.py | 1281 | except (AssertionError, AttributeError): | CODE |
| HIGH | pypdf/_page.py | 1206 | except ValueError: | CODE |
| HIGH | pypdf/_page.py | 1466 | except KeyError: | CODE |
| HIGH | pypdf/_page.py | 1471 | except AttributeError: | CODE |
| HIGH | pypdf/_page.py | 1848 | except Exception: | CODE |
| HIGH | pypdf/_page.py | 1859 | except Exception: | CODE |
| HIGH | pypdf/_page.py | 1913 | except (AttributeError, TypeError): | CODE |
| HIGH | pypdf/_page.py | 2546 | except Exception: # pragma: no cover | CODE |
| HIGH | pypdf/_page.py | 1086 | except AttributeError: | CODE |
| HIGH | pypdf/_page.py | 1980 | except IndexError: | CODE |
| HIGH | pypdf/_doc_common.py | 1214 | except AttributeError: | CODE |
| HIGH | pypdf/_doc_common.py | 809 | except KeyError: | CODE |
| HIGH | pypdf/filters.py | 144 | except zlib.error: | CODE |
| HIGH | pypdf/_text_extraction/_text_extractor.py | 168 | except OrientationNotFoundError: | CODE |
| HIGH | pypdf/_text_extraction/_text_extractor.py | 309 | except Exception: | CODE |
| HIGH | pypdf/generic/_base.py | 167 | except Exception: | CODE |
| HIGH | pypdf/generic/_base.py | 669 | except UnicodeDecodeError: | CODE |
| HIGH | pypdf/generic/_base.py | 910 | except (ValueError, IndexError): | CODE |
| HIGH | pypdf/generic/_base.py | 934 | except Exception: | CODE |
| HIGH | pypdf/generic/_viewerpref.py | 59 | except AttributeError: | CODE |
| HIGH | pypdf/generic/_viewerpref.py | 85 | except KeyError: | CODE |
| HIGH | pypdf/generic/_font.py | 645 | except AttributeError: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 136 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 317 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 1025 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 1061 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 1328 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 1362 | except Exception: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 238 | except ValueError: | CODE |
| HIGH | pypdf/generic/_data_structures.py | 1666 | except KeyError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/generic/test_font.py | 2 | CODE | |
| LOW | pypdf/__init__.py | 10 | CODE | |
| LOW | pypdf/__init__.py | 10 | CODE | |
| LOW | pypdf/__init__.py | 10 | CODE | |
| LOW | pypdf/__init__.py | 10 | CODE | |
| LOW | pypdf/__init__.py | 12 | CODE | |
| LOW | pypdf/__init__.py | 13 | CODE | |
| LOW | pypdf/__init__.py | 14 | CODE | |
| LOW | pypdf/__init__.py | 14 | CODE | |
| LOW | pypdf/__init__.py | 15 | CODE | |
| LOW | pypdf/__init__.py | 16 | CODE | |
| LOW | pypdf/__init__.py | 18 | CODE | |
| LOW | pypdf/__init__.py | 18 | CODE | |
| LOW | pypdf/__init__.py | 19 | CODE | |
| LOW | pypdf/__init__.py | 20 | CODE | |
| LOW | pypdf/__init__.py | 20 | CODE | |
| LOW | pypdf/__init__.py | 21 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 28 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 28 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 31 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 44 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/_crypt_providers/__init__.py | 56 | CODE | |
| LOW | pypdf/annotations/__init__.py | 14 | CODE | |
| LOW | pypdf/annotations/__init__.py | 14 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 15 | CODE | |
| LOW | pypdf/annotations/__init__.py | 26 | CODE | |
| LOW | pypdf/annotations/__init__.py | 26 | CODE | |
| LOW | pypdf/_text_extraction/_layout_mode/__init__.py | 2 | CODE | |
| 51 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | make_release.py | 364 | Parse the first line of a git commit message. Args: line: The first line of a git commit message. | STRING |
| HIGH | docs/dev/documentation.md | 48 | Example function with PEP 484 type annotations. Args: param1: The first parameter. param2: The sec | STRING |
| HIGH | pypdf/_encryption.py | 788 | Apply the SASLprep profile (RFC 4013) of stringprep (RFC 3454). This normalizes Unicode passwords for PDF 2.0 | STRING |
| HIGH | pypdf/_writer.py | 706 | Append a blank page to this PDF file and return it. If no page size is specified, use the size of the | STRING |
| HIGH | pypdf/_writer.py | 734 | Insert a blank page to this PDF file and return it. If no page size is specified for a dimension, use | STRING |
| HIGH | pypdf/_page.py | 625 | Return a new blank page. If ``width`` or ``height`` is ``None``, try to get the page size from | STRING |
| HIGH | pypdf/filters.py | 185 | Decode data which is flate-encoded. Args: data: Flate-encoded data. decode_parms: | STRING |
| HIGH | pypdf/filters.py | 369 | Decode an ASCII-Hex encoded data stream. Args: data: a str sequence of hexadecimal-encoded v | STRING |
| HIGH | pypdf/filters.py | 435 | Decode a run length encoded data stream. Args: data: a bytes sequence of length/data | STRING |
| HIGH | pypdf/filters.py | 624 | Decompresses data encoded using the Brotli compression method, reproducing the original data. | STRING |
| HIGH | pypdf/filters.py | 669 | Compresses data using the Brotli compression method. Args: data: The data to be compressed | STRING |
| HIGH | pypdf/filters.py | 919 | Decode the stream data based on the specified filters. This function decodes the stream data using the filters | STRING |
| HIGH | …f/_text_extraction/_layout_mode/_text_state_manager.py | 80 | Create a TextStateParams instance to display a text string. Type[bytes] values will be decoded implicit | STRING |
| HIGH | pypdf/generic/_image_xobject.py | 571 | Users need to have the pillow package installed. It's unclear if pypdf will keep this function here, hence it' | STRING |
| HIGH | pypdf/generic/_data_structures.py | 1150 | Try to decode the stream object as an image Args: pillow_parameters: parameters provided t | STRING |
| HIGH | pypdf/generic/_utils.py | 134 | Create a ByteStringObject or a TextStringObject from a string to represent the string. Args: string: T | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | resources/afm_to_dataclass.py | 23 | CODE | |
| LOW | resources/afm_to_dataclass.py | 50 | CODE | |
| LOW | tests/test_workflows.py | 669 | CODE | |
| LOW | tests/test_reader.py | 174 | CODE | |
| LOW | tests/test_reader.py | 191 | CODE | |
| LOW | tests/test_configuration.py | 134 | CODE | |
| LOW | tests/utils.py | 115 | CODE | |
| LOW | tests/generic/test_font.py | 192 | CODE | |
| LOW | pypdf/_page_labels.py | 198 | CODE | |
| LOW | pypdf/_encryption.py | 73 | CODE | |
| LOW | pypdf/_encryption.py | 96 | CODE | |
| LOW | pypdf/_encryption.py | 1045 | CODE | |
| LOW | pypdf/_writer.py | 776 | CODE | |
| LOW | pypdf/_writer.py | 960 | CODE | |
| LOW | pypdf/_writer.py | 1459 | CODE | |
| LOW | pypdf/_writer.py | 1847 | CODE | |
| LOW | pypdf/_writer.py | 2013 | CODE | |
| LOW | pypdf/_writer.py | 2139 | CODE | |
| LOW | pypdf/_writer.py | 2246 | CODE | |
| LOW | pypdf/_writer.py | 2603 | CODE | |
| LOW | pypdf/_writer.py | 2725 | CODE | |
| LOW | pypdf/_writer.py | 2887 | CODE | |
| LOW | pypdf/_writer.py | 3059 | CODE | |
| LOW | pypdf/_writer.py | 3307 | CODE | |
| LOW | pypdf/_reader.py | 365 | CODE | |
| LOW | pypdf/_reader.py | 479 | CODE | |
| LOW | pypdf/_reader.py | 703 | CODE | |
| LOW | pypdf/_reader.py | 968 | CODE | |
| LOW | pypdf/_reader.py | 1104 | CODE | |
| LOW | pypdf/_reader.py | 1239 | CODE | |
| LOW | pypdf/_reader.py | 1428 | CODE | |
| LOW | pypdf/_reader.py | 1511 | CODE | |
| LOW | pypdf/xmp.py | 279 | CODE | |
| LOW | pypdf/xmp.py | 363 | CODE | |
| LOW | pypdf/xmp.py | 637 | CODE | |
| LOW | pypdf/_page.py | 869 | CODE | |
| LOW | pypdf/_page.py | 1015 | CODE | |
| LOW | pypdf/_page.py | 1097 | CODE | |
| LOW | pypdf/_page.py | 1707 | CODE | |
| LOW | pypdf/_page.py | 1866 | CODE | |
| LOW | pypdf/_page.py | 2175 | CODE | |
| LOW | pypdf/_doc_common.py | 485 | CODE | |
| LOW | pypdf/_doc_common.py | 704 | CODE | |
| LOW | pypdf/_doc_common.py | 776 | CODE | |
| LOW | pypdf/_doc_common.py | 851 | CODE | |
| LOW | pypdf/_doc_common.py | 1129 | CODE | |
| LOW | pypdf/_doc_common.py | 1304 | CODE | |
| LOW | pypdf/_doc_common.py | 1399 | CODE | |
| LOW | pypdf/_doc_common.py | 1590 | CODE | |
| LOW | pypdf/_cmap.py | 67 | CODE | |
| LOW | pypdf/_cmap.py | 148 | CODE | |
| LOW | pypdf/_cmap.py | 274 | CODE | |
| LOW | pypdf/_cmap.py | 347 | CODE | |
| LOW | pypdf/filters.py | 105 | CODE | |
| LOW | pypdf/filters.py | 918 | CODE | |
| LOW | pypdf/filters.py | 180 | CODE | |
| LOW | pypdf/filters.py | 278 | CODE | |
| LOW | pypdf/filters.py | 430 | CODE | |
| LOW | pypdf/filters.py | 741 | CODE | |
| LOW | pypdf/filters.py | 840 | CODE | |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | resources/afm_to_dataclass.py | 39 | "# This file is based upon the 14 core AFM files provided by Adobe/Macromedia at\n# " + | CODE |
| MEDIUM | tests/test_generic.py | 1121 | # Create a weak reference to the underlying object to test later | COMMENT |
| MEDIUM | tests/test_generic.py | 1149 | # Create a weak reference to the underlying object to test later | COMMENT |
| MEDIUM | tests/generic/test_data_structures.py | 146 | # Create a single child A as the /First (and /Last) | COMMENT |
| MEDIUM | .github/workflows/release.yaml | 30 | contents: write # Create the actual release. | CODE |
| MEDIUM | pypdf/_writer.py | 901 | # Create a new StreamObject for the new_content_data | COMMENT |
| MEDIUM | pypdf/_writer.py | 914 | # Create a new StreamObject in a new /Contents entry. | COMMENT |
| MEDIUM | pypdf/_writer.py | 2767 | # Create a new PdfReader instance using the stream | COMMENT |
| MEDIUM | pypdf/filters.py | 721 | # Create an alias for the old class name | COMMENT |
| MEDIUM | pypdf/_utils.py | 557 | # The following class has been copied from Django: | COMMENT |
| MEDIUM | pypdf/generic/_files.py | 80 | # Create the file entry (the actual embedded file stream) | COMMENT |
| MEDIUM | pypdf/generic/_files.py | 89 | # Create the filespec dictionary | COMMENT |
| MEDIUM | pypdf/generic/_font.py | 862 | # Create the descendant font object | COMMENT |
| MEDIUM | pypdf/generic/_font.py | 878 | # Create the Type 0 font object | COMMENT |
| MEDIUM | pypdf/generic/_appearance_stream.py | 99 | # Define the rotation matrix | COMMENT |
| MEDIUM | pypdf/generic/_appearance_stream.py | 727 | # Create a default appearance if none was found in the annotation | COMMENT |
| MEDIUM | pypdf/generic/_appearance_stream.py | 809 | # Create the TextStreamAppearance instance | COMMENT |
| MEDIUM | pypdf/generic/_link.py | 28 | # This module contains code used by _writer.py to track links in pages | COMMENT |
| MEDIUM⚡ | pypdf/_codecs/core_font_metrics.py | 1 | # This file is based upon the 14 core AFM files provided by Adobe/Macromedia at | COMMENT |
| MEDIUM | pypdf/_codecs/symbol.py | 10 | # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). No | COMMENT |
| MEDIUM | pypdf/_codecs/_codecs.py | 180 | # The following method has been converted to Python from PDFsharp: | COMMENT |
| MEDIUM | pypdf/_codecs/zapfding.py | 10 | # This file is provided as-is by Unicode, Inc. (The Unicode Consortium). No | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | make_release.py | 104 | except Exception: | CODE |
| LOW | tests/test_reader.py | 711 | except Exception: | CODE |
| LOW | tests/test_page.py | 68 | except Exception: | CODE |
| LOW | docs/user/suppress-warnings.md | 45 | except Exception as exc: | CODE |
| LOW | docs/user/extract-images.md | 69 | except Exception as exception: | CODE |
| LOW | .github/scripts/check_urls.py | 50 | except Exception as exception: | CODE |
| LOW | .github/scripts/check_gh_pages_updates.py | 66 | except Exception as e: | CODE |
| LOW | .github/scripts/check_gh_pages_updates.py | 82 | except Exception as e: | CODE |
| LOW | pypdf/_encryption.py | 1068 | except Exception: | CODE |
| MEDIUM | pypdf/_writer.py | 2381 | def _get_page_layout(self) -> Optional[LayoutType]: | CODE |
| LOW | pypdf/_writer.py | 542 | except Exception: | CODE |
| LOW | pypdf/_writer.py | 611 | except Exception as exc: # pragma: no cover | CODE |
| LOW | pypdf/_writer.py | 3056 | except Exception: | CODE |
| LOW | pypdf/_writer.py | 3325 | except Exception: | CODE |
| LOW | pypdf/_writer.py | 3330 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 251 | except Exception: # to be sure to capture all errors | CODE |
| LOW | pypdf/_reader.py | 511 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1034 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1078 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1082 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1134 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1139 | except Exception as e: | CODE |
| LOW | pypdf/_reader.py | 1187 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1235 | except Exception: | CODE |
| LOW | pypdf/_reader.py | 1498 | except Exception: # could be multiple causes | CODE |
| LOW | pypdf/_page.py | 1848 | except Exception: | CODE |
| LOW | pypdf/_page.py | 1859 | except Exception: | CODE |
| LOW | pypdf/_page.py | 2000 | except Exception as exception: | CODE |
| LOW | pypdf/_page.py | 2546 | except Exception: # pragma: no cover | CODE |
| LOW | pypdf/_doc_common.py | 876 | except Exception as exc: | CODE |
| LOW | pypdf/_doc_common.py | 936 | except Exception as exc: | CODE |
| LOW | pypdf/_cmap.py | 101 | except Exception: | CODE |
| LOW | pypdf/_cmap.py | 114 | except Exception: | CODE |
| LOW | pypdf/_cmap.py | 140 | except Exception: | CODE |
| LOW | pypdf/_cmap.py | 516 | except Exception: | CODE |
| LOW | pypdf/_text_extraction/_text_extractor.py | 253 | except Exception: | CODE |
| LOW | pypdf/_text_extraction/_text_extractor.py | 264 | except Exception: | CODE |
| LOW | pypdf/_text_extraction/_text_extractor.py | 309 | except Exception: | CODE |
| LOW | pypdf/generic/_base.py | 167 | except Exception: | CODE |
| LOW | pypdf/generic/_base.py | 507 | except Exception as e: | CODE |
| LOW | pypdf/generic/_base.py | 934 | except Exception: | CODE |
| LOW | pypdf/generic/_image_xobject.py | 727 | except Exception as exception: | CODE |
| LOW | pypdf/generic/_font.py | 515 | except Exception as exception: | CODE |
| LOW | pypdf/generic/_font.py | 589 | except Exception as exception: | CODE |
| LOW | pypdf/generic/_font.py | 747 | except Exception as exception: # Font file data is corrupt. | CODE |
| LOW⚡ | pypdf/generic/_data_structures.py | 1835 | except Exception: | CODE |
| LOW⚡ | pypdf/generic/_data_structures.py | 1840 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 136 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 317 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 422 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 644 | except Exception as exc: | CODE |
| LOW | pypdf/generic/_data_structures.py | 863 | except Exception: # it means we are inserting in first position | CODE |
| LOW | pypdf/generic/_data_structures.py | 1025 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 1061 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 1328 | except Exception: | CODE |
| LOW | pypdf/generic/_data_structures.py | 1362 | except Exception: | CODE |
| LOW | pypdf/_codecs/__init__.py | 13 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_text_extraction.py | 921 | NameObject("/Type"): NameObject("/Font"), | COMMENT |
| LOW | tests/test_encryption.py | 41 | # qpdf --encrypt "" "asdfzxcv" 40 -- unencrypted.pdf r2-owner-password.pdf | COMMENT |
| LOW | requirements/dev.txt | 1 | # | COMMENT |
| LOW | requirements/dev.txt | 41 | packaging==24.1 | COMMENT |
| LOW | requirements/dev.txt | 61 | # via pytest-cov | COMMENT |
| LOW | requirements/dev.txt | 81 | # via pre-commit | COMMENT |
| LOW | requirements/ci.txt | 1 | # | COMMENT |
| LOW | requirements/ci.txt | 21 | execnet==2.1.1 | COMMENT |
| LOW | requirements/ci.txt | 41 | py-cpuinfo==9.0.0 | COMMENT |
| LOW | requirements/ci.txt | 61 | pytest-timeout==2.3.1 | COMMENT |
| LOW | requirements/ci-3.11.txt | 1 | # | COMMENT |
| LOW | requirements/ci-3.11.txt | 41 | # -r requirements/ci.in | COMMENT |
| LOW | requirements/ci-3.11.txt | 61 | pytest-cov==5.0.0 | COMMENT |
| LOW | requirements/ci-3.11.txt | 81 | # via -r requirements/ci.in | COMMENT |
| LOW | requirements/docs.txt | 1 | # | COMMENT |
| LOW | requirements/docs.txt | 21 | # via requests | COMMENT |
| LOW | requirements/docs.txt | 41 | # via sphinx | COMMENT |
| LOW | docs/conf.py | 141 | # To execute these examples real files need to be read and written. | COMMENT |
| LOW | pypdf/_encryption.py | 1 | # Copyright (c) 2022, exiledkingcc | COMMENT |
| LOW | pypdf/_writer.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/_reader.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/xmp.py | 41 | # It's documented here: https://github.com/adobe/xmp-docs/raw/master/XMPSpecifications/XMPSpecificationPart3.pdf | COMMENT |
| LOW | pypdf/_page.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/_doc_common.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/filters.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/filters.py | 121 | COMMENT | |
| LOW | pypdf/_utils.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/_utils.py | 561 | # Original license: | COMMENT |
| LOW | pypdf/_utils.py | 581 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | COMMENT |
| LOW | pypdf/_crypt_providers/_base.py | 1 | # Copyright (c) 2023, exiledkingcc | COMMENT |
| LOW | pypdf/_crypt_providers/_cryptography.py | 1 | # Copyright (c) 2023, exiledkingcc | COMMENT |
| LOW | pypdf/_crypt_providers/__init__.py | 1 | # Copyright (c) 2023, exiledkingcc | COMMENT |
| LOW | pypdf/_crypt_providers/_pycryptodome.py | 1 | # Copyright (c) 2023, exiledkingcc | COMMENT |
| LOW | pypdf/_crypt_providers/_fallback.py | 1 | # Copyright (c) 2023, exiledkingcc | COMMENT |
| LOW | pypdf/_text_extraction/_text_extractor.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | …pdf/_text_extraction/_layout_mode/_fixed_width_page.py | 161 | bt_group(tj_ops[bt_idx], _text, last_displaced_tx) | COMMENT |
| LOW | pypdf/generic/_base.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/generic/_viewerpref.py | 1 | # Copyright (c) 2023, Pubpub-ZZ | COMMENT |
| LOW | pypdf/generic/__init__.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/generic/_image_inline.py | 1 | # Copyright (c) 2024, pypdf contributors | COMMENT |
| LOW | pypdf/generic/_image_xobject.py | 421 | decode = x_object[ImageAttributes.DECODE] | COMMENT |
| LOW | pypdf/generic/_data_structures.py | 1 | # Copyright (c) 2006, Mathieu Fenniak | COMMENT |
| LOW | pypdf/generic/_link.py | 1 | # All rights reserved. | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 1 | # Generated from https://github.com/adobe-type-tools/agl-aglfn/blob/4036a9ca80a62f64f9de4f7321a9a045ad0ecfd6/glyphlist.t | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 21 | # provided with the distribution. | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 41 | # ----------------------------------------------------------------------------- | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 61 | # 2. Redistributions in binary form must reproduce the above copyright notice, | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 81 | # | COMMENT |
| LOW | pypdf/_codecs/adobe_glyphs.py | 101 | # the rights to use, copy, modify, merge, publish, distribute, and/or sell | COMMENT |
| LOW | pypdf/_codecs/core_font_metrics.py | 1 | # This file is based upon the 14 core AFM files provided by Adobe/Macromedia at | COMMENT |
| LOW | pypdf/_codecs/symbol.py | 1 | # Generated from https://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt | COMMENT |
| LOW | pypdf/_codecs/_codecs.py | 181 | # https://github.com/empira/PDFsharp/blob/5fbf6ed14740bc4e16786816882d32e43af3ff5d/src/foundation/src/PDFsharp/src/P | COMMENT |
| LOW | pypdf/_codecs/zapfding.py | 1 | # Generated from https://www.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/zdingbat.txt | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | make_release.py | 114 | git commit -eF RELEASE_COMMIT_MSG.md && git push | STRING |
| HIGH | make_release.py | 130 | git tag -eF RELEASE_TAG_MSG.md && git push | STRING |
| HIGH | tests/test_reader.py | 2755 | # null, so it is dropped from the page tree and no page remains. | COMMENT |
| HIGH | tests/test_writer.py | 2064 | # "I DO NOT Agree": null, | COMMENT |
| HIGH | tests/test_generic.py | 456 | (b"[null null]", [NullObject(), NullObject()]), | CODE |
| HIGH | tests/test_generic.py | 457 | (b"[null]", [NullObject()]), | CODE |
| HIGH | tests/test_filters.py | 716 | b"/DecodeParms [ null ]" | CODE |
| HIGH | pypdf/_page.py | 2588 | that is called 'FontFilex' (where x is null, 2, or 3), then that fontname is | STRING |
| HIGH | pypdf/generic/_data_structures.py | 280 | # Shortcut for null, as some arrays consist mostly of nulls | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | resources/multicolumn-lorem-ipsum.txt | 1 | Two-Column Document with Lorem Ipsum | CODE |
| LOW | resources/multicolumn-lorem-ipsum.txt | 9 | with Lorem Ipsum text. nas lacinia. Nam ipsum ligula, eleifend at, accum | CODE |
| LOW | resources/multicolumn-lorem-ipsum.txt | 20 | placerat. Integer sapien est, iaculis in, pretium quis, ipsum dolor sit amet, consectetuer adipiscing elit | CODE |
| LOW⚡ | tests/test_workflows.py | 164 | .startswith("Lorem ipsum dolor sit amet") | CODE |
| LOW⚡ | tests/test_workflows.py | 164 | .startswith("Lorem ipsum dolor sit amet") | CODE |
| LOW⚡ | tests/test_cmap.py | 306 | assert "Lorem ipsum dolor sit amet" in reader.pages[0].extract_text() | CODE |
| LOW⚡ | tests/test_cmap.py | 306 | assert "Lorem ipsum dolor sit amet" in reader.pages[0].extract_text() | CODE |
| LOW | tests/test_cmap.py | 332 | assert page.extract_text() == "Lorem ipsum" | CODE |
| LOW⚡ | tests/test_writer.py | 491 | assert "Lorem ipsum dolor sit amet" in extracted_text | CODE |
| LOW⚡ | tests/test_writer.py | 491 | assert "Lorem ipsum dolor sit amet" in extracted_text | CODE |
| LOW | tests/test_xmp.py | 29 | assert xmp.dc_creator == ["John Doe"] | CODE |
| LOW | tests/test_xmp.py | 47 | assert xmp.dc_creator == ["John Doe"] | CODE |
| LOW⚡ | tests/generic/test_data_structures.py | 216 | assert ContentStream(stream=array2, pdf=None).get_data() == b"Lorem ipsum!\nShared stream 0\nShared stream 2\n" | CODE |
| LOW⚡ | tests/generic/test_data_structures.py | 223 | b"Lorem ipsum!\nShared stream 0\nShared stream 1\nShared stream 2\n" | CODE |
| LOW | tests/generic/test_data_structures.py | 189 | stream2.set_data(b"Lorem ipsum!") | CODE |
| LOW⚡ | tests/generic/test_files.py | 114 | assert attachment.content.startswith(b"Hello World!\n\nLorem ipsum dolor sit amet, ") | CODE |
| LOW⚡ | tests/generic/test_files.py | 114 | assert attachment.content.startswith(b"Hello World!\n\nLorem ipsum dolor sit amet, ") | CODE |
| LOW⚡ | tests/generic/test_files.py | 115 | assert attachment.content.endswith(b"\ntakimata sanctus est Lorem ipsum dolor sit amet.\n") | CODE |
| LOW⚡ | tests/generic/test_files.py | 115 | assert attachment.content.endswith(b"\ntakimata sanctus est Lorem ipsum dolor sit amet.\n") | CODE |
| LOW⚡ | tests/generic/test_files.py | 431 | embedded_file.content = "Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 431 | embedded_file.content = "Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 432 | assert embedded_file.content == b"Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 432 | assert embedded_file.content == b"Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 615 | b"Hello World!\n\nLorem ipsum dolor sit amet, consetetur sad" | CODE |
| LOW⚡ | tests/generic/test_files.py | 615 | b"Hello World!\n\nLorem ipsum dolor sit amet, consetetur sad" | CODE |
| LOW⚡ | tests/generic/test_files.py | 620 | b"t Lorem\nipsum dolor sit amet. Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 620 | b"t Lorem\nipsum dolor sit amet. Lorem ipsum dolor sit amet" | CODE |
| LOW⚡ | tests/generic/test_files.py | 625 | b"imata sanctus est Lorem ipsum dolor sit amet.\n" | CODE |
| LOW⚡ | tests/generic/test_files.py | 625 | b"imata sanctus est Lorem ipsum dolor sit amet.\n" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pypdf/_writer.py | 0 | read-only boolean property showing whether this pdf file is encrypted. note that this property, if true, will remain tru | STRING |
| HIGH | pypdf/_reader.py | 0 | read-only boolean property showing whether this pdf file is encrypted. note that this property, if true, will remain tru | STRING |
| HIGH | pypdf/_doc_common.py | 0 | read-only boolean property showing whether this pdf file is encrypted. note that this property, if true, will remain tru | STRING |
| HIGH | pypdf/_writer.py | 0 | integration into jupyter notebooks. this method returns a dictionary that maps a mime-type to its representation. .. see | STRING |
| HIGH | pypdf/_reader.py | 0 | integration into jupyter notebooks. this method returns a dictionary that maps a mime-type to its representation. .. see | STRING |
| HIGH | pypdf/_doc_common.py | 0 | integration into jupyter notebooks. this method returns a dictionary that maps a mime-type to its representation. .. see | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pypdf/_utils.py | 563 | # --------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pypdf/_utils.py | 591 | # --------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pypdf/_codecs/adobe_glyphs.py | 41 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pypdf/_codecs/adobe_glyphs.py | 80 | # ----------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | pypdf/_codecs/core_font_metrics.py | 5 | # ----------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | pypdf/_codecs/core_font_metrics.py | 14 | # ----------------------------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pypdf/_codecs/_codecs.py | 185 | # ------------------------------------------------------------------------- | COMMENT |
| MEDIUM | pypdf/_codecs/_codecs.py | 210 | # -------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pypdf/_writer.py | 583 | def set_need_appearances_writer(self, state: bool = True) -> None: | CODE |
| LOW | pypdf/_writer.py | 2387 | def _set_page_layout(self, layout: Union[NameObject, LayoutType]) -> None: | CODE |
| LOW | pypdf/_writer.py | 2423 | def set_page_layout(self, layout: LayoutType) -> None: | CODE |
| LOW | pypdf/_writer.py | 3160 | def _set_cloned_kids(self, parent_fields: dict[int, DictionaryObject], reader: PdfReader) -> None: | CODE |
| LOW | pypdf/__init__.py | 34 | __all__ = [ | CODE |
| LOW | pypdf/xmp.py | 691 | def _set_single_value(self, namespace: str, name: str, value: Optional[str]) -> None: | CODE |
| LOW | pypdf/xmp.py | 715 | def _set_bag_values(self, namespace: str, name: str, values: Optional[list[str]]) -> None: | CODE |
| LOW | pypdf/xmp.py | 743 | def _set_seq_values(self, namespace: str, name: str, values: Optional[list[str]]) -> None: | CODE |
| LOW | pypdf/xmp.py | 771 | def _set_langalt_values(self, namespace: str, name: str, values: Optional[dict[str, str]]) -> None: | CODE |
| LOW | pypdf/xmp.py | 804 | def _update_stream(self) -> None: | CODE |
| LOW | pypdf/_page.py | 167 | def _set_rectangle(self: Any, name: str, value: Union[RectangleObject, float]) -> None: | CODE |
| LOW | pypdf/_crypt_providers/__init__.py | 68 | __all__ = [ | CODE |
| LOW | pypdf/annotations/__init__.py | 28 | __all__ = [ | CODE |
| LOW | pypdf/_text_extraction/_layout_mode/__init__.py | 10 | __all__ = [ | CODE |
| LOW | …f/_text_extraction/_layout_mode/_text_state_manager.py | 52 | def set_state_param(self, op: bytes, value: Union[float, list[Any]]) -> None: | CODE |
| LOW | …f/_text_extraction/_layout_mode/_text_state_manager.py | 67 | def set_font(self, font: Font, size: float) -> None: | CODE |
| LOW | pypdf/actions/__init__.py | 13 | __all__ = [ | CODE |
| LOW⚡ | pypdf/generic/_viewerpref.py | 65 | def _set_bool(self, key: str, v: bool) -> None: | CODE |
| LOW⚡ | pypdf/generic/_viewerpref.py | 71 | def _set_name(self, key: str, lst: list[str], v: NameObject) -> None: | CODE |
| LOW⚡ | pypdf/generic/_viewerpref.py | 81 | def _set_arr(self, key: str, v: Optional[ArrayObject]) -> None: | CODE |
| LOW | pypdf/generic/_viewerpref.py | 101 | def _set_int(self, key: str, v: int) -> None: | CODE |
| LOW | pypdf/generic/__init__.py | 75 | __all__ = [ | CODE |
| LOW | pypdf/generic/_image_inline.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | pypdf/generic/_data_structures.py | 97 | logger = logging.getLogger(__name__) | CODE |
| LOW | pypdf/generic/_data_structures.py | 1079 | def set_data(self, data: bytes) -> None: | CODE |
| LOW | pypdf/generic/_data_structures.py | 1212 | def set_data(self, data: bytes) -> None: | CODE |
| LOW | pypdf/generic/_data_structures.py | 1554 | def set_data(self, data: bytes) -> None: | CODE |
| LOW | pypdf/_codecs/__init__.py | 49 | __all__ = [ | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_reader.py | 1590 | # outline items (entitled Tables and Figures) utilize an empty action (/A) | COMMENT |
| LOW | pypdf/generic/_image_inline.py | 136 | # Ideally, we could just use plain run-length decoding here, where 80_16 = 128_10 | COMMENT |
| MEDIUM⚡ | pypdf/generic/_data_structures.py | 1833 | try: # Prefer to be more robust not only to null parameters | CODE |
| MEDIUM⚡ | pypdf/generic/_data_structures.py | 1838 | try: # Prefer to be more robust not only to null parameters | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_images.py | 71 | # Check if the images have the same dimensions | COMMENT |
| LOW | tests/test_images.py | 75 | # Check if the color modes are the same | COMMENT |
| LOW | tests/test_writer.py | 618 | # Check if the title was set | COMMENT |
| LOW | tests/test_merger.py | 129 | # Check if outline is correct | COMMENT |
| LOW | tests/bench.py | 101 | # Check if outline is correct | COMMENT |
| LOW | pypdf/_page.py | 768 | # Check if displayed (in content stream) | COMMENT |
| LOW | pypdf/generic/_data_structures.py | 362 | # Check if this is a chain list, we need to loop to prevent recur | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pypdf/generic/_data_structures.py | 1335 | CODE | |
| MEDIUM | pypdf/generic/_data_structures.py | 1336 | CODE | |
| MEDIUM | pypdf/generic/_data_structures.py | 1337 | CODE | |
| MEDIUM | pypdf/generic/_data_structures.py | 1338 | CODE | |
| MEDIUM | pypdf/generic/_data_structures.py | 1339 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/utils.py | 131 | # Step 1: Count number of x- and y-coordinates of rectangles. | COMMENT |
| LOW | tests/utils.py | 154 | # Step 2: Look for texts in rectangles. | COMMENT |
| LOW | tests/utils.py | 168 | # Step 3: Build the list of rows containing list of cell-texts. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/utils.py | 131 | # Step 1: Count number of x- and y-coordinates of rectangles. | COMMENT |
| LOW | tests/utils.py | 154 | # Step 2: Look for texts in rectangles. | COMMENT |
| LOW | tests/utils.py | 168 | # Step 3: Build the list of rows containing list of cell-texts. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pypdf/_writer.py | 200 | CODE | |
| LOW | pypdf/_page.py | 1866 | CODE | |
| LOW | …f/_text_extraction/_layout_mode/_text_state_manager.py | 123 | CODE | |
| LOW | pypdf/generic/_appearance_stream.py | 487 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/generic/test_base.py | 171 | def test_function(stream: StreamType) -> IndirectObject: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pypdf/_page_labels.py | 267 | # When there are no kids, make sure to exit the `while` loop directly | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pypdf/generic/_image_xobject.py | 547 | # TODO: implement mask | COMMENT |