o
    \c
G                     @   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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 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&de&de&fddZ'de(dejfddZ)de(de(dedge
e	e(  f fddZ*e'fde(de(deegef dedge
e	e  f fd d!Z+de(de(dedge
eeef  f fd"d#Z,e'fde(de(dee(gef dedge
e f f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cast)Document)Element)parseString)
ExpatError   )
StreamTypedeprecate_with_replacement)PdfReadError)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   *lib/python3.10/site-packages/PyPDF2/xmp.py	_identityQ   s   r   c              	   C   s$  t | }|d u rtd|  t|d}t|dpd}t|dp'd}t|dp0d}t|dp9d}t|d	pCd}|tj}|| d
 }	t|}
t|	}|dp_d}t		||||||
|}|dkrd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   )ZhoursZminutes)iso8601match
ValueErrorr&   groupdecimalZDecimalZto_integralZROUND_FLOORdatetimesplitZ	timedelta)r   matchesr   r   r   r    r"   r#   Zseconds_decZmilliseconds_decZsecondsZmillisecondsr$   ZdtZ	tzd_hoursZtzd_minutesr   r   r   _converter_dateU   s,   
r4   	namespacenameXmpInformationc                    s$   dddt tt  f fdd}|S )Nselfr7   r   c           	         s   | j i  }|r|S g }| d D ]$}|td}t|r;|D ]}|tdD ]}| |}|| q-q%q| j i }|| < |S )N ZBagli	cachegetget_elementgetElementsByTagNameNSRDF_NAMESPACElen	_get_textappend
setdefault)	r8   cachedretvalelementZbagsZbagitemr   ns_cacher6   r5   r   r   r=   s   s    
z_getter_bag.<locals>.get)r   r   strr5   r6   r=   r   rJ   r   _getter_bagp   s    rM   	converterc                    s&   dddt tt  f fdd}|S )Nr8   r7   r   c           	         s   | j i }|r|S g }| dD ]5}|td}t|r@|D ]}|tdD ]}| |} |}|| q-q%q | |}|| q| j i }||< |S )Nr9   ZSeqr:   r;   )	r8   rE   rF   rG   ZseqsseqrH   r   rI   rN   r6   r5   r   r   r=      s&   
z_getter_seq.<locals>.get)r   r   r   r5   r6   rN   r=   r   rP   r   _getter_seq   s   "rR   c                    s(   dddt tttf  f fdd}|S )Nr8   r7   r   c           	         s   | j i  }|r|S i }| d D ].}|td}t|r>|D ]}|tdD ]}| |}|||d< q-q%q| ||d< q| j i }|| < |S )Nr9   ZAltr:   zxml:langz	x-default)	r<   r=   r>   r?   r@   rA   rB   ZgetAttributerD   )	r8   rE   rF   rG   ZaltsZaltrH   r   rI   rJ   r   r   r=      s"   
z_getter_langalt.<locals>.get)r   r   r   rL   r   rJ   r   _getter_langalt   s   $rS   c                    s"   dddt t f fdd}|S )Nr8   r7   r   c                    s|   | j i }|r|S d }| dD ]}|j|jkr#|j}n| |} |d ur1 |}| j i }||< |S Nr9   )r<   r=   r>   nodeTypeATTRIBUTE_NODE	nodeValuerB   rD   )r8   rE   r   rG   rI   rP   r   r   r=      s   
z_getter_single.<locals>.get)r   r   rQ   r   rP   r   _getter_single   s   rX   c                	   @   s  e Zd ZdZdeddfddZedefddZde	d	e
deef ddfd
dZde	d	e
deef ddfddZdedededee fddZdedededee fddZdededee fddZdededee fddZdedef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Z0	 ede1j1fd0d1Z2e2j3d2e1j1ddfd3d1Z2eee/d4eZ4	 ede1j1fd5d6Z5e5j3d2e1j1ddfd7d6Z5eee/d8eZ6	 ede1j1fd9d:Z7e7j3d2e1j1ddfd;d:Z7eee/d<Z8	 edefd=d>Z9e9j3d2eddfd?d>Z9eee:d@Z;	 edefdAdBZ<e<j3d2eddfdCdBZ<eee:dDZ=	 edefdEdFZ>e>j3d2eddfdGdFZ>ede?eef fdHdIZ@dS )Jr7   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
    streamr   Nc              
   C   s`   || _ z| j  }t|}W n ty! } ztd| d }~ww |tdd | _i | _d S )Nz#XML in XmpInformation was invalid: ZRDFr   )	rY   get_datar   r   r   r?   r@   rdf_rootr<   )r8   rY   dataZdoc_rooter   r   r   __init__   s   

zXmpInformation.__init__c                 C      t ddd | jS )NrdfRootr[   4.0.0)r   r[   r8   r   r   r   r`         zXmpInformation.rdfRootencryption_keyc                 C   s   | j || d S r   )rY   write_to_streamr8   rY   rd   r   r   r   re      s   zXmpInformation.write_to_streamc                 C   s   t dd | || dS )zZ
        .. deprecated:: 1.28.0

            Use :meth:`write_to_stream` instead.
        writeToStreamre   N)r   re   rf   r   r   r   rg      s   
zXmpInformation.writeToStream	about_urir5   r6   c                 c   sV    | j tdD ] }|td|kr(|||}|d ur|V  |||E d H  qd S NZDescriptionZabout)r[   r?   r@   getAttributeNSZgetAttributeNodeNS)r8   rh   r5   r6   descattrr   r   r   r>      s   zXmpInformation.get_elementaboutUric                 C   s   t dd | |||S )zV
        .. deprecated:: 1.28.0

            Use :meth:`get_element` instead.
        
getElementr>   )r   r>   )r8   rm   r5   r6   r   r   r   rn      s   
zXmpInformation.getElementc                 c   st    | j tdD ]/}|td|kr7t|jjD ]}|j|}|j|kr(|V  q|j	D ]
}|j|kr6|V  q,qd S ri   )
r[   r?   r@   rj   rangeZ
attributeslengthrH   ZnamespaceURI
childNodes)r8   rh   r5   rk   irl   childr   r   r   get_nodes_in_namespace  s   


z%XmpInformation.get_nodes_in_namespacec                 C   s   t dd | ||S )za
        .. deprecated:: 1.28.0

            Use :meth:`get_nodes_in_namespace` instead.
        getNodesInNamespacert   )r   rt   )r8   rm   r5   r   r   r   ru     s   
z"XmpInformation.getNodesInNamespacerG   c                 C   s*   d}|j D ]}|j|jkr||j7 }q|S rT   )rq   rU   Z	TEXT_NODEr\   )r8   rG   textrs   r   r   r   rB   !  s   

zXmpInformation._get_textZcontributorZcoverageZcreatordatedescriptionformatZ
identifierlanguageZ	publisherZrelationZrightssourcesubjecttitletypeZKeywordsZ
PDFVersionZProducerZ
CreateDatec                 C   r_   Nxmp_createDatexmp_create_datera   r   r   rb   r   r   r   r     rc   zXmpInformation.xmp_createDater   c                 C      t ddd || _d S r   r   r8   r   r   r   r   r        
Z
ModifyDatec                 C   r_   Nxmp_modifyDatexmp_modify_datera   r   r   rb   r   r   r   r     rc   zXmpInformation.xmp_modifyDatec                 C   r   r   r   r   r   r   r   r     r   ZMetadataDatec                 C   r_   Nxmp_metadataDatexmp_metadata_datera   r   r   rb   r   r   r   r     rc   zXmpInformation.xmp_metadataDatec                 C   r   r   r   r   r   r   r   r     r   ZCreatorToolc                 C      t dd | jS Nxmp_creatorToolxmp_creator_toolr   r   rb   r   r   r   r        
zXmpInformation.xmp_creatorToolc                 C      t dd || _d S r   r   r   r   r   r   r        

Z
DocumentIDc                 C   r   Nxmpmm_documentIdxmpmm_document_idr   r   rb   r   r   r   r     r   zXmpInformation.xmpmm_documentIdc                 C   r   r   r   r   r   r   r   r     r   Z
InstanceIDc                 C   s   t dd tt| jS Nxmpmm_instanceIdxmpmm_instance_id)r   r
   rK   r   rb   r   r   r   r     s   
zXmpInformation.xmpmm_instanceIdc                 C   r   r   )r   r   r   r   r   r   r     r   c                 C   s   t | dsRi | _| dtD ]C}|j}	 |d}|dkrn|d| tt||d |d  d	d
 ||d d  }q|j|j	krG|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_propertiesr9   Tu   ↂr+   Nr         )base)hasattrr   rt   PDFX_NAMESPACEZ	localNamefindchrr&   rU   rV   rW   rB   )r8   Znodekeyidxr   r   r   r   custom_properties  s(   




z XmpInformation.custom_properties)A__name__
__module____qualname____doc__r   r^   property
XmlElementr`   r   r	   rK   bytesre   rg   r   r   r>   rn   rt   ru   rB   rM   DC_NAMESPACEZdc_contributorrX   Zdc_coveragerR   Z
dc_creatorr4   Zdc_daterS   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   r1   r   setterr   r   r   r   r   r   XMPMM_NAMESPACEr   r   r   r   r   r   r   r   r   r   r7      s    






)/r   r1   r0   retypingr   r   r   r   r   r   r   r	   r
   Zxml.dom.minidomr   r   r   r   Zxml.parsers.expatr   Z_utilsr   r   errorsr   Zgenericr   r   r@   r   r   r   r   r   compileVERBOSEr,   r   r   rK   r4   rM   rR   rS   rX   r7   r   r   r   r   <module>   sx    ,



