a
    còf!  ã                   @   s  d Z ddl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mZmZmZ eedœdd	„Zeed
œdd„Zeed
œdd„Zeed
œdd„Zeeedœdd„Zeeedœdd„Zeeeddœdd„Zeeeddœdd„Zeeeee ee f dœdd „ZdS )!u£  
Page labels are shown by PDF viewers as "the page number".

A page has a numeric index, starting at 0. Additionally, 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 labels. This makes things more complicated.

Example 1
---------

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

Example 2
---------
The following is 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


Â§12.4.2 PDF Specification 1.7 and 2.0
=====================================

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ÚListÚOptionalÚTupleÚcasté   )ÚPdfCommonDocProtocol)Úlogger_warning)ÚArrayObjectÚDictionaryObjectÚ
NullObjectÚNumberObject©ÚnumÚreturnc                    s2   g d¢‰ t tt dœ‡ fdd„}d t|| ƒƒ¡S )N))iè  ÚM)i„  ZCM)iô  ÚD)i�  ZCD)éd   ÚC)éZ   ZXC)é2   ÚL)é(   ZXL)é
   ÚX)é	   ZIX)é   ÚV)é   ZIV)r   ÚIr   c                 3   sB   ˆ D ]8\}}t | |ƒ\}}|| V  | || 8 } | dkr q>qd S )Nr   )Údivmod)r   ÚdecimalZ
roman_reprÚxÚ_©Úroman© úO/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pypdf/_page_labels.pyÚ	roman_numU   s    
z1number2uppercase_roman_numeral.<locals>.roman_numÚ )Úintr   ÚstrÚjoinÚlist)r   r(   r&   r$   r'   Únumber2uppercase_roman_numeralD   s    r.   )Únumberr   c                 C   s   t | ƒ ¡ S ©N)r.   Úlower©r/   r&   r&   r'   Únumber2lowercase_roman_numeral`   s    r3   c                 C   sv   | dkrt dƒ‚dd„ ttdƒtdƒd ƒD ƒ}d}| dkrr| d	 }|dkrPd	}||d  | }| |8 } | d	 } q4|S )
Nr   zExpecting a positive numberc                 S   s   g | ]}t |ƒ‘qS r&   )Úchr)Ú.0Úir&   r&   r'   Ú
<listcomp>g   ó    z+number2uppercase_letter.<locals>.<listcomp>ÚAÚZr   r)   é   )Ú
ValueErrorÚrangeÚord)r/   ÚalphabetÚrepÚ	remainderr&   r&   r'   Únumber2uppercase_letterd   s     
rB   c                 C   s   t | ƒ ¡ S r0   )rB   r1   r2   r&   r&   r'   Únumber2lowercase_lettert   s    rC   )Údictionary_objectÚindexr   c           	      C   sÒ   t t| d ƒ}d}d }d}|t|ƒk rl|| }||d   ¡ }|d t|ƒkrPql||d  |krbql|d7 }qdd„ dd„ ttttdœ}t|t	ƒsœt
|d ƒS | d	d¡}| d
d¡}||| d¡ || | ƒ S )Nú/Numsr   r   é   c                 S   s   dS )Nr)   r&   ©Únr&   r&   r'   Ú<lambda>�   r8   z%get_label_from_nums.<locals>.<lambda>c                 S   s   t | ƒS r0   )r+   rH   r&   r&   r'   rJ   Ž   r8   )Nz/Dz/Rz/rz/Az/az/Stz/Pr)   z/S)r   r
   ÚlenÚ
get_objectr.   r3   rB   rC   Ú
isinstanceÚdictr+   Úget)	rD   rE   Únumsr6   ÚvalueÚstart_indexÚmÚstartÚprefixr&   r&   r'   Úget_label_from_numsx   s0    
ú	
rV   )ÚreaderrE   r   c                 C   s  t t| jƒ}d|vr t|d ƒS t t|d  ¡ ƒ}d|v rDt||ƒS d|v röt|d tƒsöd}|dk röt tt |d ƒ}|D ]t}t tt	 |d ƒ}|d |  kr®|d kr|n q|| 
dd¡durâ|d7 }|dkrÚtd	ƒ‚|} q^t||ƒ  S q|qöq^td
|› d�tƒ t|d ƒ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/PageLabelsr   rF   z/Kidsr   r   z/LimitsNz"Too deep nesting is not supported.z,Could not reliably determine page label for Ú.)r   r   Zroot_objectr+   rL   rV   rM   r   r   r*   rO   ÚNotImplementedErrorr	   Ú__name__)rW   rE   ÚrootZnumber_treeÚlevelZkidsÚkidZlimitsr&   r&   r'   Úindex2labelœ   s4    
 
þr^   N)ÚkeyrQ   rP   r   c                 C   sˆ   t |ƒd dkrtdƒ‚t |ƒ}|dkrB| ||d  krB|d }q |t |ƒk rh| || krh|||d < n| || ¡ | |d |¡ 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
    rG   r   ú6a nums like array must have an even number of elementsr   N)rK   r<   Úinsert)r_   rQ   rP   r6   r&   r&   r'   Únums_insertÍ   s    
rb   )r_   Úpage_index_torP   r   c                 C   sh   t |ƒd dkrtdƒ‚|| k r(tdƒ‚| | ¡d }|t |ƒk rd|| |krd| |¡ | |¡ q6d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
    rG   r   r`   z/page_index_to must be greater or equal than keyN)rK   r<   rE   Úpop)r_   rc   rP   r6   r&   r&   r'   Únums_clear_rangeê   s    
re   )r_   rP   r   c                 C   sN   t |ƒd dkrtdƒ‚| | ¡d }|t |ƒk rF|| ||d  fS d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
    rG   r   r`   r   )NNN)rK   r<   rE   )r_   rP   r6   r&   r&   r'   Ú	nums_next  s    rf   )Ú__doc__Útypingr   r   r   r   r   Z
_protocolsr   Ú_utilsr	   Zgenericr
   r   r   r   r*   r+   r.   r3   rB   rC   rV   r^   rb   re   rf   r&   r&   r&   r'   Ú<module>   s0   <$2üüý