엑셀 → PDF 변환 워크플로우

엑셀 템플릿 업로드 · 셀 선택 · 입력 폼 자동생성 · PDF 다운로드
🚀 서비스 실행
xlsx_to_pdf.html + board_server.py 포트 8081 · LibreOffice 헤드리스 · SheetJS · openpyxl 0 파일 업로드 사용자가 xlsx 파일을 드래그&드롭 또는 클릭 업로드 FormData multipart/form-data → POST /api/xlsx/upload ⚠️ 포트 8081 직접 접근 필수 (라우터 포트 80은 POST 차단) 1 서버 처리 (board_server.py — 포트 8081) 1-1. LibreOffice HTML 변환 soffice --headless --convert-to html (포맷 완벽 보존) 병합셀, 서식, 폰트, 테두리 전부 유지 1-2. openpyxl 셀 데이터 추출 모든 시트의 셀 값 + 좌표(JSON) 추출 { sheetName: { data: [[...]], maxRow, maxCol } } JSON 응답: { jobId, html, sheets } jobId = 고유 ID · html = LibreOffice 렌더링 결과 · sheets = 셀 데이터 2 셀 선택 — "어디에 뭘 넣을지" 지정 SheetJS로 렌더링한 그리드에서 셀 클릭 그리드 뷰: SheetJS 셀 데이터 기반 인터랙티브 테이블 (셀 클릭 → 보라색 토글) 미리보기 뷰: LibreOffice HTML 원본 렌더링 (포맷 그대로 확인) ⚠️ 선택된 셀 = "Sheet1!B3" 형태로 좌표 저장 · 변동값으로 지정됨 3 입력 폼 자동 생성 선택된 셀 좌표별로 input 필드 자동 생성 각 필드에 셀 좌표 라벨 표시 (예: Sheet1!B3) · 현재값 자동 로드 사용자가 값을 입력/수정 → formValues 객체에 저장 4 PDF 생성 — POST /api/xlsx/fill-and-pdf 4-1. openpyxl 값 채우기 formValues → 해당 셀 좌표에 값 주입 → filled.xlsx 저장 4-2. LibreOffice PDF 변환 soffice --headless --convert-to pdf → filled.pdf JSON 응답: { jobId, pdfUrl: "/api/xlsx/file/{jobId}/filled.pdf" } 5 미리보기 + 다운로드 PDF iframe 미리보기 · PDF/XLSX 다운로드 iframe src = /api/xlsx/file/{jobId}/filled.pdf (서버에서 PDF 바이너리 서빙) 수정 필요 시 ← 값 수정 버튼으로 STEP 3으로 복귀 📌 핵심 규칙 ⚠️ 포트 8081: 라우터 포트 80은 POST 차단. 반드시 http://IP:8081/xlsx_to_pdf.html 로 접근 ⚠️ LibreOffice 헤드리스: 포맷 보존 변환. openpyxl은 데이터 추출/값 주입용, 렌더링은 LibreOffice 담당 ✅ 서버 전용: 2026-06-12부터 모든 처리는 서버. 서무PC/win32com 불필요. inspection-print 스킬로 단일 진입점 통일

기술 스택

API 엔드포인트

known issues