",
"No file",
)
try:
# Gradio가 넘겨준 임시 PDF 경로
uploaded_temp_path = pdf_file.name
# 서버 내 임시 업로드 폴더에 안전하게 복사
filename_only = os.path.basename(uploaded_temp_path)
pdf_path = os.path.join(UPLOAD_DIR, filename_only)
shutil.copyfile(uploaded_temp_path, pdf_path)
debug.append(f"Copied PDF to: {pdf_path}")
# PDF → 페이지 이미지 변환
pages_info = process_pdf(pdf_path, session_id)
debug.append(f"Extracted pages: {len(pages_info)}")
if not pages_info:
raise RuntimeError("PDF 처리 결과가 비어 있습니다.")
# 플립북 HTML 생성
html_block = generate_flipbook_html(pages_info, session_id, view_mode, skin)
return html_block, "\n".join(debug)
except Exception as e:
tb = traceback.format_exc()
logging.error(tb)
debug.extend(["❌ ERROR ↓↓↓", tb])
return (
f"
",
"No images",
)
try:
# Gradio가 넘겨준 임시 이미지 경로들
img_paths = []
for fobj in images:
# 안전하게 temp 폴더에 복사
uploaded_temp_path = fobj.name
filename_only = os.path.basename(uploaded_temp_path)
local_img_path = os.path.join(UPLOAD_DIR, filename_only)
shutil.copyfile(uploaded_temp_path, local_img_path)
img_paths.append(local_img_path)
debug.append(f"Images: {img_paths}")
# 이미지 → 페이지 정보 변환
pages_info = process_images(img_paths, session_id)
debug.append(f"Processed: {len(pages_info)}")
if not pages_info:
raise RuntimeError("이미지 처리 실패")
# 플립북 HTML 생성
html_block = generate_flipbook_html(pages_info, session_id, view_mode, skin)
return html_block, "\n".join(debug)
except Exception as e:
tb = traceback.format_exc()
logging.error(tb)
debug.extend(["❌ ERROR ↓↓↓", tb])
return (
f"
오류: {e}
",
"\n".join(debug),
)
# ────────────────────────────
# Gradio UI
# ────────────────────────────
with gr.Blocks(title="3D Flipbook Viewer") as demo:
gr.Markdown("# 3D Flipbook Viewer\nPDF 또는 이미지를 업로드해 인터랙티브 플립북을 만드세요.")
with gr.Tabs():
# PDF 탭
with gr.TabItem("PDF 업로드"):
pdf_file = gr.File(label="PDF 파일", file_types=[".pdf"])
with gr.Accordion("고급 설정", open=False):
pdf_view = gr.Radio(
["webgl", "3d", "2d", "swipe"],
value="2d",
label="뷰 모드",
)
pdf_skin = gr.Radio(
["light", "dark", "gradient"],
value="light",
label="스킨",
)
pdf_btn = gr.Button("PDF → 플립북", variant="primary")
pdf_out = gr.HTML()
pdf_dbg = gr.Textbox(label="디버그", lines=10)
pdf_btn.click(
create_flipbook_from_pdf,
inputs=[pdf_file, pdf_view, pdf_skin],
outputs=[pdf_out, pdf_dbg],
)
# 이미지 탭
with gr.TabItem("이미지 업로드"):
imgs = gr.File(
label="이미지 파일들",
file_types=["image"],
file_count="multiple",
)
with gr.Accordion("고급 설정", open=False):
img_view = gr.Radio(
["webgl", "3d", "2d", "swipe"],
value="2d",
label="뷰 모드",
)
img_skin = gr.Radio(
["light", "dark", "gradient"],
value="light",
label="스킨",
)
img_btn = gr.Button("이미지 → 플립북", variant="primary")
img_out = gr.HTML()
img_dbg = gr.Textbox(label="디버그", lines=10)
img_btn.click(
create_flipbook_from_images,
inputs=[imgs, img_view, img_skin],
outputs=[img_out, img_dbg],
)
gr.Markdown(
"### 사용법\n"
"1. PDF 또는 이미지 탭을 선택하고 파일을 업로드합니다.\n"
"2. 필요하면 뷰 모드/스킨을 바꿉니다.\n"
"3. ‘플립북’ 버튼을 누르면 결과가 아래 뜹니다."
)
# ────────────────────────────
# 실행
# ────────────────────────────
if __name__ == "__main__":
# 필요한 경우 share=True 등 인자로 추가 가능
demo.launch(debug=True)