
     h              	       
   d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZ d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ZdededefdZdedede
ddfdZdedede
ddfdZdede
deee         ee         f         fdZdS )u5  
Page labels are shown by PDF viewers as "the page number".

A page has a numeric index, starting with 0. Additionally to that, the page
has a label. In the most simple case:
    label = index + 1

However, the title page and the table of contents might have roman numerals as
page label. This makes things more complicated.

Example 1
---------

>>> reader.trailer["/Root"]["/PageLabels"]["/Nums"]
[0, IndirectObject(18, 0, 139929798197504),
 8, IndirectObject(19, 0, 139929798197504)]
>>> reader.get_object(reader.trailer["/Root"]["/PageLabels"]["/Nums"][1])
{'/S': '/r'}
>>> reader.get_object(reader.trailer["/Root"]["/PageLabels"]["/Nums"][3])
{'/S': '/D'}

Example 2
---------
The following example shows a document with pages labeled
i, ii, iii, iv, 1, 2, 3, A-8, A-9, ...

1 0 obj
    << /Type /Catalog
    /PageLabels << /Nums [
            0 << /S /r >>
            4 << /S /D >>
            7 << /S /D
            /P ( A- )
            /St 8
            >>
            % A number tree containing
            % three page label dictionaries
        ]
        >>
    ...
    >>
endobj


PDF Specification 1.7
=====================

Table 159 – Entries in a page label dictionary
----------------------------------------------
The S-key:
D       Decimal arabic numerals
R       Uppercase roman numerals
r       Lowercase roman numerals
A       Uppercase letters (A to Z for the first 26 pages,
                           AA to ZZ for the next 26, and so on)
a       Lowercase letters (a to z for the first 26 pages,
                           aa to zz for the next 26, and so on)
    )IteratorOptionalTuple   )PdfReaderProtocol)logger_warning)ArrayObjectDictionaryObjectNumberObjectnumreturnc                     g ddt           dt          t                   ffd}d                    t	           ||                               S )N))i  M)i  CM)i  D)i  CD)d   C)Z   XC)2   L)(   XL)
   X)	   IX)   V)   IV)r   Ir   r   c              3   r   K   D ]0\  }}t          | |          \  }}||z  V  | ||z  z  } | dk    r d S 1d S )Nr   )divmod)r   decimal
roman_reprx_romans        N/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/pypdf/_page_labels.py	roman_numz1number2uppercase_roman_numeral.<locals>.roman_numT   sk      #( 	 	GZ#w''DAqq.   7Q;Caxx 		 	     )intr   strjoinlist)r   r,   r*   s     @r+   number2uppercase_roman_numeralr3   C   sh      E s x}       774		#''(((r-   numberc                 D    t          |                                           S N)r3   lowerr4   s    r+   number2lowercase_roman_numeralr9   _   s    )&1177999r-   c                    | dk    rt          d          d t          t          d          t          d          dz             D             }d}| dk    r+| dz  }|dk    rd}||dz
           |z   }| |z  } | dz  } | dk    +|S )	Nr   zExpecting a positive numberc                 ,    g | ]}t          |          S  )chr).0is     r+   
<listcomp>z+number2uppercase_letter.<locals>.<listcomp>f   s    >>>1A>>>r-   AZr   r.      )
ValueErrorrangeord)r4   alphabetrep	remainders       r+   number2uppercase_letterrJ   c   s    {{6777>>c#hhC1 = =>>>H
C
1**RK	>>Iy1}%+)2 1** Jr-   c                 D    t          |                                           S r6   )rJ   r7   r8   s    r+   number2lowercase_letterrL   s   s    "6**00222r-   readerindexc                    | j         d         }d|vrt          |dz             S |d         }d|v r$|d         }d}d}d}|t          |          k     rd||         }||dz                                            }|dz   t          |          k    rn(||dz            |k    rn|dz  }|t          |          k     dd d	 t          t
          t          t          d
}t          |t                    st          |dz             S |
                    dd          }	|
                    dd          }
|
 ||
                    d                   ||z
  |	z             z   S d|v sd|v rt          dt                     t          |dz             S )z
    See 7.9.7 "Number Trees".

    Args:
        reader: The PdfReader
        index: The index of the page

    Returns:
        The label of the page, e.g. "iv" or "4".
    z/Rootz/PageLabelsr   z/Numsr   N   c                     dS )Nr.   r<   ns    r+   <lambda>zindex2label.<locals>.<lambda>   s    B r-   c                      t          |           S r6   )r0   rR   s    r+   rT   zindex2label.<locals>.<lambda>   s    CFF r-   )Nz/Dz/Rz/rz/Az/az/Stz/Pr.   z/Sz/Kidsz/Limitszq/Kids or /Limits found in PageLabels. Please share this PDF with pypdf: https://github.com/py-pdf/pypdf/pull/1519)trailerr0   len
get_objectr3   r9   rJ   rL   
isinstancedictgetr   __name__)rM   rN   rootnumber_treenumsr?   valuestart_indexmstartprefixs              r+   index2labelre   w   s    >'"DD  519~~}%K+ 7##d))mmq'KQK**,,E1uD		!!AE{U""FA #d))mm ,""00))
 
 %&& 	"uqy>>!		%##4$$*%))D//*5;+>+FGGGG+k!9!9< 	
 	
 	
 uqy>>r-   keyr`   r_   Nc                 |   t          |          dz  dk    rt          d          t          |          }|dk    r)| ||dz
           k    r|dz
  }|dk    r| ||dz
           k    |t          |          k     r| ||         k    r
|||dz   <   dS |                    ||            |                    |dz   |           dS )z
    Insert a key, value pair in a Nums array.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry
        value: value of the entry
        nums: Nums array to modify
    rP   r   6a nums like array must have an even number of elementsr   N)rW   rD   insert)rf   r`   r_   r?   s       r+   nums_insertrj      s     4yy1}QRRRD		A
q&&SDQK''E q&&SDQK'' 	3t99}}QQUAsAE5!!!!!r-   page_index_toc                    t          |          dz  dk    rt          d          || k     rt          d          |                    |           dz   }|t          |          k     rW||         |k    rO|                    |           |                    |           |t          |          k     r||         |k    IdS dS dS dS )a  
    Remove all entries in a number tree in a range after an entry.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry before the range
        page_index_to: The page index of the upper limit of the range
        nums: Nums array to modify
    rP   r   rh   z/page_index_to must be greater or equal than keyN)rW   rD   rN   pop)rf   rk   r_   r?   s       r+   nums_clear_rangern      s     4yy1}QRRRsJKKK

3!A
c$ii--DG}44 c$ii--DG}4444----44r-   c                     t          |          dz  dk    rt          d          |                    |           dz   }|t          |          k     r||         ||dz            fS dS )z
    Return the (key, value) pair of the entry after the given one.

    See 7.9.7 "Number Trees".

    Args:
        key: number key of the entry
        nums: Nums array
    rP   r   rh   r   )NN)rW   rD   rN   )rf   r_   r?   s      r+   	nums_nextrp      sg     4yy1}QRRR

3!A3t99}}Qa!e%%|r-   )__doc__typingr   r   r   
_protocolsr   _utilsr   genericr	   r
   r   r/   r0   r3   r9   rJ   rL   re   rj   rn   rp   r<   r-   r+   <module>rv      s  9 9v - , , , , , , , , , ) ) ) ) ) ) " " " " " " @ @ @ @ @ @ @ @ @ @) ) ) ) ) )8:3 :3 : : : :C C     3C 3C 3 3 3 3;) ;# ;# ; ; ; ;|"	"" " 
	" " " ":	  
	   4	
 8L!8,<#==>     r-   