chatpdf / app.py
yunuseduran's picture
Update app.py
af7ae1f verified
raw
history blame
3.29 kB
import gradio as gr
import google.generativeai as genai
import os
import PyPDF2
from docx import Document
import markdown
from datetime import datetime
import tempfile
# Gemini API anahtarını ortam değişkeninden al
genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
# PDF metni çıkar
def extract_text_from_pdf(pdf_file):
text = ""
try:
pdf_reader = PyPDF2.PdfReader(pdf_file)
for page in pdf_reader.pages:
text += page.extract_text() or ""
return text
except Exception as e:
return f"Hata: PDF okunamadı. {str(e)}"
# Gemini ile analiz et
def analyze(text, questions):
generation_config = {
"temperature": 0.2,
"top_p": 0.95,
"top_k": 64,
"max_output_tokens": 8192,
}
model = genai.GenerativeModel(
model_name="gemini-1.5-flash",
generation_config=generation_config
)
# Özet çıkar
summary_prompt = f"Aşağıdaki metni özetle:\n\n{text[:15000]}\n\nÖzet:"
summary = model.generate_content(summary_prompt).text
# Soruları cevapla
qna = []
for question in questions:
if question.strip() == "":
continue
prompt = f"Belge:\n{text[:15000]}\n\nSoru: {question}\nCevap:"
answer = model.generate_content(prompt).text
qna.append((question, answer))
return summary, qna
# Word belgesi oluştur
def create_doc(summary, qna):
doc = Document()
doc.add_heading("PDF Raporu", 0)
doc.add_paragraph(f"Oluşturulma Tarihi: {datetime.now().strftime('%d.%m.%Y %H:%M')}")
doc.add_heading("Özet", level=1)
doc.add_paragraph(summary)
doc.add_heading("Soru-Cevap", level=1)
for i, (question, answer) in enumerate(qna, 1):
doc.add_heading(f"Soru {i}: {question}", level=2)
doc.add_paragraph(answer)
temp_dir = tempfile.gettempdir()
file_path = os.path.join(temp_dir, f"rapor_{datetime.now().strftime('%Y%m%d%H%M%S')}.docx")
doc.save(file_path)
return file_path
# Gradio fonksiyonu
def process(pdf_file, questions_text):
text = extract_text_from_pdf(pdf_file)
if text.startswith("Hata"):
return text, None
questions = questions_text.strip().split("\n")
summary, qna = analyze(text, questions)
html_output = f"""
<h2>Özet</h2><p>{markdown.markdown(summary)}</p>
<h2>Soru ve Cevaplar</h2>
"""
for i, (q, a) in enumerate(qna, 1):
html_output += f"<b>Soru {i}:</b> {q}<br><b>Cevap:</b> {a}<br><br>"
doc_path = create_doc(summary, qna)
return html_output, doc_path
default_questions = """Belgenin ana konusu nedir?
Belgedeki önemli bulgular nelerdir?
Yazarlar kimlerdir?
Belge hangi tarihte yayınlanmıştır?"""
# Gradio Arayüzü
demo = gr.Interface(
fn=process,
inputs=[
gr.File(label="PDF Yükle", file_types=[".pdf"]),
gr.Textbox(label="Sorular (her satıra bir soru)", value=default_questions, lines=6)
],
outputs=[
gr.HTML(label="Cevaplar"),
gr.File(label="Word Raporu")
],
title="📄 PDF'ten Soru-Cevap ve Word Raporu",
description="Gemini API kullanarak PDF içeriğinden sorulara cevap verir ve rapor hazırlar.",
allow_flagging="never"
)
if __name__ == "__main__":
demo.launch(share=True)