a
    QhC                     @   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 ]\}}	}
}|j |
dd  \}}|j |
dd  \}}|dv rtddt||||gtddid|_|rt|	|jd	< |d
krt|	|jd< ntddt|	d|jd< ||j d|vrt |d< |d |jj q|D ]>}|\}}}| ||\}}||t|jd||dgg qd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_typeZlink_target	rectangleboxx1y1x2y2anchoranchor_namexy r:   O/var/www/sistema_ama/venv/lib/python3.9/site-packages/weasyprint/pdf/anchors.py	add_links   s<    

r<   c                 C   sX  t |}g }|D ]\}\}}}}	}
t| j| d||df}tt||d}| | t| |	|d\}}||d< |
dkr|d  d9  < n||7 }|r|d j|d< |j|d d	< |r|d j|d
< |d j|d< |dur|j|d< |	| q|du rP|rPt||d j|d jd}| | |D ]}|j|d< q2|j| j
d< ||fS )z!Include bookmark outlines in PDF.r   r   )Titler   )parentCountclosedPrevNextFirstLastNParent)r?   rD   rE   Outlines)lenr   r!   page_referencesr    r#   r$   add_outlinesr&   r%   catalog)r)   	bookmarksr>   countZoutlinestitler*   r8   r9   childrenstatedestinationoutlineZchildren_outlinesZchildren_countZoutlines_dictionaryr:   r:   r;   rJ   7   sF    




rJ   c           ,      C   s  | rt |  sdS d|vr(t |d< d|jvrPt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rt#|d* nd+}t||ji} d|d,< td-$|j%|d.< |r&d/| 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< n|j&d9krt'|}!t
(|||!}"|)|"\}"}#d:|"_*||"j+| g }$g }%|D ]V}&t|&jdd;}'t|&j,pDd;}(|$t|'|(g d<|&jv r|%|' qd=|d,< td-$|j%|d.< t|$|d7< d>|jv rd?|d@< t|%|d6< n$dA|d@< |%r|%dB ntd;|d6< || n|dCks|j&dDkrd})|jdEd;- dFkr2|)dG7 })tdHdI | |  D }*d|d,< td-$|j%|d.< t|jdd;|d6< dJ|d@< tdKdLt|jdM|*|)dN|dO< || nt'|}!t
(|||!}"|)|"\}"}#d:|"_*||"j+| dP|d,< td-$|j%|d.< t|jdd;|d6< |j&dQkrZdR|d@< t|j,pPd;|d6< n&|dSkrndT|d@< n|dUkrdV|d@< |dWd; }+. r|+|dX< || |d |j |jd d |j || vr|| | |< qdS )YzInclude form inputs in PDF.Nr   AcroFormtrue)FieldsZDRZNeedAppearancesr   r   c                 S   s,   g | ]$\}}|D ]\}}}||||fqqS r:   r:   ).0forminputselementstyler0   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checkboxrg   z/Btni   z/Off)FTFfrf   VKidsOptrU   g      ?l4      /XObject/Form)	Resourcesr   r   BBox)extraZaDbcheckedrl   onri       DA/ASNAPCAZMKrF   rk   rm   rf   selectT selectedz/Chmultiplei    rj   i   rA   submitbuttonmethodpost   c                 s   s   | ]}|j V  qd S )N)r&   )rV   fieldr:   r:   r;   	<genexpr>       zadd_forms.<locals>.<genexpr>i   r   z/SubmitFormaction)r   r   re   rU   Flagsr   z/Txtextarea   passwordi    filei   	maxlengthZMaxLen)/anyvaluesr   r!   rK   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_staterH   joinstreamtagr   Zpango_font_map_load_fontadd_fontused_in_formshashtextlowerisdigit),formsr(   r)   r*   	resourcesr   font_mapZpage_referencecontextZinputs_with_formsZradio_groupsirW   rY   rZ   r0   
input_typeZinput_valuedefault_nameZ
input_namera   field_streamr   group	characterwidthheightZchecked_streamr8   r9   rx   key
appearancefont_descriptionfont_optionsZselected_valuesoptionr]   r   flagsfields
max_lengthr:   r:   r;   	add_forms_   sF   
















r   c                 C   s  | D ]\}}}	}
|dkrq||vr@t ||jd}t|||||< || }|du rRq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rt |d< |d |j
 qdS )zInclude annotations in PDF.
attachment)urlurl_fetcherNr   rr   rs   )r   r   ru   r   z/FileAttachmentr~   z/N)r   r   r   rf   ZFSr   r}   r   )r   r   write_pdf_attachmentr   r   Streamr!   r$   r    r#   r&   r%   )r-   r(   documentr)   r*   annot_filescompressr/   Zannot_targetr0   r   r   Z
annot_filer   Zannotr:   r:   r;   add_annotations  sN    	
	
r   c                    s  d}d}d}z|j j\} }}t tr0   t trDt  t fdddD ]}|t|7 }||7 }qVW d   n1 s0    Y  W n@ t	y } z(t
d| t
jd|d W Y d}~dS d}~0 0 t|d	d
 |_|jr|j}	n*|rt|jrttt|j}	nd}	tj|	d	dd }
|
s8d}
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   r   c                      s
     dS )Nr   )readr:   sourcer:   r;   <lambda>W  r   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)errorsre   r   )r   re   ZUFEFZDesc)!r   
isinstancestrencodebytesioBytesIOiterrH   r   r   errordebugr   	hexdigestr`   r   pathr   r   	mimetypes
guess_typer   r#   createdstrftimemodifiedr    replacer   r$   r&   description)r)   r   r   r   Zuncompressed_lengthr   r   data	exceptionfilename	mime_typecreationmodZ
file_extraZfile_streampdf_attachmentr:   r   r;   r   J  s`    


,


r   c                 c   s   t  }g }t| D ]T\}}|g  |j D ]6\}\}}}}||vr.|d |||f || q.q| D ]d}g }	|jD ]D}
|
\}}}}|dkr||vrtd| q|	|
 qz|	|
 qz|	|	dfV  qld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.

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