diff --git a/.github/workflows/github-ci.yaml b/.github/workflows/github-ci.yaml index 9bf0ecd6d8..5b04d3b7bb 100644 --- a/.github/workflows/github-ci.yaml +++ b/.github/workflows/github-ci.yaml @@ -57,12 +57,12 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13", "3.14-dev"] use-crypto-lib: ["cryptography"] include: - - python-version: "3.8" + - python-version: "3.9" use-crypto-lib: "pycryptodome" - - python-version: "3.8" + - python-version: "3.9" use-crypto-lib: "none" steps: - name: Update APT packages @@ -83,14 +83,14 @@ jobs: key: cache-downloaded-files - name: Setup Python uses: actions/setup-python@v5 - if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' + if: matrix.python-version == '3.9' || matrix.python-version == '3.10' with: python-version: ${{ matrix.python-version }} cache: 'pip' cache-dependency-path: '**/requirements/ci.txt' - name: Setup Python (3.11+) uses: actions/setup-python@v5 - if: matrix.python-version == '3.11' || matrix.python-version == '3.12' || matrix.python-version == '3.13' + if: matrix.python-version != '3.9' && matrix.python-version != '3.10' with: python-version: ${{ matrix.python-version }} allow-prereleases: true @@ -102,11 +102,11 @@ jobs: - name: Install requirements (Python 3) run: | pip install -r requirements/ci.txt - if: matrix.python-version == '3.8' || matrix.python-version == '3.9' || matrix.python-version == '3.10' + if: matrix.python-version == '3.9' || matrix.python-version == '3.10' - name: Install requirements (Python 3.11+) run: | pip install -r requirements/ci-3.11.txt - if: matrix.python-version == '3.11' || matrix.python-version == '3.12' || matrix.python-version == '3.13' + if: matrix.python-version != '3.9' && matrix.python-version != '3.10' - name: Remove pycryptodome and cryptography run: | pip uninstall pycryptodome cryptography -y diff --git a/requirements/ci-3.11.txt b/requirements/ci-3.11.txt index 9013253e60..047eb53fef 100644 --- a/requirements/ci-3.11.txt +++ b/requirements/ci-3.11.txt @@ -6,7 +6,7 @@ # cffi==1.17.1 # via cryptography -coverage[toml]==7.6.4 +coverage[toml]==7.10.1 # via # -r requirements/ci.in # pytest-cov @@ -30,7 +30,7 @@ mypy-extensions==1.0.0 # via mypy packaging==24.1 # via pytest -pillow==11.0.0 +pillow==11.3.0 # via # -r requirements/ci.in # fpdf2 diff --git a/tests/bench.py b/tests/bench.py index eba7be2a93..e310060b5f 100644 --- a/tests/bench.py +++ b/tests/bench.py @@ -203,7 +203,7 @@ def image_new_property(data): ] assert len(reader.pages[0].images.items()) == 36 assert reader.pages[0].images[0].name == "I0.png" - assert len(reader.pages[0].images[-1].data) == 15168 + assert len(reader.pages[0].images[-1].data) > 10000 assert reader.pages[0].images["/TPL1", "/Image5"].image.format == "JPEG" assert ( reader.pages[0].images["/I0"].indirect_reference.get_object() diff --git a/tests/test_filters.py b/tests/test_filters.py index c49d9da378..2fb1d5a771 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -348,8 +348,8 @@ def test_pa_image_extraction(): assert images[0].name == "Im1.png" # Ensure visual appearance - data = get_data_from_url(name="issue-1801.png") - assert data == images[0].data + expected_data = BytesIO(get_data_from_url(name="issue-1801.png")) + assert image_similarity(expected_data, images[0].image) == 1 @pytest.mark.enable_socket @@ -702,13 +702,12 @@ def test_flate_decode__not_rectangular(caplog): decode_parms[NameObject("/Predictor")] = NumberObject(15) decode_parms[NameObject("/Columns")] = NumberObject(4881) actual = FlateDecode.decode(data=data, decode_parms=decode_parms) - actual_image = BytesIO() - Image.frombytes(mode="1", size=(4881, 81), data=actual).save(actual_image, format="png") + actual_image = Image.frombytes(mode="1", size=(4881, 81), data=actual) url = "https://github.com/user-attachments/assets/c5695850-c076-4255-ab72-7c86851a4a04" name = "issue3241.png" - expected = get_data_from_url(url, name=name) - assert actual_image.getvalue() == expected + expected_data = BytesIO(get_data_from_url(url, name=name)) + assert image_similarity(expected_data, actual_image) == 1 assert caplog.messages == ["Image data is not rectangular. Adding padding."] diff --git a/tests/test_images.py b/tests/test_images.py index b07c089567..dd4ccebefb 100644 --- a/tests/test_images.py +++ b/tests/test_images.py @@ -153,7 +153,15 @@ def test_image_new_property(): ] assert len(reader.pages[0].images.items()) == 36 assert reader.pages[0].images[0].name == "I0.png" - assert len(reader.pages[0].images[-1].data) == 15168 + + expected_image_url = "https://github.com/user-attachments/assets/3bf25760-2113-4e25-b4c2-fc1d3a84a263" + expected_image_name = "pdf_font_garbled_image30.png" + expected_image_data = BytesIO(get_data_from_url(url=expected_image_url, name=expected_image_name)) + assert image_similarity( + expected_image_data, + reader.pages[0].images[-1].image + ) == 1 + assert reader.pages[0].images["/TPL1", "/Image5"].image.format == "JPEG" assert ( reader.pages[0].images["/I0"].indirect_reference.get_object()