import streamlit as st import google.generativeai as genai import markdown from docx import Document from bs4 import BeautifulSoup from PyPDF2 import PdfFileReader import tempfile import os # Configure the API key genai.configure(api_key=os.getenv('gemini_api')) # Function to convert PDF to text def pdf_to_text(file): with open(file, 'rb') as f: pdf = PdfFileReader(f) text = "" for page_num in range(pdf.numPages): page = pdf.getPage(page_num) text += page.extract_text() return text # Function to upload file to the Generative AI API def upload_file(file_path): st.write("Uploading file...") text_file = genai.upload_file(path=file_path) st.write(f"Completed upload: {text_file.uri}") return text_file # Function to convert text to Markdown def to_markdown(text): text = text.replace('•', ' *') return textwrap.indent(text, '> ', predicate=lambda _: True) chat_session = None # Function to build the model def build_model(text_file): global chat_session generation_config = { "temperature": 0.2, "top_p": 0.95, "top_k": 64, "max_output_tokens": 8192, "response_mime_type": "text/plain", } model = genai.GenerativeModel( model_name="gemini-1.5-flash", generation_config=generation_config, system_instruction="""Yüklenen belgedeki bilgilere göre Türkçe cevap ver. Eğer sorunun cevabı belgede bulunmuyorsa 'Belgede Cevap Bulunmuyor' yaz. """, ) chat_session = model.start_chat(history=[]) response = chat_session.send_message(["Yüklenen belgeyi bir cümle ile özetle", text_file]) st.markdown(to_markdown(response.text)) # Function to interact with the chat model def chat(prompt): try: response = chat_session.send_message(prompt) markdown_text = to_markdown(response.text) st.markdown(markdown_text) return response.text except ValueError: st.write(response.prompt_feedback) st.write(response.candidates[0].finish_reason) st.write(response.candidates[0].safety_ratings) except Exception as e: st.write("An unexpected error occurred:", e) # Function to generate a report based on questions def generate_report(questions): report_text = "\n## SORULARINIZ VE CEVAPLARI\n" for question in questions: report_text += f"\n## {question}\n" answer = chat(question) report_text += f"\n{answer}\n" return report_text # Function to convert Markdown to HTML def convert_Markdown_to_HTML(report_text): html_text = markdown.markdown(report_text) return html_text # Function to add HTML to a Word document def add_html_to_word(html_text, doc): soup = BeautifulSoup(html_text, 'html.parser') for element in soup: if element.name == 'h1': doc.add_heading(element.get_text(), level=1) elif element.name == 'h2': doc.add_heading(element.get_text(), level=2) elif element.name == 'h3': doc.add_heading(element.get_text(), level=3) elif element.name == 'h4': doc.add_heading(element.get_text(), level=4) elif element.name == 'h5': doc.add_heading(element.get_text(), level=5) elif element.name == 'h6': doc.add_heading(element.get_text(), level=6) elif element.name == 'p': doc.add_paragraph(element.get_text()) elif element.name == 'ul': for li in element.find_all('li'): doc.add_paragraph(li.get_text(), style='List Bullet') elif element.name == 'ol': for li in element.find_all('li'): doc.add_paragraph(li.get_text(), style='List Number') elif element.name: doc.add_paragraph(element.get_text()) # Streamlit interface st.title("REPORT GENERATOR: ASK YOUR QUESTIONS TO A PDF FILE by @drmurataltun") st.write("Upload a PDF to ask questions and get the answers.") uploaded_file = st.file_uploader("Upload PDF", type="pdf") questions_input = st.text_area("Enter Questions", placeholder="Type your questions here, one per line.", height=150) if uploaded_file and questions_input: with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_file.write(uploaded_file.read()) temp_file_path = temp_file.name text_content = pdf_to_text(temp_file_path) text_file = upload_file(temp_file_path) build_model(text_file) questions = questions_input.split("\n") report_text = generate_report(questions) html_text = convert_Markdown_to_HTML(report_text) doc = Document() add_html_to_word(html_text, doc) doc_name = os.path.basename(temp_file_path).replace(".pdf", ".docx") doc_name = "Rapor " + doc_name doc.save(doc_name) st.markdown(report_text) st.write("Document generated successfully!") with open(doc_name, "rb") as file: st.download_button(label="Download Report", data=file, file_name=doc_name) os.remove(temp_file_path) os.remove(doc_name) genai.delete_file(text_file.name)