
    @wg$K                     H   U d Z dZd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
m
Z
mZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZ ej4                  dd
 dk\  rddlmZ nddlmZ ddlmZmZm Z  eee!e!e!f   ee!e!e!f   ee!e!e!f   f   Z"ee#d<   ee!e!e!e!e!e!f   Z$ee#d<   ee   Z%ee&e%f   Z'dee&   dee
   fdZ(de&de&de&fdZ)dLde%dee*   de+fdZ,de%de+fdZ-de%de.fdZ/de+de.fdZ0de%ddfdZ1de%dee+   de+fd Z2de%d!e*de+fd"Z3de%de+fd#Z4d$e"d%e"de"fd&Z5de%ddfd'Z6ed%e&de*fd(       Z7ed%e+de+fd)       Z7ed%e*de*fd*       Z7d%ee*e&e+f   dee*e+f   fd+Z7d,Z8d-js                  e8      Z:d.e:z   d/z   Z;dMd0e&d1e*ddfd2Z<d0e&ddfd3Z=d4e&d5e&d6e&ddfd7Z>d4e&d5e&d6e&ddfd8Z?d9e&d6e&ddfd:Z@d9e&d6e&ddfd;ZAd0e&d<e&ddfd=ZBd0e&d<e&ddfd>ZC	 dNd?e&d@ee&ef   dAee&e&f   dBe.ddf
dCZDdDe*de&fdEZE G dF dG      ZFe	 G dH dI             ZGej                   G dJ dK             ZIy)Oz"Utility functions for PDF library.zMathieu Fenniakzbiziqe@mathieu.fenniak.net    N)	dataclass)datetimetimezone)DEFAULT_BUFFER_SIZE)SEEK_CUR)	IOAnyDictListOptionalPatternTupleUnionoverload   )   
   )	TypeAlias   )STREAM_TRUNCATED_PREMATURELYDeprecationErrorPdfStreamErrorTransformationMatrixTypeCompressedTransformationMatrixtextreturnc                 4   | }| y | d   j                         rd| z   } | j                  d      r| dz  } | j                  dd      j                  dd      j                  dd	      } t        | j	                  d      | j	                  d
            }|dkD  r|t        |       dz
  k7  r| dz  } dD ]M  }	 t        j                  | |      }| j                  d      r |j                  t        j                        }|c S  t        d|       # t        $ r Y iw xY w)Nr   zD:)Zz0000r   +r   ' -   00)zD:%YzD:%Y%mzD:%Y%m%dz
D:%Y%m%d%HzD:%Y%m%d%H%MzD:%Y%m%d%H%M%SzD:%Y%m%d%H%M%S%zz+0000)tzinfozCan not convert date: )isdigitendswithreplacemaxfindlenr   strptimer   utc
ValueError)r   orgtextifds        C/var/www/horilla/myenv/lib/python3.12/site-packages/pypdf/_utils.pyparse_iso8824_dater6   L   s   G|Awd{}}Z <<S!))#s3;;CDDDIIcNDIIcN+A1uc$i!m# 	!!$*A }}W%IIX\\I2H!" -gY7
88  		s   1D	DDheader1header2c                     d}g }| |v r |j                  |j                  |              ||v r |j                  |j                  |             t        |      dk(  rt        d| d|d      |t	        |         S )N)z%PDF-1.3z%PDF-1.4z%PDF-1.5z%PDF-1.6z%PDF-1.7z%PDF-2.0r   zNeither z nor z are proper headers)appendindexr-   r0   r+   )r7   r8   versionspdf_header_indicess       r5   _get_max_pdf_version_headerr>   l   s    H (!!(.."9:(!!(.."9:
!#8G;eG;>QRSSC*+,,    streammaxcharsc                     d}	 | j                  d      }|j                         s|s	 |S ||z  }t        |      |k(  r	 |S =)a<  
    Read non-whitespace characters and return them.

    Stops upon encountering whitespace or when maxchars is reached.

    Args:
        stream: The data stream from which was read.
        maxchars: The maximum number of bytes returned; by default unlimited.

    Returns:
        The data which was read.

    r?   r   )readisspacer-   )r@   rA   txttoks       r5   read_until_whitespacerG      sR     C
kk!n;;= J 	s
s8xJ r?   c                 l    | j                  d      }|t        v r| j                  d      }|t        v r|S )z
    Find and read the next non-whitespace character (ignores whitespace).

    Args:
        stream: The data stream from which was read.

    Returns:
        The data which was read.

    r   )rC   WHITESPACESr@   rF   s     r5   read_non_whitespacerK      s5     ++a.C

kk!n 
Jr?   c                 p    t         d   }d}|t         v r| j                  d      }|dz  }|t         v r|dkD  S )a  
    Similar to read_non_whitespace, but return a boolean if more than one
    whitespace character was read.

    Args:
        stream: The data stream from which was read.

    Returns:
        True if more than one whitespace was skipped, otherwise return False.

    r   r   )rI   rC   )r@   rF   cnts      r5   skip_over_whitespacerN      sE     a.C
C

kk!nq 
 7Nr?   valuec                 Z    t        t        |             D ]  }| ||dz    }|t        vs y y)z
    Check if the given value consists of whitespace characters only.

    Args:
        value: The bytes to check.

    Returns:
        True if the value only has whitespace characters, otherwise return False.

    r   FT)ranger-   rI   )rO   r;   currents      r5   check_if_whitespace_onlyrS      s<     s5z" 	*+% r?   c                     | j                  d      }| j                  dd       |dk(  r,|dvr'| j                  d      }|dk(  rt        d      |dvr&y y y )Nr      %)   
   r?   zFile ended unexpectedly.)rC   seekr   rJ   s     r5   skip_over_commentrZ      s[    
++a.C
KKA
d{'++a.Ccz$%?@@ ' r?   regexc                    d}	 | j                  d      }|s|S |j                  ||z         }|Q| j                  |j                         t	        |      t	        |      z   z
  d       ||z   d|j                          }	 |S ||z  })z
    Read until the regular expression pattern matched (ignore the match).
    Treats EOF on the underlying stream as the end of the token to be matched.

    Args:
        regex: re.Pattern

    Returns:
        The read bytes.

    r?      Nr   )rC   searchrY   startr-   )r@   r[   namerF   ms        r5   read_until_regexrb      s     D
kk"oKLL$=KK	SYS%9:A>3J!''),DK 	 r?   to_readc                     | j                         |k  rt        d      | j                  | t               | j	                  |      }| j                  | t               |S )a  
    Given a stream at position X, read a block of size to_read ending at position X.

    This changes the stream's position to the beginning of where the block was
    read.

    Args:
        stream:
        to_read:

    Returns:
        The data which was read.

    z!Could not read malformed PDF file)tellr   rY   r   rC   )r@   rc   rC   s      r5   read_block_backwardsrf      sQ     {{}w@AA
KK(#;;wD
KK(#Kr?   c                    g }d}| j                         dk(  rt        t              	 t        t        | j                               }|dk(  rnt        | |      }t        |      dz
  }|s%|dk\  r||   dvr|dz  }|dk\  r||   dvr|dk\  rd}|r6|j                  ||dz   d        |dk\  r+||   dv r$|dz  }|dk\  r||   dv rn|j                  |       |dk\  r| j                  |dz   t               ndj                  |ddd         S )	a  
    Given a byte stream with current position X, return the previous line.

    All characters between the first CR/LF byte found before X
    (or, the start of the file, if no such byte is found) and position X
    After this call, the stream will be positioned one byte after the
    first non-CRLF character found beyond the first CR/LF byte before X,
    or, if no such byte is found, at the beginning of the stream.

    Args:
        stream: StreamType:

    Returns:
        The data which was read.

    Fr   Tr   s   
Nr?   rU   )re   r   r   minr   rf   r-   r:   rY   r   join)r@   line_content
found_crlfrc   blockidxs         r5   read_previous_linern     s?   " LJ{{}9::
)6;;=9a< %VW5%j1n (uSz8q (uSz8ax!

 cAgi 01(uSzW4q (uSzW4
 &!8 KKa*A D 88L2&''r?   abc                 ,    t        fd| D              S )Nc              3   T   K   | ]  t        fd t         D                 yw)c              3   V   K   | ]   }t        d  t        |      D               " yw)c              3   P   K   | ]  \  }}t        |      t        |      z     y wN)float).0r2   js      r5   	<genexpr>z6matrix_multiply.<locals>.<genexpr>.<genexpr>.<genexpr>J  s!     @$!Q%(U1X%@s   $&N)sumzip)rw   colrows     r5   ry   z,matrix_multiply.<locals>.<genexpr>.<genexpr>J  s"     TSc@#c3-@@Ts   &)N)tupler{   )rw   r}   rp   s    @r5   ry   z"matrix_multiply.<locals>.<genexpr>I  s)       	TCQRGTTs   $()r~   )ro   rp   s    `r5   matrix_multiplyr   F  s        r?   c                 8   d}| j                  | d       t        dd      5 }|j                  | j                  |             |j                  d       |j                  | j                  |             ddd       | j                  | d       y# 1 sw Y   xY w)z5Create text file showing current location in context.i  r   zpypdf_pdfLocation.txtwbs   HEREN)rY   openwriterC   )r@   radius	output_fhs      r5   mark_locationr   O  s     F
KK	%t	, -	F+, F+,- KK	- -s   ABBc                      y ru    rp   s    r5   ord_r   [      r?   c                      y ru   r   r   s    r5   r   r   `  r   r?   c                      y ru   r   r   s    r5   r   r   e  r   r?   c                 <    t        | t              rt        |       S | S ru   )
isinstancestrordr   s    r5   r   r   j  s    !S1vHr?   )    rW   rX      	    r?      [   ]msg
stacklevelc                 <    t        j                  | t        |       y )N)r   )warningswarnDeprecationWarning)r   r   s     r5   	deprecater   u  s    MM#)jAr?   c                     t        |       ru   )r   )r   s    r5   deprecationr   y  s    
3
r?   old_namenew_name
removed_inc                 .    t        |  d| d| dd       y)zIRaise an exception that a feature will be removed, but has a replacement., is deprecated and will be removed in pypdf . Use 	 instead.   Nr   r   r   r   s      r5   deprecate_with_replacementr   }  s'    *@FS[R\\ef	r?   c                 ,    t        |  d| d| d       y)zMRaise an exception that a feature was already removed, but has a replacement.( is deprecated and was removed in pypdf r   r   Nr   r   s      r5   deprecation_with_replacementr     s"    *<ZLxjXabr?   r`   c                 (    t        |  d| dd       y)zFRaise an exception that a feature will be removed without replacement.r   .r   Nr   r`   r   s     r5   deprecate_no_replacementr     s    B:,aPRSTr?   c                 &    t        |  d| d       y)zJRaise an exception that a feature was already removed without replacement.r   r   Nr   r   s     r5   deprecation_no_replacementr     s    4&@ANOr?   srcc                 L    t        j                  |      j                  |        y)z
    Use this instead of logger.error directly.

    That allows people to overwrite it more easily.

    See the docs on when to use which:
    https://pypdf.readthedocs.io/en/latest/user/suppress-warnings.html
    N)logging	getLoggererrorr   r   s     r5   logger_errorr     s     c  %r?   c                 L    t        j                  |      j                  |        y)a  
    Use this instead of logger.warning directly.

    That allows people to overwrite it more easily.

    ## Exception, warnings.warn, logger_warning
    - Exceptions should be used if the user should write code that deals with
      an error case, e.g. the PDF being completely broken.
    - warnings.warn should be used if the user needs to fix their code, e.g.
      DeprecationWarnings
    - logger_warning should be used if the user needs to know that an issue was
      handled by pypdf, e.g. a non-compliant PDF being read in a way that
      pypdf could apply a robustness fix to still read it. This applies mainly
      to strict=False mode.
    N)r   r   warningr   s     r5   logger_warningr     s      c""3'r?   	func_namekwargsaliasesfailc                 
   |j                         D ]p  \  }}||v s|rt        | d| d      ||v rt        |  d| d| d| d| d
      |j                  |      ||<   t	        j
                  | d| dt               r y	)
z
    Helper function to deprecate arguments.

    Args:
        func_name: Name of the function to be deprecated
        kwargs:
        aliases:
        fail:

    z# is deprecated as an argument. Use z insteadz received both z and z as an argument. z is deprecated. Use r   )messagecategoryN)itemsr   	TypeErrorpopr   r   r   )r   r   r   r   old_termnew_terms         r5   rename_kwargsr     s     &mmo (v&j CH:XV  6! k
%z J$$,: .#*I/ 
  &zz(3F8MMj CH:XV+	r?   bytesc                 `    | dk  r|  dS | dk  r	| dz  ddS | dk  r	| dz  ddS | dz  ddS )	Ni  z Bytei@B z.1fz kBi ʚ;z MBz GBr   )r   s    r5   _human_readable_bytesr     s_    u}	%-$C((	%-$C((%-$C((r?   c                   ,    e Zd ZdZddZddefdZd Zy)classpropertyz
    Decorator that converts a method with a single cls argument into a property
    that can be accessed directly from the class.
    Nc                     || _         y ru   fgetselfmethods     r5   __init__zclassproperty.__init__
  s	    	r?   r   c                 $    | j                  |      S ru   r   )r   instanceclss      r5   __get__zclassproperty.__get__  s    yy~r?   c                     || _         | S ru   r   r   s     r5   getterzclassproperty.getter  s    	r?   ru   )__name__
__module____qualname____doc__r   r	   r   r   r   r?   r5   r   r     s    
S r?   r   c                   h    e Zd ZU ddlmZ dZeed<   	 dZe	ed<   	 dZ
ee   ed<   	 d	efd
Zd	efdZy)Filer   )IndirectObjectr#   r`   r?   dataNindirect_referencer   c           	          | j                   j                   d| j                   dt        t	        | j
                               dS )Nz(name=z, data: ))	__class__r   r`   r   r-   r   r   s    r5   __str__zFile.__str__&  s?    ..))*&8DYZ]^b^g^gZhDiCjjkllr?   c                 \    | j                         d d dt        | j                         dz   S )NrU   z, hash: r   )r   hashr   r   s    r5   __repr__zFile.__repr__)  s,    ||~cr"xTYY/@%BBBr?   )r   r   r   genericr   r`   r   __annotations__r   r   r   r   r   r   r   r?   r5   r   r     sW    'D#N D% 4807m mC# Cr?   r   c                       e Zd Z ej                  d      ZdeddfdZdedee	e
ef      fdZdedefdZdedefd	Zy)
Versionz^(\d+)(.*)$version_strr   Nc                 >    || _         | j                  |      | _        y ru   )r   _parse_version
components)r   r   s     r5   r   zVersion.__init__1  s    &--k:r?   c                 (   |j                  d      }g }|D ]y  }t        j                  j                  |      }|s|j	                  d|f       8|j                  d      }|j                  d      }|d}|j	                  t        |      |f       { |S )Nr   r   r   r   )splitr   COMPONENT_PATTERNmatchr:   groupint)r   r   r   parsed_components	componentr   integer_prefixsuffixs           r5   r   zVersion._parse_version5  s     &&s+
# 		DI--33I>E!((!Y8"[[^N[[^F%!"$$c.&96%BC		D ! r?   otherc                 V    t        |t              sy| j                  |j                  k(  S )NF)r   r   r   )r   r  s     r5   __eq__zVersion.__eq__D  s$    %)%"2"222r?   c                    t        |t              st        dt        |             t	        t        | j                        t        |j                              }t        |      D ]B  }| j                  |   \  }}|j                  |   \  }}||k  r y||kD  r y||k  r y||kD  sB y t        | j                        t        |j                        k  S )Nz#Version cannot be compared against TF)r   r   r0   typerh   r-   r   rQ   )r   r  min_lenr2   
self_valueself_suffixother_valueother_suffixs           r5   __lt__zVersion.__lt__I  s    %)B4;-PQQc$//*C0@0@,ABw 	A&*ooa&8#J(-(8(8(;%KK'k)\)|+	 4??#c%*:*:&;;;r?   )r   r   r   recompiler   r   r   r   r   r   r   objectboolr  r	   r  r   r?   r5   r   r   -  sl    "

>2;C ;D ;!# !$uS#X2G !3F 3t 3
<C <D <r?   r   ru   )r   )F)Jr   
__author____author_email__	functoolsr   r  sysr   dataclassesr   r   r   ior   osr   typingr   r	   r
   r   r   r   r   r   r   version_infor   typing_extensionserrorsr   r   r   rv   r   r   r   
StreamTyper   StrByteTyper6   r>   r   r   rG   rK   r  rN   rS   rZ   rb   rf   rn   r   r   r   rI   ri   WHITESPACES_AS_BYTESWHITESPACES_AS_REGEXPr   r   r   r   r   r   r   r   r   r   r   r   total_orderingr   r   r?   r5   <module>r      s>  8 )
/    	 
  ! ' " 
 
 
 BQ7" +  ',	%
eUE&9 :E%PUBU<VV' )  -2	5%u,- 	  W
CO$9Xc] 9x/A 9@- -s -s -&*  QV 2
 u "  (E d $Aj AT AZ  5 4 c e 27(z 7(e 7(t$<	* 	 	 
C C  
 
E e  
 
C C  
E#sE/" uS%Z'8  3xx, 33d: B3 BC B B S  T     QU 3 # 3 SW U3 UC UD U
PS Pc Pd P
	&c 	& 	& 	&( (# ($ (( SX cN59#s(^KO	D) ) )Z " C C C. -< -< -<r?   