tomo2chin2 commited on
Commit
b9aa4f2
·
verified ·
1 Parent(s): dd6c350

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -31
app.py CHANGED
@@ -7,50 +7,55 @@ import tempfile
7
  import base64
8
  from concurrent.futures import ThreadPoolExecutor
9
 
10
- # Gemini APIの設定
11
- GOOGLE_API_KEY = "あなたのGemini APIキーをここに入力"
 
 
12
  genai.configure(api_key=GOOGLE_API_KEY)
13
 
 
14
  def split_pdf(pdf_path, output_dir, pages_per_chunk=5):
15
  """PDFを指定ページ数ごとに分割する関数"""
16
  pdf_document = fitz.open(pdf_path)
17
  total_pages = len(pdf_document)
18
-
19
  split_pdfs = []
20
-
21
  for start_page in range(0, total_pages, pages_per_chunk):
22
  end_page = min(start_page + pages_per_chunk - 1, total_pages - 1)
23
-
24
  # 新しいPDFドキュメントを作成
25
  output_pdf = fitz.open()
26
-
27
  # 指定範囲のページを新しいPDFに追加
28
  for page_num in range(start_page, end_page + 1):
29
  output_pdf.insert_pdf(pdf_document, from_page=page_num, to_page=page_num)
30
-
31
  # 分割したPDFを保存
32
  output_path = os.path.join(output_dir, f"split_{start_page+1}_to_{end_page+1}.pdf")
33
  output_pdf.save(output_path)
34
  output_pdf.close()
35
-
36
  split_pdfs.append(output_path)
37
-
38
  pdf_document.close()
39
  return split_pdfs
40
 
 
41
  def encode_pdf_to_base64(pdf_path):
42
  """PDFファイルをbase64エンコードする関数"""
43
  with open(pdf_path, "rb") as pdf_file:
44
  return base64.b64encode(pdf_file.read()).decode('utf-8')
45
 
 
46
  def ocr_pdf_with_gemini(pdf_path):
47
  """GeminiモデルでPDFをOCRしてマークダウンに変換する関数"""
48
  # PDFをbase64エンコード
49
  pdf_base64 = encode_pdf_to_base64(pdf_path)
50
-
51
  # Geminiモデルの設定
52
- model = genai.GenerativeModel('gemini-2.0-flash')
53
-
54
  # プロンプトの設定
55
  prompt = """
56
  このPDFに含まれるテキストをOCRで読み取り、整形されたマークダウン形式に変換してください。
@@ -62,15 +67,19 @@ def ocr_pdf_with_gemini(pdf_path):
62
  - 余分な改行やスペースは整理
63
  - 画像の内容は[画像: 内容の説明]と表記
64
  """
65
-
66
  # PDFをGeminiに送信
67
- response = model.generate_content([
68
- prompt,
69
- {"mime_type": "application/pdf", "data": pdf_base64}
70
- ])
71
-
72
- # 結果を返す
73
- return response.text
 
 
 
 
74
 
75
  def process_pdf(pdf_file):
76
  """PDFファイルを処理するメイン関数"""
@@ -79,45 +88,47 @@ def process_pdf(pdf_file):
79
  # アップロードされたPDFを一時ファイルとして保存
80
  temp_pdf_path = os.path.join(temp_dir, "uploaded.pdf")
81
  with open(temp_pdf_path, "wb") as f:
82
- f.write(pdf_file)
83
-
84
  # PDFを分割
85
  split_pdf_paths = split_pdf(temp_pdf_path, temp_dir)
86
-
87
  # 並列処理でOCR変換
88
  markdown_results = []
89
  with ThreadPoolExecutor() as executor:
90
  markdown_results = list(executor.map(ocr_pdf_with_gemini, split_pdf_paths))
91
-
92
  # 結果を結合
93
  combined_markdown = "\n\n".join(markdown_results)
94
-
95
  return combined_markdown
96
 
 
97
  # Gradioインターフェースの作成
98
  def create_interface():
99
  with gr.Blocks() as demo:
100
  gr.Markdown("# PDF OCR & マークダウン変換ツール")
101
  gr.Markdown("PDFをアップロードすると、OCRでテキストを抽出しマークダウン形式に変換します。")
102
-
103
  with gr.Row():
104
  pdf_input = gr.File(label="PDFファイルをアップロード", file_types=[".pdf"])
105
-
106
  with gr.Row():
107
  convert_btn = gr.Button("変換開始")
108
-
109
  with gr.Row():
110
  markdown_output = gr.Markdown(label="変換結果")
111
-
112
  convert_btn.click(
113
  fn=process_pdf,
114
  inputs=pdf_input,
115
  outputs=markdown_output
116
  )
117
-
118
  return demo
119
 
 
120
  # アプリの起動
121
  if __name__ == "__main__":
122
  demo = create_interface()
123
- demo.launch()
 
7
  import base64
8
  from concurrent.futures import ThreadPoolExecutor
9
 
10
+ # Gemini APIの設定 (環境変数から取得)
11
+ GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY")
12
+ if not GOOGLE_API_KEY:
13
+ raise ValueError("環境変数 'GOOGLE_API_KEY' が設定されていません。")
14
  genai.configure(api_key=GOOGLE_API_KEY)
15
 
16
+
17
  def split_pdf(pdf_path, output_dir, pages_per_chunk=5):
18
  """PDFを指定ページ数ごとに分割する関数"""
19
  pdf_document = fitz.open(pdf_path)
20
  total_pages = len(pdf_document)
21
+
22
  split_pdfs = []
23
+
24
  for start_page in range(0, total_pages, pages_per_chunk):
25
  end_page = min(start_page + pages_per_chunk - 1, total_pages - 1)
26
+
27
  # 新しいPDFドキュメントを作成
28
  output_pdf = fitz.open()
29
+
30
  # 指定範囲のページを新しいPDFに追加
31
  for page_num in range(start_page, end_page + 1):
32
  output_pdf.insert_pdf(pdf_document, from_page=page_num, to_page=page_num)
33
+
34
  # 分割したPDFを保存
35
  output_path = os.path.join(output_dir, f"split_{start_page+1}_to_{end_page+1}.pdf")
36
  output_pdf.save(output_path)
37
  output_pdf.close()
38
+
39
  split_pdfs.append(output_path)
40
+
41
  pdf_document.close()
42
  return split_pdfs
43
 
44
+
45
  def encode_pdf_to_base64(pdf_path):
46
  """PDFファイルをbase64エンコードする関数"""
47
  with open(pdf_path, "rb") as pdf_file:
48
  return base64.b64encode(pdf_file.read()).decode('utf-8')
49
 
50
+
51
  def ocr_pdf_with_gemini(pdf_path):
52
  """GeminiモデルでPDFをOCRしてマークダウンに変換する関数"""
53
  # PDFをbase64エンコード
54
  pdf_base64 = encode_pdf_to_base64(pdf_path)
55
+
56
  # Geminiモデルの設定
57
+ model = genai.GenerativeModel('gemini-1.5-pro') # モデル名を変更
58
+
59
  # プロンプトの設定
60
  prompt = """
61
  このPDFに含まれるテキストをOCRで読み取り、整形されたマークダウン形式に変換してください。
 
67
  - 余分な改行やスペースは整理
68
  - 画像の内容は[画像: 内容の説明]と表記
69
  """
70
+
71
  # PDFをGeminiに送信
72
+ try:
73
+ response = model.generate_content([
74
+ prompt,
75
+ {"mime_type": "application/pdf", "data": pdf_base64}
76
+ ])
77
+ # 結果を返す
78
+ return response.text
79
+ except Exception as e:
80
+ print(f"Error during Gemini API call: {e}") # エラーを出力
81
+ return f"エラーが発生しました: {e}" # ユーザー向けのエラーメッセージ
82
+
83
 
84
  def process_pdf(pdf_file):
85
  """PDFファイルを処理するメイン関数"""
 
88
  # アップロードされたPDFを一時ファイルとして保存
89
  temp_pdf_path = os.path.join(temp_dir, "uploaded.pdf")
90
  with open(temp_pdf_path, "wb") as f:
91
+ f.write(pdf_file.read()) # bytesではなく、.read()で読み込んだ内容を書き込む
92
+
93
  # PDFを分割
94
  split_pdf_paths = split_pdf(temp_pdf_path, temp_dir)
95
+
96
  # 並列処理でOCR変換
97
  markdown_results = []
98
  with ThreadPoolExecutor() as executor:
99
  markdown_results = list(executor.map(ocr_pdf_with_gemini, split_pdf_paths))
100
+
101
  # 結果を結合
102
  combined_markdown = "\n\n".join(markdown_results)
103
+
104
  return combined_markdown
105
 
106
+
107
  # Gradioインターフェースの作成
108
  def create_interface():
109
  with gr.Blocks() as demo:
110
  gr.Markdown("# PDF OCR & マークダウン変換ツール")
111
  gr.Markdown("PDFをアップロードすると、OCRでテキストを抽出しマークダウン形式に変換します。")
112
+
113
  with gr.Row():
114
  pdf_input = gr.File(label="PDFファイルをアップロード", file_types=[".pdf"])
115
+
116
  with gr.Row():
117
  convert_btn = gr.Button("変換開始")
118
+
119
  with gr.Row():
120
  markdown_output = gr.Markdown(label="変換結果")
121
+
122
  convert_btn.click(
123
  fn=process_pdf,
124
  inputs=pdf_input,
125
  outputs=markdown_output
126
  )
127
+
128
  return demo
129
 
130
+
131
  # アプリの起動
132
  if __name__ == "__main__":
133
  demo = create_interface()
134
+ demo.launch()