인계문 — PFS 생산 인쇄(윈폼+WebView2) 세션 릴레이 · 2026-08-11(화)
이전 세션 컨텍스트 51.8% 초과로 넘김. 지금 최우선 = 미해결 1건(실페이지 인쇄가 여전히 작게 나온다).
0-A. 🔴페페 최신 지시 (이것부터 — 2026-08-11 세션 마지막)
"웹페이지 인쇄설정 기능을 완전히 빼봐. 아직 버튼도 있고 계속 덮고 있는건지도 모른다."
페페 가설이 유력하다. 실제로 살아 있는 결합이 있다:
sticker.html의PRINT_CFG는 그 PC 의 localStoragestk_print_cfg_v1에서 온다(w/h/m/scale).applyPrintCfg()가 그 값으로--stk-w/--stk-hCSS 변수를 설정하고,.stk-sheet가 그 변수를 폭·높이로 쓴다 → 시트 실물 크기를 웹 설정이 계속 덮고 있다.- 앱 인쇄도
appPrint(sheets,'sticker', PRINT_CFG.w, PRINT_CFG.h, PRINT_CFG.m, …)로 그 값을 앱에 넘긴다 → 생산팀 PC 의 낡은/이상한 localStorage 값이 그대로 인쇄 크기가 된다. (테스트 인쇄는 앱이 100/100/5 를 자체 상수로 쓰기 때문에 정상이었다 — 두 경로의 차이가 정확히 여기다.)
작업 = 웹의 인쇄설정 기능을 통째로 제거한다.
- ⚙ 인쇄 설정 버튼(#stk-cfg-btn)·패널(#stk-print-cfg)·저장/초기화 핸들러 삭제
- CFG_KEY/PRINT_CFG/applyPrintCfg/stickerPageCss 제거 → 100×100mm·여백 5mm 상수로 고정
(--stk-w/--stk-h 는 상수 90mm 로 세팅하거나 CSS 에 직접 박는다)
- 브라우저 폴백 인쇄도 같은 상수를 쓰게 한다(배율 140% 보정은 폐기 — 앱이 정식 경로다)
- 용지 크기를 바꿔야 할 일이 생기면 앱 ⚙ 프린터 설정에만 둔다(단일 출처)
- ⚠기존 사용자의 localStorage 잔재가 남아도 무시되도록, 읽는 코드를 아예 없앤다
검증 = 배포 후 실물 1장 + 아래 0-B 의 PDF 진단으로 크기 실측.
0-B. 원인 규명 도구 (0-A 로도 안 잡히면)
🔴증상 = 프린터 설정의 테스트 인쇄는 고쳐졌다(90×90mm, 사방 5mm 여백, 중앙 정렬 성공 — 페페 확인). 그런데 실제 PFS 스티커 페이지 인쇄는 위치·크기가 전혀 안 변했다(여전히 라벨 좌하단에 1/4 크기).
- 실사출력 사진 =
C:\dev\pfs\reference\KakaoTalk_20260811_180711389.jpg(왼쪽 = 실인쇄 실패본 / 오른쪽 = 테스트 인쇄. 프린터 = ZDesigner GT800 (EPL)) - 직전 조치(효과 없음) =
sticker.html에appPageCss()신설, 앱 인쇄 시@media print{ html,body,#stk-print-root { width:(용지−여백×2)mm !important; min-width:0 } }주입. 운영·테스트 배포까지 끝났고 서버 파일에 반영된 것도 확인했다(appPageCss=True).
🔑추측으로 또 고치지 말 것. 테스트(standalone HTML)와 실페이지의 차이가 뭔지 측정부터 한다. 가장 빠른 길 = 앱에 「현재 페이지를 PDF 로 저장」 진단 경로를 넣어 실제 인쇄물을 파일로 받는다.
MainForm 에 이미 있는 DoPrint 와 똑같은 PrintSettings 로
await web.CoreWebView2.PrintToPdfAsync(path, s)
를 호출하는 분기를 추가(예: 웹 메시지 "printpdf:<kind>:<w>:<h>:<m>" 또는 툴바 숨김 버튼).
→ 나온 PDF 를 pfs/print-app/tools/verify_print_size.py 로 재고, 내용 위치는
PDF content stream 을 zlib 로 풀어 좌표를 본다(배경 사각형이 제일 크니 두 번째로 큰 경로를 봐야 한다).
확인 후보(우선순위)
1. WebView2 캐시 — 앱이 옛 sticker.html 을 물고 있을 수 있다. 앱에서 강력 새로고침
(CoreWebView2.Reload() 는 캐시를 쓴다 → ExecuteScriptAsync("location.reload(true)") 또는
프로필 폴더 %LOCALAPPDATA%\PfsPrint\webview 삭제 후 재실행)로 먼저 배제한다. 가장 싸고 가능성 높다.
2. appPageCss 가 붙긴 하는데 !important 가 다른 규칙에 지는지 — 인쇄 시점에
getComputedStyle(document.body).width 를 웹 메시지(log:)로 앱 로그에 남겨 실측한다.
3. 축소 주체가 레이아웃 폭이 아니라 WebView2 의 ZoomFactor / 장치 배율 일 가능성.
web.ZoomFactor 를 로그에 찍어 본다(1.0 이 아니면 그게 범인).
4. .stk-sheet 가 var(--stk-w) 를 쓰는데 그 값이 그 PC 의 localStorage stk_print_cfg_v1 에서 온다.
생산팀 PC 값이 이상할 수 있다 → log: 로 PRINT_CFG 를 찍어 확인.
1. 확정 규약 (건드리지 말 것)
- 제품 =
C:\dev\pfs\print-app(net48 WinForms + WebView2). 페페 확정 = PFS 전용 브라우저로 크롬 대체. - 인쇄는
CoreWebView2.PrintAsync(PrintSettings)— 대화상자 없음,PrinterName·PageWidth/Height(인치)·ScaleFactor·여백 지정. 렌더러를 따로 만들지 않는다(화면 HTML 을 그대로 찍어 미리보기=실물 보장). - 여백은 PrintSettings 한 곳에서만 정한다. CSS
@page{margin:0}을 넣으면 PrintSettings 여백을 덮어쓴다(실측). - ⛔
C:\dev\pfs\print-agent는 폐기(로컬 HTTP 에이전트 방식). 웹은 더 이상 호출하지 않는다. 되살리지 말 것. - Session 0 함정 = 코디 Bash 는 Session 0 이라 WebView2 GUI 가
0x80070578로 죽는다. 앱 실행·검증은 반드시schtasks /Create ... /IT /RU %USERNAME% /F+/Run으로 사용자 세션에서. WinForms 에서Visible=false컨트롤도 HWND 가 없어 같은 오류 → 숨길 땐 화면 밖 좌표로. - 브랜치 = master(테스트 자동배포) / deploy-live(운영, 파일단위 선별 포워드).
⚠
git checkout <브랜치>실패 뒤&&로git pull붙이면 현재 브랜치에 머지된다(사고 있었음). 브랜치 전환은 한 줄씩. 전환 전git stash push tools/sitemap/menu_dump.json(생성물이 매번 걸린다). - 운영배포(deploy-live)는 페페가 채팅에 직접 승인했을 때만. 이번 건들은 승인받아 배포 완료.
2. 끝난 것 (배포·검증 완료)
| 항목 | 상태 |
|---|---|
| 앱 신규(WebView2 PrintAsync, 스티커=GT800 / 파레트=A4 분기) | ✅ |
| 단일 폴더 설치(더블클릭 → %LOCALAPPDATA% 자가설치 + 바탕화면·시작메뉴 바로가기) | ✅ |
SSH 원격배포(remote_update.py --status/--log/--deploy) |
✅ 로컬 실측 |
| 현장검색 = 기본 진행중만 / 검색 시 과거 현장 포함 + 「지난 현장」 배지 | ✅ 운영 API 7/7 |
| 이동선반 발주 목록 ID 오름차순 | ✅ 운영 API 4/4 |
| PFS 로고 앱 아이콘(텍스트 없는 정사각) | ✅ |
| 프린터 설정창 하단 버튼 잘림(620×400 → 620×466 자동계산) | ✅ --layout 검사 |
| 앱 내 사이드메뉴 접힘 시작 | ✅ (육안 미확인) |
상단바 동기화 상태 텍스트 제거 → 버튼에 ✓ HH:MM |
✅ (육안 미확인) |
| 테스트 인쇄 여백 5mm·중앙 정렬 | ✅ 페페 실물 확인 |
| 실페이지 인쇄 크기·위치 | 🔴미해결 — 위 0번 |
커밋 = master 88302d6 / deploy-live b43a9ac(웹) · 119739b(이동선반) · 17ab861(스티커 앱경로).
서버 반영 확인 완료(양쪽 appPageCss=True, uwsgi active). DB 스키마 변경 0.
3. 페페 몫 (대기 중)
- 생산팀 PC 에 앱 설치 — NAS
\\192.168.0.101\공유폴더\poin\PFS생산인쇄앱_26.8.11\프로그램폴더째 복사 →PfsPrint.exe더블클릭 deploy_enable_ssh_prod.ps1관리자 1회 실행 → IP·사용자명 알려주면~/.ssh/config에Host prod등록(키C:\dev\.secrets\prod_ed25519생성 완료)- ❓판단 = 폐기된
print-agent폴더를 리포에서 지울지
4. 도구·검증 스크립트
pfs/print-app/build.bat—dotnet build -c Release→bin\Release\net48\(exe + DLL 4개, 이 5개가 배포 단위)PfsPrint.exe --selftest <폴더>— 실인쇄와 같은 설정으로 PDF 생성 /tools/verify_print_size.py로 mm 실측PfsPrint.exe --layout <폴더>— 설정창 잘림 검사 + 폼 그림(DrawToBitmap, 화면 방해 없음)pfs/print-app/tools/make_icon.py— PFS 로고 →pfs.ico재생성pfs/scripts/_sticker_fields_api_check.py,_shelf_orders_api_check.py— 배포 후 API 검증(로그인 쿠키 사용)pfs/scripts/_shelf_orders_check.ps1— imos MSSQL 직결(pymssql·ODBC17 없음 → PowerShell SqlClient)pfs/scripts/ssm_run.py <로컬.py>— EC2 에서 실행(운영/테스트 파일·DB 확인)- ⚠
scripts/_*.py는 gitignore 대상이다(커밋 안 됨, 로컬 전용)
5. 시드 포인터
user_brief/HANDOFF.mdNOW — pfs 생산 인쇄 항목(1·2·3차 경과)user_brief/projects/pfs/rules.md🆕 — 이번 세션 함정 14건(인쇄 축소·@page 여백 덮어쓰기·Session 0·Visible=falseHWND·Global\Mutex·설치본 잠금 무시·cp949·checkout 후 pull 사고·배포 대기 오진 등)C:\dev\pfs\print-app\README.md— 앱 전체 문서(설치·설정·문제해결·원격관리)- ⚠
HANDOFF.md33,600자 = 경고선 30,000 초과 → archive 이관 필요(별건)