o
    Zh0hC                     @   s   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
 ddlZddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZ dd ZdddZdd Zdd Zdd Zdd ZdS )z4Insert anchors, links, bookmarks and inputs in PDFs.    N)md5)basename)unquoteurlsplit   )
Attachment)LOGGER)ffigobjectpango)get_font_description)URLFetchingErrorc                 C   sB  | \}}|D ]v\}}	}
}|j |
dd  \}}|j |
dd  \}}|dv r|tddt||||gtddid|_|rGt|	|jd	< |d
krTt|	|jd< ntddt|	d|jd< ||j d|vrst |d< |d |jj q|D ]}|\}}}| ||\}}||t|jd||dgg qdS )z%Include hyperlinks in given PDF page.Nr   )internalexternal/Annotz/LinkWr   )TypeSubtypeRectBSContentsr   Dest/Actionz/URI)r   SURIAAnnots/XYZ)	transform_pointpydyf
DictionaryArraylink_annotationString
add_objectappend	reference)links_and_anchorsmatrixpdfpagenamesmarklinksanchors	link_typelink_target	rectangleboxx1y1x2y2anchoranchor_namexy r;   L/var/www/html/rh/venv/lib/python3.10/site-packages/weasyprint/pdf/anchors.py	add_links   s@   

r=   c                 C   sR  t |}g }|D ]r\}\}}}}	}
t| j| d||df}tt||d}| | t| |	|d\}}||d< |
dkrH|d  d9  < n||7 }|r\|d j|d< |j|d d	< |rl|d j|d
< |d j|d< |duru|j|d< |	| q|du r|rt||d j|d jd}| | |D ]}|j|d< q|j| j
d< ||fS )z!Include bookmark outlines in PDF.r   r   )Titler   )parentCountclosedPrevNextFirstLastNParent)r@   rE   rF   Outlines)lenr   r!   page_referencesr    r#   r$   add_outlinesr&   r%   catalog)r)   	bookmarksr?   countoutlinestitler*   r9   r:   childrenstatedestinationoutlinechildren_outlineschildren_countoutlines_dictionaryr;   r;   r<   rK   7   sF   




rK   c           ,      C   s  | rt |  s
dS d|vrt |d< d|jvr(tt |jdd|jd< |d  d }t	t
|tj}dd	 |  D }	tt}
tt} t|	D ]\}\}}}}g |j|dd
  |j|d
d  R }|jd}|jdd}d|  d| }|jd|}|d d }| }||d  tddt||jdt|d}|dv r|dkr||
| vrtddt|dt t d |
| |< }|| |jd d |j |
| | }|d d }d }nd!}|d
 |d  }|d" |d#  }|j|jd$d%tdd||fd&d'}|  |  ||d  |d(| ||d  d
 }||d  d
 }||| | | |!  |"  || |d(| d)|jv }|dkrpt#|d* nd+}t||ji} d|d,< td-$|j%|d.< |rd/| nd|d0< td1| i|d2< td3t|i|d4< || |dkr|j|d5< |rd/| |d6< |d* |j |d7 t| n{t||d8< |d0 |d6< nl|j&d9krzt'|}!t
(|||!}"|)|"\}"}#d:|"_*||"j+| g }$g }%|D ]+}&t|&jdd;}'t|&j,p!d;}(|$t|'|(g d<|&jv r8|%|' qd=|d,< td-$|j%|d.< t|$|d7< d>|jv rbd?|d@< t|%|d6< ndA|d@< |%rm|%dB ntd;|d6< || n|dCks|j&dDkrd})|jdEd;- dFkr|)dG7 })tdHdI | |  D }*d|d,< td-$|j%|d.< t|jdd;|d6< dJ|d@< tdKdLt|jdM|*|)dN|dO< || ntt'|}!t
(|||!}"|)|"\}"}#d:|"_*||"j+| dP|d,< td-$|j%|d.< t|jdd;|d6< |j&dQkr+dR|d@< t|j,p&d;|d6< n|dSkr5dT|d@< n	|dUkr>dV|d@< |dWd; }+. rM|+|dX< || |d |j |jd d |j || vrp|| | |< qQdS )YzInclude form inputs in PDF.Nr   AcroFormtrue)FieldsDRNeedAppearancesr   r   c                 S   s,   g | ]\}}|D ]\}}}||||fqqS r;   r;   ).0forminputselementstyler1   r;   r;   r<   
<listcomp>p   s    
zadd_forms.<locals>.<listcomp>r   typevalueYeszunknown--name	font_sizeg      ?colorr   z/Widget   )r   r   r   PFT)radiocheckboxrn   z/Btni   z/Off)FTFfrm   VKidsOptrZ   g      ?l4      /XObject/Form)	Resourcesr   r   BBox)extraZaDbcheckedrs   onrp       DA/ASNAPCAMKrG   rr   rt   rm   selectT selectedz/Chmultiplei    rq   i   rB   submitbuttonmethodpost   c                 s   s    | ]}|j V  qd S N)r&   )r]   fieldr;   r;   r<   	<genexpr>   s    zadd_forms.<locals>.<genexpr>i   r   z/SubmitFormaction)r   r   rl   rZ   Flagsr   z/Txtextarea   passwordi    filei   	maxlengthMaxLen)/anyvaluesr   r!   rL   r    r&   splitr	   gcr   pango_font_map_create_contextr
   g_object_unrefitemscollectionsdefaultdictdict	enumerater   attribgetdecodeclone	set_colorr#   r$   r%   
push_state
begin_textset_font_sizemove_text_toshow_text_stringend_text	pop_staterI   joinstreamtagr   pango_font_map_load_fontadd_fontused_in_formshashtextlowerisdigit),formsr(   r)   r*   	resourcesr   font_mappage_referencecontextinputs_with_formsradio_groupsir^   r`   ra   r1   
input_typeinput_valuedefault_name
input_namerh   field_streamr   group	characterwidthheightchecked_streamr9   r:   r   key
appearancefont_descriptionfont_optionsselected_valuesoptionrd   r   flagsfields
max_lengthr;   r;   r<   	add_forms_   sN  

















 r   c                 C   s  | D ]\}}}	}
|dkrq||vr t ||jd}t|||||< || }|du r)qg |j|	dd  |j|	dd  R }	tg ddt|	d|}|| tdt|	d	t	 |j
td
|j
idd}|| d|vryt |d< |d |j
 qdS )zInclude annotations in PDF.
attachment)urlurl_fetcherNr   ry   rz   )r   r   r|   r   z/FileAttachmentr   z/N)r   r   r   rm   FSr   r   r   )r   r   write_pdf_attachmentr   r   Streamr!   r$   r    r#   r&   r%   )r-   r(   documentr)   r*   annot_filescompressr/   annot_targetr1   r   r   
annot_filer   annotr;   r;   r<   add_annotations  sP   	

	r   c                    s  d}d}d}zB|j 5\} }}t tr   t tr"t  t fdddD ]}|t|7 }||7 }q+W d   n1 sBw   Y  W n  t	yh } zt
d| t
jd|d W Y d}~dS d}~ww t|d	d
 |_|jry|j}	n|rt|jrttt|j}	nd}	tj|	d	dd }
|
sd}
t|jd}t|jd}tdd|
dd td|j d|||dd}tj|g||d}| | tdt|	jddt|	td|jit|j pdd}| | |S )z&Write an attachment to the PDF stream.Nr       c                      s
     dS )Nr   )readr;   sourcer;   r<   <lambda>W  s   
 z&write_pdf_attachment.<locals>.<lambda>zFailed to load attachment: %szError while loading attachment:)exc_infoF)usedforsecurityzattachment.bin)strictzapplication/octet-streamzD:%Y%m%d%H%M%SZz/EmbeddedFiler   z#2f<>)CheckSumSizeCreationDateModDate)r   r   Params)r   z	/Filespecignore)errorsrl   r   )r   rl   UFEFDesc)!r   
isinstancestrencodebytesioBytesIOiterrI   r   r   errordebugr   	hexdigestrg   r   pathr   r   	mimetypes
guess_typer   r#   createdstrftimemodifiedr    replacer   r$   r&   description)r)   r   r   r   uncompressed_lengthr   r   data	exceptionfilename	mime_typecreationmod
file_extrafile_streampdf_attachmentr;   r   r<   r   J  sj   






r   c                 c   s    t  }g }t| D ]*\}}|g  |j D ]\}\}}}}||vr3|d |||f || qq
| D ]2}g }	|jD ]"}
|
\}}}}|dkr[||vrUtd| q>|	|
 q>|	|
 q>|	|	dfV  q7dS )a  Resolve internal hyperlinks.

    Links to a missing anchor are removed with a warning.

    If multiple anchors have the same name, the first one is used.

    :returns:
        A generator yielding lists (one per page) like :attr:`Page.links`,
        except that ``target`` for internal hyperlinks is
        ``(page_number, x, y)`` instead of an anchor name.
        The page number is a 0-based index into the :attr:`pages` list,
        and ``x, y`` are in CSS pixels from the top-left of the page.

    rB   r   z(No anchor #%s for internal URI referencer   N)
setr   r%   r.   r   addr-   r   r  pop)pagesr.   paged_anchorsr   r*   r8   point_xpoint_yr   
page_linkslinkr/   r;   r;   r<   resolve_links  s2   


r"  r   )__doc__r   r  r  hashlibr   os.pathr   urllib.parser   r   r   r   r   loggerr   text.ffir	   r
   r   
text.fontsr   urlsr   r=   rK   r   r   r   r"  r;   r;   r;   r<   <module>   s(    
$( :2<