
    :i*                         d Z ddlZddlZddlZddlZddlZddlZddlmZ ej                  j                  dd       ddlZ ed      Zedz  Zedz  ZdZd	Zd
 Zd Zd Zd Zd Zedk(  r e        yy)uK   슬라이드 4 (증거/Social Proof) - T.O.P 리크루팅 캠페인 Angle A    N)Pathz&/home/jay/workspace/tools/ai-image-genz8/home/jay/workspace/output/meta-ads/angle-A/v6-benchmarkzslide-04.pngzslide-04-bg.jpga  Professional dark navy (#003B5C) corporate cityscape background with modern skyscrapers silhouette and abstract upward-trending chart lines in emerald green (#047857). Trustworthy, established corporate atmosphere. Clean center and bottom areas for text overlay. Subtle emerald green geometric grid lines in background suggesting growth charts. No text, no people, no logos, no watermarks. 1080x1080 square format. Dark atmospheric city night with subtle blue-green ambient lighting. Premium corporate advertisement background quality.u   <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
  @import url('https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Noto+Sans+KR:wght@400;500;600;700;800;900&display=swap');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1080px;
    height: 1080px;
    overflow: hidden;
    font-family: 'Noto Sans KR', sans-serif;
  }

  .container {
    width: 1080px;
    height: 1080px;
    position: relative;
    background: #003B5C;
    overflow: hidden;
  }

  .bg-image {
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
  }

  /* Bottom gradient overlay for text readability */
  .bottom-overlay {
    position: absolute;
    bottom: 0; left: 0; right: 0;
    height: 60%;
    background: linear-gradient(
      to bottom,
      rgba(0, 59, 92, 0) 0%,
      rgba(0, 59, 92, 0.55) 40%,
      rgba(0, 59, 92, 0.75) 100%
    );
    pointer-events: none;
  }

  /* TOP HEADLINE AREA */
  .headline-area {
    position: absolute;
    top: 96px;
    left: 0; right: 0;
    text-align: center;
    padding: 0 64px;
  }

  .headline-line {
    display: block;
    font-family: 'Black Han Sans', 'Noto Sans KR', sans-serif;
    font-size: 84px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1.15;
    letter-spacing: -2px;
    text-shadow: 0 2px 16px rgba(0,0,0,0.4);
  }

  /* CENTER HERO STAT */
  .hero-stat-area {
    position: absolute;
    top: 360px;
    left: 0; right: 0;
    text-align: center;
    padding: 0 64px;
  }

  .hero-number {
    display: block;
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 128px;
    font-weight: 900;
    color: #EA580C;
    line-height: 1.0;
    letter-spacing: -4px;
    text-shadow: 0 4px 24px rgba(234,88,12,0.35);
  }

  .hero-label {
    display: block;
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 64px;
    font-weight: 600;
    color: #FFFFFF;
    line-height: 1.2;
    margin-top: 8px;
    text-shadow: 0 2px 8px rgba(0,0,0,0.3);
  }

  /* KOSDAQ BADGE */
  .badge-area {
    position: absolute;
    top: 656px;
    left: 0; right: 0;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .badge-pill {
    display: inline-block;
    background: #EA580C;
    color: #FFFFFF;
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 44px;
    font-weight: 700;
    padding: 12px 32px;
    border-radius: 999px;
    letter-spacing: 0px;
  }

  /* SUB INFO */
  .sub-info-area {
    position: absolute;
    top: 760px;
    left: 0; right: 0;
    text-align: center;
    padding: 0 64px;
  }

  .sub-info-text {
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 56px;
    font-weight: 500;
    color: #E0E0E0;
    line-height: 1.3;
    letter-spacing: -1px;
  }

  /* BOTTOM CTA BAR */
  .cta-bar {
    position: absolute;
    bottom: 64px;
    left: 64px; right: 64px;
    background: rgba(0, 30, 50, 0.85);
    border: 2px solid #047857;
    border-radius: 16px;
    padding: 24px 48px;
    text-align: center;
  }

  .cta-text {
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 44px;
    font-weight: 700;
    color: #FFFFFF;
    letter-spacing: -1px;
  }
</style>
</head>
<body>
<div class="container">
  <!-- Background image -->
  <div class="bg-image" id="bg-div"></div>

  <!-- Bottom gradient overlay -->
  <div class="bottom-overlay"></div>

  <!-- 1. HEADLINE (top) -->
  <div class="headline-area">
    <span class="headline-line">준비된 조직이</span>
    <span class="headline-line">당신을 기다립니다.</span>
  </div>

  <!-- 2. HERO STAT (center) -->
  <div class="hero-stat-area">
    <span class="hero-number">1,863%</span>
    <span class="hero-label">매출 성장</span>
  </div>

  <!-- 3. KOSDAQ BADGE -->
  <div class="badge-area">
    <span class="badge-pill">코스닥 상장</span>
  </div>

  <!-- 4. SUB INFO -->
  <div class="sub-info-area">
    <span class="sub-info-text">본부5 / 지점10 / 200+명</span>
  </div>

  <!-- 5. CTA BAR (bottom) -->
  <div class="cta-bar">
    <span class="cta-text">강한 조직의 이야기 보기 →</span>
  </div>
</div>

<script>
function setBg(bgPath) {
  document.getElementById('bg-div').style.backgroundImage = "url('" + bgPath + "')";
}
</script>
</body>
</html>c                      ddl } 	 | j                  g dddd      }|j                  j                         }|r|S 	 t        j                         S # t        $ r Y t        j                         S w xY w)u   Gemini API 토큰 획득.r   N)gcloudauthzprint-access-tokenz<--scopes=https://www.googleapis.com/auth/generative-languageT)capture_outputtextcheck)
subprocessrunstdoutstrip	Exceptiongcloud_authget_access_token)r
   resulttokens      C/home/jay/workspace/output/meta-ads/angle-A/v06/generate_slide04.py	get_tokenr      s    
Md$   

 ##%L  ''))  ''))s   4A 	A/.A/c           	      4   d}d|  dd}ddt         igigddd	gid
}t        d       t        j                         }t        j                  |||d      }t        j                         |z
  }t        d|dd|j
                          |j
                  dvrgt        d|j
                   d       d}t        j                  |||d      }t        j                         |z
  }t        d|dd|j
                          |j
                  dk7  rt        d|j                  dd        y|j                         }|j                  dg       }	|	st        d       y|	d   j                  di       j                  dg       }
|
D ]  }d|v s|d   j                  dd       }t        j                  |d   d!         }d"|v rd#nd$}t        j                  |      }|j                  |       t        d%| d&t        |      d'd(       t        |      c S  t        d)       y)*u&   Gemini API로 배경 이미지 생성.zbhttps://generativelanguage.googleapis.com/v1beta/models/gemini-3-pro-image-preview:generateContentzBearer zapplication/json)AuthorizationzContent-Typepartsr   responseModalitiesIMAGETEXT)contentsgenerationConfigu4   배경 이미지 생성 중... (약 30-60초 소요)i,  )headersjsontimeoutu   응답 수신: z.1fu   초, 상태코드: )   u   Pro 모델 실패 (HTTP u   ), Flash 모델로 재시도...zqhttps://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-preview-image-generation:generateContentu   Flash 응답: r    u   오류 응답:Ni  
candidatesu   candidates 없음r   content
inlineDatamimeTypez
image/jpegdatajpegz.jpgz.pngu   배경 이미지 저장:  (,z bytes)u   이미지 파트 없음)	BG_PROMPTprinttimerequestspoststatus_coder   r   getbase64	b64decodeBG_PATHwith_suffixwrite_byteslenstr)r   urlr   payloadstartresponseelapsed	url_flashr%   r!   r   part	mime_typeimage_bytesextbg_save_paths                   r   generate_backgroundrB      s5   
nC"5'**G
  3456 7F"3
G 

@AIIKE}}S'MHiikE!G	OGC=(;H<P<P;Q
RS6)()=)=(>>]^_ H	==G'SVW))+%wsm+>x?S?S>TUVs"ds 34==?D,+J!"qMi,00"=E %4\*..z<HI **4+=f+EFK"i/&VC"..s3L$$[1-l^2c+>Nq=QQXYZ|$$% 

#$    c                    ddl m} t        dz  }|j                  t        d       d|  } |       5 }|j
                  j                         }	 |j                  ddd	      }|j                  d|j                          d
       |j                  d| d       |j                  d       t        j                  j                  dd       |j                  t!        t              d       t#        dt                |j%                          	 ddd       |j'                  d       y# |j%                          w xY w# 1 sw Y   1xY w)u9   Playwright로 HTML 오버레이 렌더링 및 PNG 캡처.r   sync_playwrightslide-04-overlay.htmlutf-8encodingfile://8  widthheightviewportnetworkidle
wait_untilzsetBg('z')  Tparentsexist_okpngpathtypeu   최종 이미지 저장: N
missing_ok)playwright.sync_apirF   
OUTPUT_DIR
write_textHTML_TEMPLATEchromiumlaunchnew_pagegotoresolveevaluatewait_for_timeoutOUTPUT_PATHparentmkdir
screenshotr6   r*   closeunlink)bg_pathrF   	html_pathbg_file_urlpbrowserpages          r   render_with_playwrightrv   /  s,   3 44I9G9%K		 a**##%	##tt-L#MDII	 1 1 345-IP MMGK=34 !!$'$$TD$AOO[!1O>-k];<MMO!& % MMO! s$   EB2D-E-D??EEc                     t        d       t        d       t        dt                t        d       t        j                  dd       t        d       t	               } t        dt        |        d       t        d	       t        |       }|t        d
       d }t        d       |rt        |       n
t                t        j                         j                  dz  }t        dt         d|dd       t        d       y )Nz<============================================================u2   슬라이드 4 (증거/Social Proof) 생성 시작u   출력 경로: TrV   u&   
[1단계] Gemini API 토큰 획득...u   토큰 획득 성공: z charsu%   
[2단계] 배경 이미지 생성...u;   배경 이미지 생성 실패 - 단색 배경으로 진행u)   
[3단계] HTML 오버레이 렌더링...i   u	   
완료: r'   z.0fz KB))r*   rj   r`   rl   r   r5   rB   rv   render_without_bgstatst_size)r   rp   size_kbs      r   mainr|   O  s    	(O	
>?	OK=
)*	(OTD1 

34KE	"3u:,f
56	
23!%(GKL 

67w' ((4/G	J{m2gc]$
78	(OrC   c                  h   ddl m}  t        dz  }|j                  t        d        |        5 }|j
                  j                         }	 |j                  ddd      }|j                  d	|j                          d
       |j                  d       t        j                  j                  dd       |j                  t        t              d       t!        dt                |j#                          	 ddd       |j%                  d       y# |j#                          w xY w# 1 sw Y   1xY w)u0   배경 없이 단색으로 렌더링 (fallback).r   rE   rG   rH   rI   rL   rM   rP   rK   rR   rS   rU   TrV   rY   rZ   u)   최종 이미지 저장 (단색 배경): Nr]   )r_   rF   r`   ra   rb   rc   rd   re   rf   rg   ri   rj   rk   rl   rm   r6   r*   rn   ro   )rF   rq   rs   rt   ru   s        r   rx   rx   o  s   344I9		 
a**##%	##tt-L#MDII	 1 1 345-IP!!$'$$TD$AOO[!1O>=k]KLMMO
 % MMO
 
s$   D(
BD'D(D%%D((D1__main__)__doc__sysr0   r,   r+   ostempfilepathlibr   r[   insertr   r`   rj   r2   r)   rb   r   rB   rv   r|   rx   __name__ rC   r   <module>r      s    Q 
    	   ; < LM
>)
(
(: 
IX*"2j&@@&, zF rC   