§
    ;]¥eí  ã            	       ó
  — 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                     d„  || ¦  «        D ¦   «         ¦  «        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        €ú4/usr/lib/python3/dist-packages/pypdf/_page_labels.pyÚ	roman_numz1number2uppercase_roman_numeral.<locals>.roman_numT   sk   øè è € Ø#(ð 	ð 	ÑˆG�ZÝ˜#˜wÑ'Ô'‰DˆAˆqØ˜q‘.Ð Ð Ð Ø�7˜Q‘;ÑˆCØ�aŠxˆxØ��ð ð		ð 	ó    Ú c                 ó   — g | ]}|‘ŒS © r0   )Ú.0Úas     r+   ú
<listcomp>z2number2uppercase_roman_numeral.<locals>.<listcomp>\   s   € Ð.Ð.Ð.˜!�AÐ.Ð.Ð.r-   )Úintr   ÚstrÚjoin)r   r,   r*   s     @r+   Únumber2uppercase_roman_numeralr7   C   so   ø€ ðð ð €Eð •sð �x­œ}ð ð ð ð ð ð ð �7Š7Ð.Ð.˜y˜y¨™~œ~Ð.Ñ.Ô.Ñ/Ô/Ð/r-   Únumberc                 óD   — t          | ¦  «                             ¦   «         S ©N)r7   Úlower©r8   s    r+   Únumber2lowercase_roman_numeralr=   _   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 r0   )Úchr)r1   Úis     r+   r3   z+number2uppercase_letter.<locals>.<listcomp>f   s   € Ð>Ð>Ð>˜1•�A‘”Ð>Ð>Ð>r-   ÚAÚZr   r.   é   )Ú
ValueErrorÚrangeÚord)r8   ÚalphabetÚrepÚ	remainders       r+   Únumber2uppercase_letterrK   c   s¤   € Ø�‚{€{ÝÐ6Ñ7Ô7Ð7Ø>Ð>¥¥c¨#¡h¤hµ°C±´¸1±Ñ =Ô =Ð>Ñ>Ô>€HØ
€CØ
�1Š*ˆ*Ø˜R‘Kˆ	Ø˜Š>ˆ>ØˆIØ�y 1‘}Ô%¨Ñ+ˆà�)ÑˆØ˜2‘ˆð �1Š*ˆ*ð €Jr-   c                 óD   — t          | ¦  «                             ¦   «         S r:   )rK   r;   r<   s    r+   Únumber2lowercase_letterrM   s   s   € Ý" 6Ñ*Ô*×0Ò0Ñ2Ô2Ð2r-   ÚreaderÚindexc                 ó8  — | j         d         }d|vrt          |dz   ¦  «        S |d         }d|v �r<|d         }d}d}d}|t          |¦  «        k     rR||         }||dz            }|dz   t          |¦  «        k    rn(||dz            |k    rn|dz  }|t          |¦  «        k     °Rd„ d	„ t          t          t
          t          d
œ}t          |t          ¦  «        s|  	                    |¦  «        }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.   r0   ©Úns    r+   ú<lambda>zindex2label.<locals>.<lambda>›   s   € ˜B€ r-   c                 ó    — t          | ¦  «        S r:   )r5   rS   s    r+   rU   zindex2label.<locals>.<lambda>œ   s   € �C ™FœF€ 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)Útrailerr5   Úlenr7   r=   rK   rM   Ú
isinstanceÚdictÚ
get_objectÚgetr   Ú__name__)rN   rO   ÚrootÚnumber_treeÚnumsrA   ÚvalueÚstart_indexÚmÚstartÚprefixs              r+   Úindex2labelrf   w   sÎ  € ð Œ>˜'Ô"€DØ˜DÐ Ð Ý�5˜1‘9‰~Œ~ÐØ�}Ô%€KØ�+ÐÑð ˜7Ô#ˆØˆØˆØˆØ•#�d‘)”)ŠmˆmØ˜qœ'ˆKØ˜˜Q™”KˆEØ�1‰u�˜D™	œ	Ò!Ð!ØØ�A˜‘EŒ{˜UÒ"Ð"ØØ�‰FˆAð •#�d‘)”)Šmˆmð �,Ø"Ð"Ý0Ý0Ý)Ý)ð
ð 
ˆõ ˜%¥Ñ&Ô&ð 	-Ø×%Ò% eÑ,Ô,ˆEÝ˜%¥Ñ&Ô&ð 	"Ý�u˜q‘y‘>”>Ð!Ø—	’	˜% Ñ#Ô#ˆØ—’˜4 Ñ$Ô$ˆØÐ*˜˜%Ÿ)š) D™/œ/Ô*¨5°;Ñ+>ÀÑ+FÑGÔGÑGÐGØ�+ÐÐ ¨kÐ!9Ð!9Ýð<õ ñ	
ô 	
ð 	
õ ˆu�q‰y‰>Œ>Ðr-   Úkeyra   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
    rQ   r   ú6a nums like array must have an even number of elementsr   N)rX   rE   Úinsert)rg   ra   r`   rA   s       r+   Únums_insertrk   ¶   sÔ   € õ ˆ4�y„y�1�}˜ÒÐÝÐQÑRÔRÐRåˆD‰	Œ	€AØ
ˆqŠ&ˆ&�S˜D  Q¡œKÒ'Ð'Ø�‰Eˆð ˆqŠ&ˆ&�S˜D  Q¡œKÒ'Ð'ð 	�3ˆt‰9Œ9‚}€}˜  Q¤š˜ØˆˆQ�‰U‰ˆˆà�Š�A�sÑÔÐØ�Š�A˜‘E˜5Ñ!Ô!Ð!Ð!Ð!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
    rQ   r   ri   z/page_index_to must be greater or equal than keyN)rX   rE   rO   Úpop)rg   rl   r`   rA   s       r+   Únums_clear_rangero   Ó   sÄ   € õ ˆ4�y„y�1�}˜ÒÐÝÐQÑRÔRÐRØ�sÒÐÝÐJÑKÔKÐKà�
Š
�3‰Œ˜!Ñ€AØ
�c�$‰iŒiŠ-ˆ-˜D œG }Ò4Ð4Ø�Š�‰ŒˆØ�Š�‰Œˆð �c�$‰iŒiŠ-ˆ-˜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
    rQ   r   ri   r   )NN)rX   rE   rO   )rg   r`   rA   s      r+   Ú	nums_nextrq   í   sg   € õ ˆ4�y„y�1�}˜ÒÐÝÐQÑRÔRÐRà�
Š
�3‰Œ˜!Ñ€AØ�3ˆt‰9Œ9‚}€}Ø�Q”˜˜a !™eœÐ%Ð%àˆ|r-   )Ú__doc__Útypingr   r   r   Ú
_protocolsr   Ú_utilsr   Úgenericr	   r
   r   r4   r5   r7   r=   rK   rM   rf   rk   ro   rq   r0   r-   r+   ú<module>rw      sâ  ðð9ð 9ðv -Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à )Ð )Ð )Ð )Ð )Ð )Ø "Ð "Ð "Ð "Ð "Ð "Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ð @ð0¨ð 0°ð 0ð 0ð 0ð 0ð8:¨3ð :°3ð :ð :ð :ð :ð Cð ¨Cð ð ð ð ð 3 Cð 3¨Cð 3ð 3ð 3ð 3ð<Ð)ð <°#ð <¸#ð <ð <ð <ð <ð~"Ø	ð"àð"ð ð"ð 
ð	"ð "ð "ð "ð:Ø	ðàðð ðð 
ð	ð ð ð ð4Ø	ðà
ðð ˆ8�LÔ! 8Ð,<Ô#=Ð=Ô>ðð ð ð ð ð r-   