Sahana31 commited on
Commit
ae114b0
·
1 Parent(s): 07429a7

add pdf doc

Browse files
Files changed (1) hide show
  1. app.py +199 -0
app.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import tempfile
4
+ import dwani
5
+ import logging
6
+
7
+ # Set up logging
8
+ logging.basicConfig(level=logging.INFO)
9
+ logger = logging.getLogger(__name__)
10
+
11
+ # Configure dwani API settings
12
+ dwani.api_key = os.getenv("DWANI_API_KEY")
13
+ dwani.api_base = os.getenv("DWANI_API_BASE_URL")
14
+
15
+ # Log API configuration for debugging
16
+ logger.debug("DWANI_API_KEY: %s", "Set" if dwani.api_key else "Not set")
17
+ logger.debug("DWANI_API_BASE_URL: %s", dwani.api_base)
18
+
19
+ # Language options for dropdowns
20
+ language_options = [
21
+ ("English", "eng_Latn"),
22
+ ("Kannada", "kan_Knda"),
23
+ ("Hindi", "hin_Deva")
24
+ ]
25
+
26
+ # Create lists for Gradio dropdowns (display names only)
27
+ language_names = [lang[0] for lang in language_options]
28
+
29
+ # Map display names to language codes
30
+ lang_code_map = {lang[0]: lang[1] for lang in language_options}
31
+
32
+
33
+ def parse_page_numbers(pages_str):
34
+ """
35
+ Parse a string of comma-separated page numbers/ranges into a sorted list of unique integers.
36
+ Example inputs:
37
+ "1,3,5"
38
+ "1-3,5"
39
+ """
40
+ pages = set()
41
+ for part in pages_str.split(","):
42
+ part = part.strip()
43
+ if "-" in part:
44
+ try:
45
+ start, end = map(int, part.split("-"))
46
+ if start > end or start < 1:
47
+ continue
48
+ pages.update(range(start, end + 1))
49
+ except ValueError:
50
+ continue
51
+ else:
52
+ try:
53
+ page = int(part)
54
+ if page >= 1:
55
+ pages.add(page)
56
+ except ValueError:
57
+ continue
58
+ return sorted(pages)
59
+
60
+
61
+ def results_to_markdown(results):
62
+ """
63
+ Convert the results dictionary into a Markdown formatted string.
64
+ """
65
+ md_lines = []
66
+ for page, content in results.items():
67
+ md_lines.append(f"## {page}")
68
+ if "error" in content:
69
+ md_lines.append(f"**Error:** {content['error']}")
70
+ else:
71
+ md_lines.append(f"**Original Text:**\n\n``````")
72
+ md_lines.append(f"**Response:**\n\n{content.get('Response', '')}")
73
+ md_lines.append(f"**Processed Page:** {content.get('Processed Page', '')}")
74
+ md_lines.append(f"**Translated Response:**\n\n{content.get('Translated Response', '')}")
75
+ md_lines.append("\n---\n")
76
+ return "\n".join(md_lines)
77
+
78
+
79
+ def process_pdf(pdf_file, pages_str, prompt, src_lang, tgt_lang):
80
+ logger.debug("Received inputs - PDF: %s, Pages: %s, Prompt: %s, Source Lang: %s, Target Lang: %s",
81
+ pdf_file, pages_str, prompt, src_lang, tgt_lang)
82
+
83
+ # Validate inputs
84
+ if not pdf_file:
85
+ logger.error("No PDF file provided")
86
+ return "Error: Please upload a PDF file", None
87
+
88
+ if not prompt.strip():
89
+ logger.error("Prompt is empty")
90
+ return "Error: Please provide a non-empty prompt", None
91
+
92
+ pages = parse_page_numbers(pages_str)
93
+ if not pages:
94
+ logger.error("Invalid or empty page numbers input: %s", pages_str)
95
+ return "Error: Please provide valid page numbers (e.g., 1,3,5 or 1-3)", None
96
+
97
+ # Get language codes
98
+ src_lang_code = lang_code_map.get(src_lang)
99
+ tgt_lang_code = lang_code_map.get(tgt_lang)
100
+
101
+ if not src_lang_code or not tgt_lang_code:
102
+ logger.error("Invalid language selection - Source: %s, Target: %s", src_lang, tgt_lang)
103
+ return "Error: Invalid source or target language selection", None
104
+
105
+ # Get file path from Gradio File object
106
+ file_path = pdf_file.name if hasattr(pdf_file, 'name') else pdf_file
107
+
108
+ logger.debug("Calling API with file: %s, pages: %s, prompt: %s, src_lang: %s, tgt_lang: %s",
109
+ file_path, pages, prompt, src_lang_code, tgt_lang_code)
110
+
111
+ system_prompt = "Do not return any asterisk"
112
+
113
+ results = {}
114
+ for page_number in pages:
115
+ try:
116
+ result = dwani.Documents.run_doc_query(
117
+ file_path=file_path,
118
+ prompt=f"{prompt} {system_prompt}",
119
+ page_number=page_number,
120
+ src_lang=src_lang_code,
121
+ tgt_lang=tgt_lang_code
122
+ )
123
+ logger.debug("API response for page %d: %s", page_number, result)
124
+ results[f"Page {page_number}"] = {
125
+ "Original Text": result.get("original_text", "N/A"),
126
+ "Response": result.get("response", "N/A"),
127
+ "Processed Page": result.get("processed_page", "N/A"),
128
+ "Translated Response": result.get("translated_response", "N/A")
129
+ }
130
+ except dwani.exceptions.DhwaniAPIError as e:
131
+ logger.error("Dhwani API error on page %d: %s", page_number, str(e))
132
+ results[f"Page {page_number}"] = {"error": f"API error: {str(e)}"}
133
+ except Exception as e:
134
+ logger.error("Unexpected error on page %d: %s", page_number, str(e))
135
+ results[f"Page {page_number}"] = {"error": f"Unexpected error: {str(e)}"}
136
+
137
+ # Convert results to markdown text
138
+ markdown_text = results_to_markdown(results)
139
+
140
+ # Save markdown to a temporary file for download
141
+ temp_md_file = tempfile.NamedTemporaryFile(delete=False, suffix=".md", mode='w', encoding='utf-8')
142
+ temp_md_file.write(markdown_text)
143
+ temp_md_file.close()
144
+
145
+ # Return markdown text and file path for download
146
+ return markdown_text, temp_md_file.name
147
+
148
+
149
+ # Define Gradio interface
150
+ with gr.Blocks(title="PDF Custom Prompt Processor with Multi-Page Support") as demo:
151
+ gr.Markdown("# PDF Custom Prompt Processor")
152
+ gr.Markdown("Upload a PDF, specify page numbers (comma-separated or ranges), enter a prompt, and select source and target languages.")
153
+
154
+ with gr.Row():
155
+ with gr.Column():
156
+ pdf_input = gr.File(label="Upload PDF", file_types=[".pdf"])
157
+ pages_input = gr.Textbox(
158
+ label="Page Numbers",
159
+ placeholder="e.g., 1,3,5 or 1-3",
160
+ value="1",
161
+ lines=1
162
+ )
163
+ prompt = gr.Textbox(
164
+ label="Custom Prompt",
165
+ placeholder="e.g., List the key points",
166
+ value="List the key points",
167
+ lines=3
168
+ )
169
+ src_lang_input = gr.Dropdown(
170
+ label="Source Language",
171
+ choices=language_names,
172
+ value="English"
173
+ )
174
+ tgt_lang_input = gr.Dropdown(
175
+ label="Target Language",
176
+ choices=language_names,
177
+ value="Kannada"
178
+ )
179
+ submit_btn = gr.Button("Process")
180
+
181
+ with gr.Column():
182
+ output_md = gr.Markdown(label="Response (Markdown)")
183
+ download_md = gr.File(label="Download Markdown File")
184
+
185
+ submit_btn.click(
186
+ fn=process_pdf,
187
+ inputs=[pdf_input, pages_input, prompt, src_lang_input, tgt_lang_input],
188
+ outputs=[output_md, download_md]
189
+ )
190
+
191
+
192
+ # Launch the interface
193
+ if __name__ == "__main__":
194
+ if not dwani.api_key or not dwani.api_base:
195
+ logger.error("API key or base URL not set. Please set DWANI_API_KEY and DWANI_API_BASE_URL environment variables.")
196
+ print("Error: Please set DWANI_API_KEY and DWANI_API_BASE_URL environment variables.")
197
+ else:
198
+ logger.debug("Starting Gradio interface...")
199
+ demo.launch()