Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -281,7 +281,7 @@ def render_img(b64_list, idx, scale):
|
|
| 281 |
"""根据当前索引 idx 和缩放倍数 scale 渲染 HTML。"""
|
| 282 |
if not b64_list:
|
| 283 |
return "<p style='color:gray'>请先上传图片</p>"
|
| 284 |
-
idx %= len(b64_list)
|
| 285 |
src = b64_list[idx]
|
| 286 |
return (
|
| 287 |
f'<div style="overflow:auto;border:1px solid #ccc;'
|
|
@@ -292,20 +292,9 @@ def render_img(b64_list, idx, scale):
|
|
| 292 |
)
|
| 293 |
|
| 294 |
|
| 295 |
-
|
| 296 |
def files_to_b64(file, pdf_dpi: int = 200):
|
| 297 |
-
"""
|
| 298 |
-
把上传文件统一转成 base64 图片列表。
|
| 299 |
-
• 普通图片:直接 base64
|
| 300 |
-
• PDF :按页转成 PNG 再 base64
|
| 301 |
-
|
| 302 |
-
返回
|
| 303 |
-
----
|
| 304 |
-
List[str] 每个元素形如 "data:image/png;base64,xxxx..."
|
| 305 |
-
"""
|
| 306 |
out: list[str] = []
|
| 307 |
-
|
| 308 |
-
if hasattr(file, "data"): # 新版 FileData / NamedString
|
| 309 |
raw_bytes = file.data
|
| 310 |
suffix = pathlib.Path(file.name).suffix.lower()
|
| 311 |
|
|
@@ -317,13 +306,10 @@ def files_to_b64(file, pdf_dpi: int = 200):
|
|
| 317 |
page.save(buf, format="PNG")
|
| 318 |
b64 = base64.b64encode(buf.getvalue()).decode()
|
| 319 |
out.append(f"data:image/png;base64,{b64}")
|
| 320 |
-
|
| 321 |
-
# -- 普通图片 --
|
| 322 |
else:
|
| 323 |
b64 = base64.b64encode(raw_bytes).decode()
|
| 324 |
out.append(f"data:image/{suffix[1:]};base64,{b64}")
|
| 325 |
|
| 326 |
-
# ---------- 旧版:直接获得文件路径 ----------
|
| 327 |
else:
|
| 328 |
path = pathlib.Path(file)
|
| 329 |
suffix = path.suffix.lower()
|
|
@@ -379,10 +365,11 @@ if __name__ == '__main__':
|
|
| 379 |
change_bu = gr.Button('Parse')
|
| 380 |
clear_bu = gr.ClearButton(value='Clear')
|
| 381 |
|
|
|
|
| 382 |
with gr.Row():
|
| 383 |
prev_btn = gr.Button("⬅️ Pre")
|
| 384 |
next_btn = gr.Button("Next ➡️")
|
| 385 |
-
|
| 386 |
|
| 387 |
viewer = gr.HTML()
|
| 388 |
|
|
@@ -432,15 +419,15 @@ if __name__ == '__main__':
|
|
| 432 |
line_breaks=True)
|
| 433 |
with gr.Tab('Markdown text'):
|
| 434 |
md_text = gr.TextArea(lines=45, show_copy_button=True)
|
| 435 |
-
|
| 436 |
-
|
| 437 |
-
|
| 438 |
-
# file.change(fn=process_file, inputs=file, outputs=pdf_show)
|
| 439 |
|
| 440 |
-
img_list_state = gr.State([])
|
| 441 |
-
idx_state = gr.State(0)
|
| 442 |
|
| 443 |
-
def upload_handler(files):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 444 |
b64s = files_to_b64(files)
|
| 445 |
return b64s, 0, render_img(b64s, 0, 1)
|
| 446 |
|
|
@@ -470,7 +457,6 @@ if __name__ == '__main__':
|
|
| 470 |
outputs=[idx_state, viewer],
|
| 471 |
)
|
| 472 |
|
| 473 |
-
# 缩放滑块变化
|
| 474 |
zoom.change(
|
| 475 |
lambda b64s, idx, scale: render_img(b64s, idx, scale),
|
| 476 |
inputs=[img_list_state, idx_state, zoom],
|
|
|
|
| 281 |
"""根据当前索引 idx 和缩放倍数 scale 渲染 HTML。"""
|
| 282 |
if not b64_list:
|
| 283 |
return "<p style='color:gray'>请先上传图片</p>"
|
| 284 |
+
idx %= len(b64_list)
|
| 285 |
src = b64_list[idx]
|
| 286 |
return (
|
| 287 |
f'<div style="overflow:auto;border:1px solid #ccc;'
|
|
|
|
| 292 |
)
|
| 293 |
|
| 294 |
|
|
|
|
| 295 |
def files_to_b64(file, pdf_dpi: int = 200):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 296 |
out: list[str] = []
|
| 297 |
+
if hasattr(file, "data"):
|
|
|
|
| 298 |
raw_bytes = file.data
|
| 299 |
suffix = pathlib.Path(file.name).suffix.lower()
|
| 300 |
|
|
|
|
| 306 |
page.save(buf, format="PNG")
|
| 307 |
b64 = base64.b64encode(buf.getvalue()).decode()
|
| 308 |
out.append(f"data:image/png;base64,{b64}")
|
|
|
|
|
|
|
| 309 |
else:
|
| 310 |
b64 = base64.b64encode(raw_bytes).decode()
|
| 311 |
out.append(f"data:image/{suffix[1:]};base64,{b64}")
|
| 312 |
|
|
|
|
| 313 |
else:
|
| 314 |
path = pathlib.Path(file)
|
| 315 |
suffix = path.suffix.lower()
|
|
|
|
| 365 |
change_bu = gr.Button('Parse')
|
| 366 |
clear_bu = gr.ClearButton(value='Clear')
|
| 367 |
|
| 368 |
+
zoom = gr.Slider(0.5, 3, value=1, step=0.1, label="Scale")
|
| 369 |
with gr.Row():
|
| 370 |
prev_btn = gr.Button("⬅️ Pre")
|
| 371 |
next_btn = gr.Button("Next ➡️")
|
| 372 |
+
|
| 373 |
|
| 374 |
viewer = gr.HTML()
|
| 375 |
|
|
|
|
| 419 |
line_breaks=True)
|
| 420 |
with gr.Tab('Markdown text'):
|
| 421 |
md_text = gr.TextArea(lines=45, show_copy_button=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 422 |
|
| 423 |
+
img_list_state = gr.State([])
|
| 424 |
+
idx_state = gr.State(0)
|
| 425 |
|
| 426 |
+
async def upload_handler(files):
|
| 427 |
+
|
| 428 |
+
if files.lower().endswith(".pdf") or :
|
| 429 |
+
asyncio.create_task(send_pdf_async_aiohttp(files, server_ip=openai_api_base, Authorization=Authorization))
|
| 430 |
+
|
| 431 |
b64s = files_to_b64(files)
|
| 432 |
return b64s, 0, render_img(b64s, 0, 1)
|
| 433 |
|
|
|
|
| 457 |
outputs=[idx_state, viewer],
|
| 458 |
)
|
| 459 |
|
|
|
|
| 460 |
zoom.change(
|
| 461 |
lambda b64s, idx, scale: render_img(b64s, idx, scale),
|
| 462 |
inputs=[img_list_state, idx_state, zoom],
|