GoogleDriveの指定フォルダからファイルを取得し処理
Google Drive API でフォルダのIDを取得できたので
次にここにpdfファイルを配置して
これを取得しテキストを抽出する
PyPDF2 と pdfminer.six はどちらも PDF ファイルを操作するための Python ライブラリ
PyPDF2 には PDF ファイルの結合、分割、ページの回転、ページの追加・削除など、PDF のページ操作機能が充実
pdfminer.six は PDF を読み取ってテキストデータを抽出することが主目的のため、ページ操作や編集の機能はない
PyPDF2 は比較的軽量で、簡単なテキスト抽出やページ操作には高速に動作しますが、PDFの内容解析が簡易的
pdfminer.six はテキスト抽出においては非常に詳細な処理を行うため、
特に長い PDF や複雑なレイアウトのファイルでは処理時間が長くなる
ということでpdfminer.sixを使いテキストを取り出す
そしてその処理結果を渡すというモジュールを作成する
Google Drive の
School フォルダの ID: ここからpdfファイルを取得し
pdfminer.sixを使ってPDFからテキストを抽出したい
Google Drive の School フォルダの ID:
ここからpdfファイルを取得し pdfminer.sixを使ってPDFからテキストを抽出したい
個人で使うので token.jsonを使ったコードにする
抽出したテキストを処理する関数に渡すようにするため 抽出したテキストをOllamaに送信は不要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | import os from googleapiclient.discovery import build from google.oauth2.credentials import Credentials from googleapiclient.http import MediaIoBaseDownload from pdfminer.high_level import extract_text from io import BytesIO # Google Drive APIの認証 def authenticate_drive(): creds = None if os.path.exists( 'token.json' ): creds = Credentials.from_authorized_user_file( 'token.json' , SCOPES) else : print( "認証トークンが見つかりません。認証を実行してください。" ) return None return build( 'drive' , 'v3' , credentials=creds) # フォルダ内のPDFファイルリストを取得 def list_pdf_files_in_folder(service, folder_id): "" "Google Driveフォルダ内のPDFファイルのリストを取得します" "" query = f "'{folder_id}' in parents and mimeType='application/pdf'" results = service.files().list(q=query, fields= "files(id, name)" ).execute() files = results.get( 'files' , []) return files # Google DriveからPDFファイルをダウンロード def download_pdf_from_drive(service, file_id): "" "Google DriveからPDFファイルをダウンロードし、バイナリデータを返します" "" request = service.files().get_media(fileId=file_id) file_data = BytesIO() downloader = MediaIoBaseDownload(file_data, request) done = False while not done : status, done = downloader.next_chunk() print(f "Download Progress: {int(status.progress() * 100)}%" ) file_data.seek(0) return file_data # PDFからテキストを抽出 def extract_text_from_pdf(pdf_data): "" "PDFファイルデータからテキストを抽出します" "" text = extract_text(pdf_data) return text # テキストを処理する関数 def process_text(text): "" "抽出したテキストを処理します" "" print( "Extracted Text:\n" , text) # テキストの処理ロジックをここに追加します # フォルダ内のPDFを処理 def process_pdfs_in_folder(folder_id): service = authenticate_drive() if not service: return pdf_files = list_pdf_files_in_folder(service, folder_id) if not pdf_files: print( "指定されたフォルダにPDFファイルが見つかりません。" ) return for pdf_file in pdf_files: print(f "Processing file: {pdf_file['name']}" ) pdf_data = download_pdf_from_drive(service, pdf_file[ 'id' ]) pdf_text = extract_text_from_pdf(pdf_data) if pdf_text: process_text(pdf_text) else : print(f "{pdf_file['name']} からテキストを抽出できませんでした。" ) # フォルダIDを指定して処理を開始 folder_id = "" # SchoolフォルダのID process_pdfs_in_folder(folder_id) |
これを
1 | python get_pdf_read.py |
で実行するとかなりの精度で取り出すことができた
次はこれをモジュールにしてollamaに処理結果を渡せるようにする
なおコード解説は
コードの説明
1. authenticate_drive関数: token.jsonを使用してGoogle Drive APIに認証し、Driveサービスを取得
2. list_pdf_files_in_folder関数: 指定したフォルダID内のPDFファイルをリスト化
3. download_pdf_from_drive関数: 各PDFファイルをダウンロードし、バイナリデータを返す
4. extract_text_from_pdf関数: pdfminer.sixを使ってPDFデータからテキストを抽出
5. process_text関数: 抽出したテキストを処理します。ここに任意の処理ロジックを追加
6. process_pdfs_in_folder関数: フォルダ内の全PDFファイルを処理し、各PDFのテキストを抽出後にprocess_text関数に渡す
これで、抽出されたテキストを直接処理する
なおGPTで生成したコードでは
1 |
というスコープだが
これだと認証エラーになる
1 |
で回避可能
これは google カレンダーの時も同様で
1 |
なら認証エラーにならない