"""PDF processing functionality.""" import gradio as gr from .pdf_text_extractor import PDFTextExtractor class PDFProcessor: """Handles PDF processing operations.""" def __init__(self): self.extractor = PDFTextExtractor() def process_pdf(self, pdf_file): """Process PDF and extract text, then explanations, then audio, updating UI at each step.""" if pdf_file is None: yield "", "No PDF uploaded", "", None, gr.update(visible=False) return try: # Step 1: Extract text # Show "Extracting text..." message yield "", gr.update(value="Extracting text..."), "", None, gr.update(visible=False) extracted_text, status, images_data = self.extractor.extract_text_from_pdf(pdf_file) if not extracted_text or extracted_text.strip() == "": yield extracted_text, status, "No text available to explain.", None, gr.update(visible=False) return # Show extracted text immediately, explanations/audio loading yield extracted_text, status, gr.update(value="Generating explanations..."), None, gr.update(visible=False) # Step 2: Generate explanations try: explanations = self.extractor.generate_explanations(extracted_text) # Show explanations immediately, update status for audio loading yield extracted_text, gr.update(value="Generating audio..."), explanations, None, gr.update(visible=False) # Step 3: Generate audio try: from .simple_audio_processor import SimpleAudioProcessor # Create simplified audio processor audio_processor = SimpleAudioProcessor() # Generate progress callback for audio processing def audio_progress(progress, desc=""): yield extracted_text, gr.update(value=f"Generating audio: {desc}"), explanations, None, gr.update(visible=False) # Generate audio using the simplified processor audio_result, _ = audio_processor.generate_audio(explanations, progress=audio_progress) # Show everything, update status to complete yield extracted_text, gr.update(value="All steps complete!"), explanations, audio_result, gr.update(visible=True) except Exception as audio_error: # Show explanations, update status with audio error yield extracted_text, gr.update(value=f"Audio generation failed: {str(audio_error)}"), explanations, None, gr.update(visible=False) except Exception as explanation_error: # Show extracted text, but indicate explanation error yield extracted_text, status, f"Error generating explanations: {str(explanation_error)}", None, gr.update(visible=False) except Exception as e: yield "", f"Error processing PDF: {str(e)}", "", None, gr.update(visible=False)