o
    >e                  	   @   s   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	d
ZdedefddZdedefddZdedefddZdededefddZdedede
ddfddZdedede
ddfddZdede
deee ee f fd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                    s4   g d dt dtt f fd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   sF     D ]\}}t | |\}}|| V  | || 8 } | dkr  d S qd S )Nr   )divmod)r   decimal
roman_reprx_roman S/var/www/html/humari/django-venv/lib/python3.10/site-packages/pypdf/_page_labels.py	roman_numT   s   
z1number2uppercase_roman_numeral.<locals>.roman_num )intr   strjoinlist)r   r+   r)   r'   r*   number2uppercase_roman_numeralC   s   r1   numberc                 C      t |  S N)r1   lowerr2   r)   r)   r*   number2lowercase_roman_numeral_      r7   c                 C   s|   | dkrt ddd ttdtdd D }d}| dkr<| d	 }|dkr(d	}||d  | }| |8 } | d	 } | dks|S )
Nr   zExpecting a positive numberc                 S   s   g | ]}t |qS r)   )chr).0ir)   r)   r*   
<listcomp>f   s    z+number2uppercase_letter.<locals>.<listcomp>AZr   r,      )
ValueErrorrangeord)r2   alphabetrep	remainderr)   r)   r*   number2uppercase_letterc   s    rF   c                 C   r3   r4   )rF   r5   r6   r)   r)   r*   number2lowercase_letters   r8   rG   readerindexc                 C   s*  | j d }d|vrt|d S |d }d|v r|d }d}d}d}|t|k rO|| }||d   }|d t|kr<n||d  |krEn
|d7 }|t|k s'dd	 d
d	 ttttd}t|t	sgt|d S |
dd}	|
dd}
|
||
d || |	  S d|v sd|v rt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/Rootz/PageLabelsr   z/Numsr   N   c                 S   s   dS )Nr,   r)   nr)   r)   r*   <lambda>   s    zindex2label.<locals>.<lambda>c                 S   s   t | S r4   )r.   rK   r)   r)   r*   rM      s    )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)trailerr.   len
get_objectr1   r7   rF   rG   
isinstancedictgetr   __name__)rH   rI   rootnumber_treenumsr;   valuestart_indexmstartprefixr)   r)   r*   index2labelw   sH   
	
		r]   keyrX   rW   Nc                 C   s   t |d dkrtdt |}|dkr,| ||d  kr,|d }|dkr,| ||d  ks|t |k r@| || kr@|||d < dS |||  ||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
    rJ   r   6a nums like array must have an even number of elementsr   N)rO   r@   insert)r^   rX   rW   r;   r)   r)   r*   nums_insert   s   ra   page_index_toc                 C   s   t |d dkrtd|| k rtd|| d }|t |k r?|| |krC|| || |t |k rA|| |ks'd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
    rJ   r   r_   z/page_index_to must be greater or equal than keyN)rO   r@   rI   pop)r^   rb   rW   r;   r)   r)   r*   nums_clear_range   s   

(rd   c                 C   sJ   t |d dkrtd|| d }|t |k r#|| ||d  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
    rJ   r   r_   r   )NN)rO   r@   rI   )r^   rW   r;   r)   r)   r*   	nums_next   s   re   )__doc__typingr   r   r   
_protocolsr   _utilsr   genericr   r	   r
   r-   r.   r1   r7   rF   rG   r]   ra   rd   re   r)   r)   r)   r*   <module>   sF    ;>

