File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1- import io
21import json
32import re
43from typing import Any , cast
54
65import google .generativeai as genai
76import pandas as pd # type: ignore[import-untyped]
8- import pypdf
7+ import pdfplumber
98import streamlit as st
109
1110from levelup import config
2322
2423def extract_text_from_pdf (uploaded_file : Any ) -> str | None :
2524 try :
26- pdf_reader = pypdf .PdfReader (io .BytesIO (uploaded_file .read ()))
27- parts : list [str ] = []
28- for page in pdf_reader .pages :
29- parts .append (page .extract_text () or "" )
30- return "\n " .join (parts ).strip ()
25+ with pdfplumber .open (uploaded_file ) as pdf :
26+ parts = [page .extract_text () or "" for page in pdf .pages ]
27+ text = "\n " .join (parts ).strip ()
28+ return text
3129 except Exception as e :
3230 st .error (f"PDF reading error: { e } " )
3331 return None
Original file line number Diff line number Diff line change @@ -23,14 +23,14 @@ dependencies = [
2323 " metatron>=0.5" ,
2424 " psycopg2-binary>=2.9.11" ,
2525 " pydantic>=2.12.3" ,
26- " pypdf>=6.1.3" ,
2726 " sentry-sdk>=2.43.0" ,
2827 " slowapi>=0.1.9" ,
2928 " sqlalchemy>=2.0.44" ,
3029 " sqlalchemy-utils>=0.42.0" ,
3130 " starlette>=0.49.1" ,
3231 " streamlit>=1.51.0" ,
33- " pytest-mock==3.15.1"
32+ " pytest-mock==3.15.1" ,
33+ " pdfplumber==0.11.8"
3434]
3535
3636[dependency-groups ]
@@ -166,7 +166,6 @@ module = [
166166 " google.generativeai.*" ,
167167 " streamlit.*" ,
168168 " metatron.*" ,
169- " pypdf.*" ,
170169 " chromedriver_autoinstaller.*" ,
171170 " selenium.*" ,
172171 " trafilatura.*" ,
Original file line number Diff line number Diff line change 1- import io
21import os
32import sys
3+ from io import BytesIO
44from unittest .mock import MagicMock
55
66from pytest_mock import MockerFixture
2222
2323
2424def test_extract_text_from_pdf (mocker : MockerFixture ) -> None :
25- """Test extract_text_from_pdf function."""
26- mock_reader = MagicMock ()
2725 mock_page = MagicMock ()
2826 mock_page .extract_text .return_value = "test"
29- mock_reader .pages = [mock_page ]
3027
31- mocker .patch ("levelup.app.pypdf.PdfReader" , return_value = mock_reader )
28+ mock_pdf = MagicMock ()
29+ mock_pdf .pages = [mock_page ]
3230
33- assert extract_text_from_pdf (io .BytesIO (b"test" )) == "test"
31+ mock_open = mocker .patch ("levelup.app.pdfplumber.open" )
32+ mock_open .return_value .__enter__ .return_value = mock_pdf
33+ mock_open .return_value .__exit__ .return_value = False
34+
35+ fake_file = BytesIO (b"%PDF-1.4 fake content" )
36+
37+ text = extract_text_from_pdf (fake_file )
38+
39+ assert text == "test"
40+ mock_open .assert_called_once_with (fake_file )
3441
3542
3643def test_analyzecv_pdf_withllm_success (mocker : MockerFixture ) -> None :
You can’t perform that action at this time.
0 commit comments