U
    –BÞbüF  ã                	   @   s´  d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ d	d
lmZmZ d	dlmZmZ dZdZdZdZdZ dZ!e "dej#¡Z$edƒZ%e%e%dœdd„Z&e'ejdœdd„Z(e'e'edge
e	e'  f dœdd„Z)e&fe'e'eegef edge
e	e  f dœdd„Z*e'e'edge
eeef  f dœd d!„Z+e&fe'e'ee'gef edge
e f dœd"d#„Z,G d$d„ deƒZ-dS )%zc
Anything related to XMP metadata.

See https://en.wikipedia.org/wiki/Extensible_Metadata_Platform
é    N)ÚAnyÚCallableÚDictÚIteratorÚListÚOptionalÚTypeVarÚUnion)ÚDocument)ÚElement)ÚparseString)Ú
ExpatError)ÚPdfReadErroré   )Ú
StreamTypeÚdeprecate_with_replacement)ÚContentStreamÚ	PdfObjectz+http://www.w3.org/1999/02/22-rdf-syntax-ns#z http://purl.org/dc/elements/1.1/zhttp://ns.adobe.com/xap/1.0/zhttp://ns.adobe.com/pdf/1.3/zhttp://ns.adobe.com/xap/1.0/mm/zhttp://ns.adobe.com/pdfx/1.3/a{  
        (?P<year>[0-9]{4})
        (-
            (?P<month>[0-9]{2})
            (-
                (?P<day>[0-9]+)
                (T
                    (?P<hour>[0-9]{2}):
                    (?P<minute>[0-9]{2})
                    (:(?P<second>[0-9]{2}(.[0-9]+)?))?
                    (?P<tzd>Z|[-+][0-9]{2}:[0-9]{2})
                )?
            )?
        )?
        ÚK©ÚvalueÚreturnc                 C   s   | S ©N© )r   r   r   ú./tmp/pip-unpacked-wheel-weujb6sz/PyPDF2/xmp.pyÚ	_identityQ   s    r   c              	   C   s(  t  | ¡}|d kr td| › �ƒ‚t| d¡ƒ}t| d¡p<dƒ}t| d¡pNdƒ}t| d¡p`dƒ}t| d¡prdƒ}t | d	¡p†d¡}| tj¡}|| d
 }	t|ƒ}
t|	ƒ}| d¡p¾d}t	 	||||||
|¡}|dk�r$dd„ | 
d¡D ƒ\}}|d9 }|dk �r|d9 }|t	j||d� }|S )NzInvalid date format: ÚyearÚmonthÚ1ÚdayÚhourÚ0ÚminuteÚsecondi@B ÚtzdÚZc                 s   s   | ]}t |ƒV  qd S r   )Úint)Ú.0Úxr   r   r   Ú	<genexpr>h   s     z"_converter_date.<locals>.<genexpr>ú:éÿÿÿÿr   )ÚhoursÚminutes)Úiso8601ÚmatchÚ
ValueErrorr&   ÚgroupÚdecimalÚDecimalÚto_integralÚROUND_FLOORÚdatetimeÚsplitÚ	timedelta)r   Úmatchesr   r   r   r    r"   r#   Zseconds_decZmilliseconds_decÚsecondsZmillisecondsr$   ÚdtZ	tzd_hoursZtzd_minutesr   r   r   Ú_converter_dateU   s,    


r<   ÚXmpInformation)Ú	namespaceÚnamer   c                    s"   dt tt  dœ‡ ‡fdd„}|S )Nr=   ©Úselfr   c           	         s’   | j  ˆi ¡ ˆ ¡}|r|S g }|  dˆˆ ¡D ]H}| td¡}t|ƒr.|D ]*}| td¡D ]}|  |¡}| |¡ qZqJq.| j  ˆi ¡}||ˆ < |S )NÚ ZBagÚli©	ÚcacheÚgetÚget_elementÚgetElementsByTagNameNSÚRDF_NAMESPACEÚlenÚ	_get_textÚappendÚ
setdefault)	rA   ÚcachedÚretvalÚelementZbagsZbagÚitemr   Úns_cache©r?   r>   r   r   rF   s   s    
z_getter_bag.<locals>.get)r   r   Ústr©r>   r?   rF   r   rS   r   Ú_getter_bagp   s    rV   )r>   r?   Ú	converterr   c                    s$   dt tt  dœ‡ ‡‡fdd„}|S )Nr=   r@   c           	         s´   | j  ˆi ¡ ˆ¡}|r|S g }|  dˆˆ¡D ]j}| td¡}t|ƒr€|D ]2}| td¡D ] }|  |¡}ˆ |ƒ}| |¡ qZqJq.ˆ |  |¡ƒ}| |¡ q.| j  ˆi ¡}||ˆ< |S )NrB   ZSeqrC   rD   )	rA   rN   rO   rP   ZseqsÚseqrQ   r   rR   ©rW   r?   r>   r   r   rF   ‰   s"    
z_getter_seq.<locals>.get)r   r   r   ©r>   r?   rW   rF   r   rY   r   Ú_getter_seq†   s     r[   c                    s&   dt tttf  dœ‡ ‡fdd„}|S )Nr=   r@   c           	         s¦   | j  ˆi ¡ ˆ ¡}|r|S i }|  dˆˆ ¡D ]\}| td¡}t|ƒr||D ].}| td¡D ]}|  |¡}||| d¡< qZqJq.|  |¡|d< q.| j  ˆi ¡}||ˆ < |S )NrB   ZAltrC   zxml:langz	x-default)	rE   rF   rG   rH   rI   rJ   rK   ÚgetAttributerM   )	rA   rN   rO   rP   ZaltsZaltrQ   r   rR   rS   r   r   rF   £   s    
z_getter_langalt.<locals>.get)r   r   r   rU   r   rS   r   Ú_getter_langalt    s    "r]   c                    s    dt t dœ‡ ‡‡fdd„}|S )Nr=   r@   c                    s€   | j  ˆi ¡ ˆ¡}|r|S d }|  dˆˆ¡D ]&}|j|jkrF|j}n
|  |¡} qVq.|d k	rfˆ |ƒ}| j  ˆi ¡}||ˆ< |S ©NrB   )rE   rF   rG   ÚnodeTypeÚATTRIBUTE_NODEÚ	nodeValuerK   rM   )rA   rN   r   rP   rR   rY   r   r   rF   »   s    
z_getter_single.<locals>.get)r   r   rZ   r   rY   r   Ú_getter_single¸   s    rb   c                   @   sD  e Zd ZdZeddœdd„Zeedœdd„ƒZe	e
deef dd	œd
d„Ze	e
deef dd	œdd„Zeeeee dœdd„Zeeeee dœdd„Zeeee dœdd„Zeeee dœdd„Zeedœdd„ZeeedƒƒZeeedƒƒZeeedƒƒZeeed eƒƒZeeed!ƒƒZ eeed"ƒƒZ!eeed#ƒƒZ"eeed$ƒƒZ#eeed%ƒƒZ$eeed&ƒƒZ%eeed'ƒƒZ&eeed(ƒƒZ'eeed)ƒƒZ(eeed*ƒƒZ)eeed+ƒƒZ*eee+d,ƒƒZ,eee+d-ƒƒZ-eee+d.ƒƒZ.eee/d/eƒƒZ0ee1j1dœd0d1„ƒZ2e2j3e1j1dd2œd3d1„ƒZ2eee/d4eƒƒZ4ee1j1dœd5d6„ƒZ5e5j3e1j1dd2œd7d6„ƒZ5eee/d8eƒƒZ6ee1j1dœd9d:„ƒZ7e7j3e1j1dd2œd;d:„ƒZ7eee/d<ƒƒZ8eedœd=d>„ƒZ9e9j3edd2œd?d>„ƒZ9eee:d@ƒƒZ;eedœdAdB„ƒZ<e<j3edd2œdCdB„ƒZ<eee:dDƒƒZ=eedœdEdF„ƒZ>e>j3edd2œdGdF„ƒZ>ee?eef dœdHdI„ƒZ@dS )Jr=   zµ
    An object that represents Adobe XMP metadata.
    Usually accessed by :py:attr:`xmp_metadata()<PyPDF2.PdfReader.xmp_metadata>`

    :raises: PdfReadError if XML is invalid
    N)Ústreamr   c              
   C   sj   || _ z| j  ¡ }t|ƒ}W n0 tk
rL } ztd|› �ƒ‚W 5 d }~X Y nX | td¡d | _i | _d S )Nz#XML in XmpInformation was invalid: ZRDFr   )	rc   Úget_datar   r   r   rH   rI   Úrdf_rootrE   )rA   rc   ÚdataZdoc_rootÚer   r   r   Ú__init__×   s    
  ÿþzXmpInformation.__init__)r   c                 C   s   t dddƒ | jS )NÚrdfRootre   ú4.0.0)r   re   ©rA   r   r   r   ri   ã   s    zXmpInformation.rdfRoot)rc   Úencryption_keyr   c                 C   s   | j  ||¡ d S r   )rc   Úwrite_to_stream©rA   rc   rl   r   r   r   rm   è   s    zXmpInformation.write_to_streamc                 C   s   t ddƒ |  ||¡ dS )zZ
        .. deprecated:: 1.28.0

            Use :meth:`write_to_stream` instead.
        ÚwriteToStreamrm   N)r   rm   rn   r   r   r   ro   í   s    
zXmpInformation.writeToStream)Ú	about_urir>   r?   r   c                 c   sT   | j  td¡D ]@}| td¡|kr| ||¡}|d k	r<|V  | ||¡E d H  qd S ©NÚDescriptionZabout)re   rH   rI   ÚgetAttributeNSZgetAttributeNodeNS)rA   rp   r>   r?   ÚdescÚattrr   r   r   rG   ø   s    zXmpInformation.get_element)ÚaboutUrir>   r?   r   c                 C   s   t ddƒ |  |||¡S )zV
        .. deprecated:: 1.28.0

            Use :meth:`get_element` instead.
        Ú
getElementrG   )r   rG   )rA   rv   r>   r?   r   r   r   rw      s    
zXmpInformation.getElement)rp   r>   r   c                 c   sr   | j  td¡D ]^}| td¡|krt|jjƒD ] }|j |¡}|j|kr.|V  q.|j	D ]}|j|krV|V  qVqd S rq   )
re   rH   rI   rs   ÚrangeÚ
attributesÚlengthrQ   ZnamespaceURIÚ
childNodes)rA   rp   r>   rt   Úiru   Úchildr   r   r   Úget_nodes_in_namespace  s    


z%XmpInformation.get_nodes_in_namespace)rv   r>   r   c                 C   s   t ddƒ |  ||¡S )za
        .. deprecated:: 1.28.0

            Use :meth:`get_nodes_in_namespace` instead.
        ÚgetNodesInNamespacer~   )r   r~   )rA   rv   r>   r   r   r   r     s    
z"XmpInformation.getNodesInNamespace)rP   r   c                 C   s*   d}|j D ]}|j|jkr
||j7 }q
|S r^   )r{   r_   Z	TEXT_NODErf   )rA   rP   Útextr}   r   r   r   rK   !  s
    
zXmpInformation._get_textZcontributorZcoverageZcreatorÚdateÚdescriptionÚformatÚ
identifierÚlanguageZ	publisherZrelationZrightsÚsourceÚsubjectÚtitleÚtypeZKeywordsZ
PDFVersionZProducerZ
CreateDatec                 C   s   t dddƒ | jS ©NÚxmp_createDateÚxmp_create_daterj   ©r   rŒ   rk   r   r   r   r‹   ‘  s    zXmpInformation.xmp_createDater   c                 C   s   t dddƒ || _d S rŠ   r�   ©rA   r   r   r   r   r‹   –  s    Z
ModifyDatec                 C   s   t dddƒ | jS ©NÚxmp_modifyDateÚxmp_modify_daterj   ©r   r‘   rk   r   r   r   r�   £  s    zXmpInformation.xmp_modifyDatec                 C   s   t dddƒ || _d S r�   r’   rŽ   r   r   r   r�   ¨  s    ZMetadataDatec                 C   s   t dddƒ | jS ©NÚxmp_metadataDateÚxmp_metadata_daterj   ©r   r•   rk   r   r   r   r”   ¶  s    zXmpInformation.xmp_metadataDatec                 C   s   t dddƒ || _d S r“   r–   rŽ   r   r   r   r”   »  s    ZCreatorToolc                 C   s   t ddƒ | jS ©NÚxmp_creatorToolÚxmp_creator_tool©r   r™   rk   r   r   r   r˜   Ã  s    
zXmpInformation.xmp_creatorToolc                 C   s   t ddƒ || _d S r—   rš   rŽ   r   r   r   r˜   È  s    
Z
DocumentIDc                 C   s   t ddƒ | jS ©NÚxmpmm_documentIdÚxmpmm_document_id©r   r�   rk   r   r   r   rœ   Ò  s    
zXmpInformation.xmpmm_documentIdc                 C   s   t ddƒ || _d S r›   rž   rŽ   r   r   r   rœ   ×  s    
Z
InstanceIDc                 C   s   t ddƒ | jS ©NÚxmpmm_instanceIdÚxmpmm_instance_id©r   r¡   rk   r   r   r   r    â  s    
zXmpInformation.xmpmm_instanceIdc                 C   s   t ddƒ || _d S rŸ   r¢   rŽ   r   r   r   r    ç  s    
c                 C   s¨   t | dƒs¢i | _|  dt¡D ]„}|j}| d¡}|dkr:qx|d|… tt||d |d … dd	�ƒ ||d d…  }q&|j|j	krŒ|j
}n
|  |¡}|| j|< q| jS )
zÁ
        Retrieve custom metadata properties defined in the undocumented pdfx
        metadata schema.

        :return: a dictionary of key/value items for custom metadata properties.
        Ú_custom_propertiesrB   u   â†‚r+   Nr   é   é   )Úbase)Úhasattrr£   r~   ÚPDFX_NAMESPACEZ	localNameÚfindÚchrr&   r_   r`   ra   rK   )rA   ÚnodeÚkeyÚidxr   r   r   r   Úcustom_propertiesì  s$    


ÿþÿ
z XmpInformation.custom_properties)AÚ__name__Ú
__module__Ú__qualname__Ú__doc__r   rh   ÚpropertyÚ
XmlElementri   r   r	   rT   Úbytesrm   ro   r   r   rG   rw   r~   r   rK   rV   ÚDC_NAMESPACEZdc_contributorrb   Zdc_coverager[   Z
dc_creatorr<   Zdc_dater]   Zdc_descriptionZ	dc_formatZdc_identifierZdc_languageZdc_publisherZdc_relationZ	dc_rightsZ	dc_sourceZ
dc_subjectZdc_titleZdc_typeÚPDF_NAMESPACEZpdf_keywordsZpdf_pdfversionZpdf_producerÚXMP_NAMESPACErŒ   r6   r‹   Úsetterr‘   r�   r•   r”   r™   r˜   ÚXMPMM_NAMESPACEr�   rœ   r¡   r    r   r®   r   r   r   r   r=   Ï   s     þ þ	  þ þ
ÿ
ÿ
ÿ	).r²   r6   r2   ÚreÚtypingr   r   r   r   r   r   r   r	   Zxml.dom.minidomr
   r   r´   r   Úxml.parsers.expatr   ZPyPDF2.errorsr   Ú_utilsr   r   Zgenericr   r   rI   r¶   r¸   r·   rº   r¨   ÚcompileÚVERBOSEr.   r   r   rT   r<   rV   r[   r]   rb   r=   r   r   r   r   Ú<module>   s^   (
ð þÿ  þ þÿ  þ