| import gradio as gr |
| import os |
| import time |
| import shutil |
| import base64 |
| from pdfquery import PDFQuery |
|
|
| pquery = PDFQuery() |
|
|
|
|
| def openai_create(s): |
| global pquery |
| return pquery.ask(s) |
|
|
| def chatgpt_clone(input, history, chatbot): |
| if input == "": |
| return chatbot, history, "" |
| history = history or [] |
| s = list(sum(history, ())) |
| s.append(input) |
| inp = ' '.join(s) |
| output = openai_create(input) |
| history.append((inp, output)) |
| chatbot.append((input, output)) |
| return chatbot, history, "" |
|
|
|
|
| title_html = f"<h1 align=\"center\">Chat With Pdf</h1>" |
|
|
| gr_L1 = lambda: gr.Row().style() |
| gr_L2 = lambda scale, elem_id: gr.Column(scale=scale, elem_id=elem_id) |
|
|
|
|
| def pdf_to_markdown(file_obj): |
| try: |
| shutil.rmtree('./private_upload/') |
| except: |
| pass |
| time_tag = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime()) |
| os.makedirs(f'private_upload/{time_tag}', exist_ok=True) |
| file_name = os.path.basename(file_obj.name) |
| destination = f'private_upload/{time_tag}/{file_name}' |
| shutil.copy(file_obj.name, destination) |
| global pquery |
| pquery.ingest(destination) |
| with open(destination, "rb") as f: |
| pdf = base64.b64encode(f.read()).decode('utf-8') |
| pdf_display = f'<embed src="data:application/pdf;base64,{pdf}" ' \ |
| f'width="700" height="800" type="application/pdf">' |
| return [pdf_display, gr.update(visible=False),gr.update(visible=True),gr.update(visible=True),gr.update(visible=True), |
| gr.update(visible=True),gr.update(visible=True)] |
|
|
| |
| cle = lambda :"" |
|
|
| with gr.Blocks(title="Chat With Pdf") as demo: |
| gr.HTML(title_html) |
| file = gr.File() |
| with gr_L1(): |
| with gr_L2(scale=1.5, elem_id="gpt-chat"): |
| out = gr.Markdown() |
| with gr_L2(scale=1, elem_id="gpt-chat"): |
| title = gr.Markdown("""<h1><center><strong>文档问答 </strong></center></h1> |
| """, visible=False) |
| chatbot = gr.Chatbot(scale=3, height=600, visible=False) |
| with gr_L1(): |
| message = gr.Textbox(placeholder="Input question here.", scale=10, visible=False) |
| state = gr.State([]) |
| submit = gr.Button("发送", scale=1, visible=False) |
|
|
| file.upload(pdf_to_markdown, file, [out, file, out, title, chatbot, message, submit]) |
| submit.click(chatgpt_clone, inputs=[message, state, chatbot], outputs=[chatbot, state, message]) |
|
|
| demo.launch() |
|
|