import markdown import time # For small delay in streaming view import view import model def click_generate_btn(props): ( uploaded_template_file, uploaded_reference_file, user_instructions, generate_button_clicked, ) = props if generate_button_clicked: # 새 결과 생성 시 이전 세션 값 초기화 view.st.session_state.pop("last_result_md", None) view.st.session_state.pop("last_docx_data", None) # 1. 입력 유효성 검사 if not uploaded_template_file: view.display_warning("PDF 서식 파일을 업로드하세요.") elif not user_instructions: view.display_warning("작성 지시사항을 입력하세요.") else: # 2. PDF 텍스트 추출 template_text = model.extract_text_from_pdf(uploaded_template_file) reference_text = model.extract_text_from_pdf( uploaded_reference_file ) # Returns None if no file if not template_text: view.display_warning( "PDF 서식 파일에서 텍스트를 추출하지 못했습니다. 파일 내용을 확인해주세요." ) else: # 3. 결과 영역 준비 results_container, results_placeholder = view.display_results_area() # 4. 콘텐츠 생성 (스트리밍) 및 표시 full_response_md = "" error_occurred = False try: with view.display_spinner("보고서/계획서 생성 중..."): for chunk in model.generate_content_from_gemini( template_text, reference_text, user_instructions ): full_response_md += chunk view.update_results_stream( results_placeholder, full_response_md ) time.sleep(0.01) if "오류 발생:" in full_response_md: error_occurred = True # ✅ 결과 저장 view.st.session_state["last_result_md"] = full_response_md except Exception as e: error_occurred = True view.display_error(f"콘텐츠 생성 중 심각한 오류 발생: {e}") full_response_md = f"오류: {e}" # 5. 최종 결과 처리 및 DOCX 생성/다운로드 버튼 표시 if not error_occurred and full_response_md: final_html = markdown.markdown( full_response_md, extensions=["tables", "fenced_code"] ) view.display_final_result(results_placeholder, final_html) title, docx_data = model.markdown_to_docx(full_response_md) if docx_data: # 결과는 유지하면서 다운로드 버튼 표시 view.st.session_state["last_docx_data"] = docx_data view.display_download_button(title, docx_data) else: view.display_warning("결과를 DOCX로 변환하는 데 실패했습니다.") # 결과 복원 # if ( # "last_result_md" in view.st.session_state # and not generate_button_clicked # ): # prev_html = markdown.markdown( # view.st.session_state["last_result_md"], # extensions=["tables", "fenced_code"], # ) # results_container, result_placeholder = view.display_results_area() # view.display_final_result(result_placeholder, prev_html) # if "last_docx_data" in view.st.session_state: # view.display_download_button( # results_container, # view.st.session_state["last_docx_data"], # key="download_button_restored", # )