
    (<i~-              	         d Z ddlm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
 ddlZddlmZ ddlmZmZmZmZ eZdZdZd	ZeZd
ZdZeZdZ e
e      j:                  Zedz  Zedz  Z edz  dz  dz  Z!edz  dz  dz  Z"dZ#dZ$dZ%djM                  g de'dde(dde(de)h dde*dd e+d!d"e,e-z
  d#e d$e d%d&e,e-z
  d#e d'e d(d)e(d*d+e+d,d-e,e-z
  d#e d.e d/d0e,e-z
  d#e d1e d2d3e,e-z
  d#e d4e d%d5e+d6d7e.d8e d9e d:d;e.d8e d<e d=d>      Z/dDd?Z0dEd@Z1dFdAZ2dGdBZ3e4dCk(  r e3        yy)Hu   
#14 SVG-first 렌더링 파이프라인 배너 v2 생성 스크립트
hybrid-image 방식: Gemini 배경 + HTML 오버레이
출력: /home/jay/workspace/output/meta-ads/concept-catalog/14-svg-first/sample-v2.png
    )annotationsN)Path)sync_playwright)CORE_METRIC_MIN_PX
CTA_MIN_PXHEAD_SUB_RATIOWORKSPACE_ROOT,   0   H   gffffff?g333333?gffffff?z:output/meta-ads/concept-catalog/14-svg-first/sample-v2.pngz@output/meta-ads/concept-catalog/14-svg-first/14-svg-first-v2.pngoutputz	v4-hybridzbg_14_svg_first_v2.jpgzoverlay_14_svg_first_v2.htmlz0https://generativelanguage.googleapis.com/v1betaz3https://www.googleapis.com/auth/generative-languagea  Clean white background, minimal corporate design, faint light gray geometric lines as subtle texture, professional financial services aesthetic, no people, no text, soft shadow at edges, pure white dominant, barely visible gridlines, sophisticated business atmosphere, 1080x1080 z<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<style>
  @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;700;800;900&display=swap');

  * z( 0; padding: 0; box-sizing: border-box; z	

  body z 1080px;
    height: 1080px;
    overflow: hidden;
    font-family: 'Pretendard', 'Noto Sans KR', 'Apple SD Gothic Neo', sans-serif;
  z

  .canvas zi 1080px;
    height: 1080px;
    position: relative;
    background: #FFFFFF;
    background-image: url('zC');
    background-size: cover;
    background-position: center;
  z

  .content z absolute;
    top: 0;
    left: 0;
    width: 1080px;
    height: 1080px;
    padding: 60px 72px;
    display: flex;
    flex-direction: column;
  u'   

  /* 상단 영역 */
  .top-section z 0 0 auto;
  z

  .top-label  z?px;
    font-weight: 700;
    color: #1A3A5C;
    line-height: z ;
    letter-spacing: -0.5px;
  z

  .sub-label zTpx;
    font-weight: 400;
    color: #888888;
    margin-top: 8px;
    line-height: z ;
    letter-spacing: -0.3px;
  z

  .divider ze 100%;
    height: 2px;
    background-color: #1A3A5C;
    margin-top: 24px;
    margin-bottom: 0;
  u1   

  /* 중간 메인 영역 */
  .middle-section zp 1 1 auto;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding-top: 20px;
  z

  .headline z?px;
    font-weight: 800;
    color: #1A3A5C;
    line-height: z8;
    letter-spacing: -2px;
    word-break: keep-all;
  z

  .sub-copy zUpx;
    font-weight: 700;
    color: #2D6A4F;
    margin-top: 32px;
    line-height: z:;
    letter-spacing: -1.5px;
    word-break: keep-all;
  z

  .support-text zUpx;
    font-weight: 400;
    color: #555555;
    margin-top: 28px;
    line-height: u*   

  /* 하단 영역 */
  .bottom-section z& 0 0 auto;
    padding-bottom: 0px;
  z

  .urgent-badge z inline-block;
    font-size: zpx;
    font-weight: 600;
    color: #E53935;
    background: #FFF0F0;
    border: 2px solid #E53935;
    border-radius: 6px;
    padding: 8px 20px;
    line-height: zS;
    letter-spacing: -0.5px;
    margin-bottom: 28px;
    word-break: keep-all;
  z

  .cta-button zpx;
    font-weight: 700;
    color: #FFFFFF;
    background: #1A3A5C;
    border-radius: 8px;
    padding: 22px 60px;
    line-height: z5;
    letter-spacing: -0.5px;
    cursor: pointer;
  uJ  
</style>
</head>
<body>
<div class="canvas">
  <div class="content">

    <!-- 상단 라벨 영역 -->
    <div class="top-section">
      <div class="top-label">T.O.P 사업단</div>
      <div class="sub-label">인카금융서비스 코스닥 상장</div>
      <div class="divider"></div>
    </div>

    <!-- 중간 메인 카피 영역 -->
    <div class="middle-section">
      <div class="headline">신입 최대<br>1,000만원</div>
      <div class="sub-copy">경력직 직전연봉 50%</div>
      <div class="support-text">지금이 기회입니다</div>
    </div>

    <!-- 하단 배지 + CTA -->
    <div class="bottom-section">
      <div class="urgent-badge">정착지원금 2026.7월 변경 예정</div>
      <br>
      <div class="cta-button">지금 상담 신청하기</div>
    </div>

  </div>
</div>
</body>
</html>
c                     t         j                  j                  dt        t                     ddl} | j                  t              S )u   Gemini SA 토큰 획득r   N)syspathinsertstrTOOL_DIRgcloud_authget_service_account_tokenGEMINI_SCOPE)r   s    W/home/jay/workspace/.worktrees/task-2057-dev2/tools/ai-image-gen/gen_14_svg_first_v2.pyget_gemini_tokenr      s,    HHOOAs8}%00>>    c           	        t         j                         rt        dt                 yt        d       d}t         d| d}d|  dd	}d
dt        igigdddgid}t        j
                         }t        j                  |||d      }|j                  dv rgt        d| d|j                   d       dD ]F  }t         d| d}t        j                  |||d      }|j                  dk(  s8t        d|         n |j                          t        j
                         |z
  }	|j                         }
|
j                  dg       }|s$t        dt        j                  |
      dd        |d   j                  di       j                  d
g       }d}|D ]
  }d|v s|} n |t        d       y|d   j                  dd       }t        j                  |d   d!         }t         j                   j#                  d"d"#       t         j%                  |       t        d$t         j&                   d%t)        |      d&d'|	d(d)       y)*u%   Gemini API로 배경 이미지 생성u)   [배경] 기존 배경 이미지 사용: Nu*   [배경] Gemini AI로 배경 생성 중...zgemini-3.1-flash-image-previewz/models/z:generateContentzBearer zapplication/json)AuthorizationzContent-TypepartstextresponseModalitiesIMAGETEXT)contentsgenerationConfigi,  )headersjsontimeout)i  i  i  u   [배경] 모델 u    실패 (HTTP u   ), fallback 시도...)zgemini-3-pro-image-previewzgemini-2.5-flash-image   u   [배경] Fallback 성공: 
candidatesu1   배경 생성 실패: candidates 없음. 응답: r   content
inlineDatau<   [배경] 이미지 데이터 없음 — 흰색 배경 사용mimeTypez
image/jpegdataTparentsexist_oku   [배경] 완료:  (,z bytes, z.1fu   초))BG_PATHexistsprintGEMINI_API_BASE	BG_PROMPTtimerequestspoststatus_coderaise_for_statusr&   getRuntimeErrordumpsbase64	b64decodeparentmkdirwrite_bytesnamelen)tokenmodel_idurlr%   payloadstartresponsefallback_modelurl2elapsedr-   r)   r   
image_partpart	mime_typeimage_bytess                    r   generate_backgroundrT      sp   ~~9'CD	
67/HXhZ/?
@C"5'**G
  34561GV3DEG
 IIKE}}S'MH . 
.9M9M8NNcde
 	N &&h~.>>NOD}}T7RUVH##s*2>2BCD	 iikE!G==?D,+JNtzzZ^O_`dadOeNfghhqMi,00"=EJ 4J
 LM<(,,ZFI"":l#;F#CDKNN5$	gll^2c+.>q-A'RUVZ
[\r   c           	        t        d       t        j                  d|       }t        j                  j                  dd       t        j                  |d       t        d       t               5 }|j                  j                  dd	g
      }	 |j                  ddd      }	 t        d      }|j                         r\|j                  d      D ]H  }d}|j                  }d|v sd|v rd}nd|v sd|v rd}n
d|v sd|v rd}|j                  d| d| d       J dt        j#                          }
|j%                  |
d       |j'                  d       t(        j                  j                  dd       |j+                  t-        t(              d d!"       t        d#t(                |j/                          	 ddd       y# t         $ r}	t        d|	        Y d}	~	d}	~	ww xY w# |j/                          w xY w# 1 sw Y   yxY w)$u3   Playwright로 HTML 오버레이를 PNG로 렌더링u&   [HTML] 오버레이 HTML 생성 중...z
{{BG_URL}}Tr.   zutf-8)encodingu*   [Playwright] 브라우저 렌더링 중...z--font-render-hinting=nonez#--disable-font-subpixel-positioning)argsi8  )widthheight)viewportz'/home/jay/.local/share/fonts/Pretendardz*.ttf400Bold700	ExtraBold800Black900a  
                            const style = document.createElement('style');
                            style.textContent = `
                              @font-face {
                                font-family: 'Pretendard';
                                src: url('file://zD') format('truetype');
                                font-weight: z;
                                font-style: normal;
                              }
                            `;
                            document.head.appendChild(style);
                        u&   [폰트] Pretendard 로드 건너뜀: Nfile://networkidle)
wait_untili  pngF)r   type	full_pageu	   [캡처] )r5   HTML_TEMPLATEreplace	HTML_PATHrB   rC   
write_textr   chromiumlaunchnew_pager   r4   globstemadd_init_script	Exceptionresolvegotowait_for_timeoutOUTPUT_PATH
screenshotr   close)bg_urlhtml_contentpbrowserpagepretendard_dir	font_fileweightrE   ehtml_file_urls              r   render_html_to_pngr   #  s   	
23 ((v>L4$78	
67		 +a**##.0UV $ 
'	##tt-L#MDD!%&O!P!((*%3%8%8%A 	!&(~~!T>Ud]%*F(D0ETM%*F$_%*F,, 22
 3< =..4X 6. 0 &i&7&7&9%:;MIImI>!!$'$$TD$AOO[!1OOIk]+,MMOW+ +@  D>qcBCCD MMOW+ +sP   /G>G)%A7GBG)+G>	G&G!G)!G&&G))G;;G>>Hc                    t        d       t        d       t        d       t        d       	 t               } t        dt        |        d       t        d       | r	 t	        |        t
        j                         rdt
        j                          }nd}t        d       t        d       t        |       t        dt                t        j                  t        t              t        t                     t        j                         j                  dz  }t        d       t        d       t        dt         d|dd       t        dt                t        d       y # t        $ r&}t        d|        t        d       d } Y d }~@d }~ww xY w# t        $ r$}t        d	|        t        d
       Y d }~Wd }~ww xY w)Nz<============================================================u4   #14 SVG-first 배너 v2 생성 시작 (hybrid-image)u%   
[1/4] Gemini 인증 토큰 획득...u'   [인증] 토큰 획득 성공 (길이: z chars)u&   [경고] Gemini 토큰 획득 실패: u/   [경고] 흰색 배경으로 진행합니다...u!   
[2/4] 배경 이미지 생성...u   [경고] 배경 생성 실패: u&   [경고] 흰색 배경으로 진행...rb   r   u!   [배경] 흰색 배경 CSS 사용u%   
[3/4] HTML 오버레이 렌더링...u   
[4/4] 파일 복사: i   z=
============================================================u   완료!z  sample-v2.png    : r1   z.0fz KB)z  14-svg-first-v2  : )r5   r   rF   rr   rT   r3   r4   rs   r   	COPY_PATHshutilcopy2r   rv   statst_size)rG   r   ry   size_kbs       r   mainr   Y  s   	(O	
@A	(O 

23 "7E
|7KL 

./	<& ~~7??,-.12 

23v 
#I;
/0
LL[!3y>2  ((4/G	/	)	!+bT
BC	!)
-.	(OG  6qc:;?@  	<3A378:;;	<s/   "E& F &	F/FF	G!G  G__main__)returnr   )rG   r   r   None)ry   r   r   r   )r   r   )5__doc__
__future__r   r@   r&   osr   r   r8   pathlibr   r9   playwright.sync_apir   
gen_configr   r   r   r	   _CTA_PX
_SIZE_44PX
_SIZE_48PX
_SIZE_72PX
_METRIC_PX_LH_1_15_LH_1_2	_LH_RATIO_LH_1_4__file__rB   r   rv   r   r3   rj   r6   r   r7   joinmarginrX   BG_URLpositionflexfontsizedisplayrh   r   rT   r   r   __name__ r   r   <module>r      s   #   	  
    / U U 




	
 >  [[__	
X

+.F
Fx+-0NN	 EDb 
h h  h 56h7h 
 hh" 
  $H: &	
!h01h6  	5hFGhN 	 
MhPQhV 	Ia
|   Uh`ahf 	Iay   	ehrshx 
 whBChJ 	 
IhTUhZ 	Ia
|   Yhfghl 	Ia
|   	khz{h@ 	Ia
|   	hLMhT 	 
ShXYh^  y   ]hvwh|  |   
{hP QhV?:]z3l-` zF r   