o
    ë6Wj7  ã                   @   sø  d dl Z d dlZd dlZd dlZd dl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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mZmZm Z m!Z! ddl"m#Z# dd	l$m%Z%m&Z& dd
l'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl6m8Z9 ddl6m:Z: ddl6m;Z< ddl6m=Z> ddl6m?Z?m@Z@mAZAmBZBmCZC ddl6mDZE ddl6mFZG ddl6mHZI ddl6mJZK ddl6mLZLmMZM ddlNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZd ddlemfZfmgZg ddlmhZhmiZimjZjmkZkmlZlmmZmmnZn e oep¡Zqe@d ƒZreMdƒZsG dd„ dƒZtde eeuef euevee f de^fd d!„Zwd"e deZf d#eud$e eexexexf eudf d%eyd&eydebfd'd(„ZzG d)d*„ d*etƒZ{dS )+é    N)Úmd5)ÚBytesIOÚFileIOÚIOBase)ÚPath)ÚTracebackType)ÚIOÚAnyÚCallableÚDequeÚDictÚIterableÚListÚOptionalÚPatternÚTupleÚTypeÚUnionÚcasté   )Ú
Encryption)Ú
PageObjectÚ_VirtualList)Ú	PdfReader)Ú_alg33Ú_alg34Ú_alg35)ÚStrByteTypeÚ
StreamTypeÚ_get_max_pdf_version_headerÚb_Údeprecate_with_replacementÚdeprecation_bookmarkÚdeprecation_with_replacementÚlogger_warning)ÚAnnotationDictionaryAttributes)ÚCatalogAttributes)ÚCatalogDictionary)ÚCore)ÚEncryptionDictAttributes)ÚFieldDictionaryAttributesÚ	FieldFlagÚ"FileSpecificationDictionaryEntriesÚGoToActionArgumentsÚInteractiveFormDictEntries)ÚPageAttributes)ÚPagesAttributes)ÚStreamAttributes)ÚTrailerKeys)ÚTypFitArgumentsÚUserAccessPermissions)ÚPAGE_FITÚAnnotationBuilderÚArrayObjectÚBooleanObjectÚByteStringObjectÚContentStreamÚDecodedStreamObjectÚDestinationÚDictionaryObjectÚFitÚFloatObjectÚIndirectObjectÚ
NameObjectÚ
NullObjectÚNumberObjectÚ	PdfObjectÚRectangleObjectÚStreamObjectÚTextStringObjectÚ
TreeObjectÚcreate_string_objectÚ
hex_to_rgb)Ú	PageRangeÚPageRangeSpec)ÚBorderArrayTypeÚFitTypeÚ
LayoutTypeÚOutlineItemTypeÚOutlineTypeÚPagemodeTypeÚZoomArgTypeiüÿÿc                   @   s:  e Zd ZdZ�d,deddfdd„Z�d-dd	„Zd
eee	  dee	 dee
 ddfdd„Zedefdd„ƒZejdeddfdd„ƒZdedefdd„Z		�d.dedeef dee defdd„Zdeeef defdd„Z	�d/dedeeegdf dee defd d!„Z�d0d"d#„Z	�d/dedee defd$d%„Z	�d/dedee defd&d'„Z	(	�d1ded)edee defd*d+„Z 	(	�d1ded)edee defd,d-„Z!	�d.d.ee d/ee defd0d1„Z"d/edefd2d3„Z#defd4d5„Z$defd6d7„Z%ede&e fd8d9„ƒZ'	�d.d:ee( d;ee( defd<d=„Z)	�d.d:ee( d;ee( defd>d?„Z*			(�d2d:ee+j, d;ee+j, d)edefd@dA„Z-			(�d2d:ee+j, d;ee+j, d)edefdBdC„Z.edede/e0e1f fdDdE„ƒZ2e2jdFedee/ef ddfdGdE„ƒZ2dHeddfdIdJ„Z3dHeddfdKdL„Z4dMedNeeef ddfdOdP„Z5dQedReeef ddfdSdT„Z6	�d3dUe7dVeeegdf  ddfdWdX„Z8	�d3dUe7dVeeegdf  ddfdYdZ„Z9e:fded[e;eef d\e<ddfd]d^„Z=e:fded[e;eef d\e<ddfd_d`„Z>dUe7ddfdadb„Z?dUe7ddfdcdd„Z@	�d3dUe7dVeeegdf  ddfdedf„ZA	�d3dUe7dVeeegdf  ddfdgdh„ZBdddieCddfdjee dkee dleDdmeEdnee doee ddfdpdq„ZFdreGddfdsdt„ZHdreeIef deJeDeKf fdudv„ZLdreGde&e fdwdx„ZMdreGdye&e defdzd{„ZNdreGddfd|d}„ZOd~e;eef ddfdd€„ZPd~e;eef ddfd�d‚„ZQdƒeeReSeTeUeeVeeWe0eXf
 ddfd„d…„ZYdNedefd†d‡„ZZdedefdˆd‰„Z[dedefdŠd‹„Z\de]fdŒd�„Z^deRfdŽd�„Z_edeRfd�d‘„ƒZ`de]fd’d“„ZadeRfd”d•„ZbdeRfd–d—„Zc				�d4d˜edee]f d™ede]ef dšede]ef dFedee]f def
d›dœ„Zd	�d3dFeee]f d™ede]ef defd�dž„Ze	�d3dFed™ee] defdŸd „Zfegd¡d¢�		�d.d¡ehd™ede]ef dšede]ef defd£d¤„ƒZiegd¡d¢�	�d3d¡ehd™ee] defd¥d¦„ƒZjegd¡d¢�	�d3d¡ehd™ee] defd§d¨„ƒZkdddd©d©eldfdªed.edeeef d™ede]ef dšede]ef d«eeeJe(e(e(f ef  d¬eDd­eDd®emd¯ee defd°d±„Zn			©	©	²�d5dªed¯ed™ede]ef d«eeJe(e(e(f  d¬eDd­eDd®eod³epdefd´dµ„Zq			©	©	²�d5dªed¯ed™ede]ef d«eeJe(e(e(f  d¬eDd­eDd®eod³epdefd¶d·„Zr�d0d¸d¹„Zsdªe0dºeeeRf ddfd»d¼„Zt		�d.d˜ee dFee defd½d¾„ZudFe/defd¿dÀ„Zv		�d.dªed.ee d¯ee defdÁdÂ„Zwdªed¯edefdÃdÄ„Zx�d0dÅdÆ„Zy�d0dÇdÈ„Zz�d6dÉeDddfdÊdË„Z{	©�d6dÌeDddfdÍdÎ„Z|�d6dÉeDddfdÏdÐ„Z}	©�d6dÌeDddfdÑdÒ„Z~		�d.d.edÓedÔedÕeeR d¯ee ddfdÖd×„Z€	�d3d¯edÓedÔedÕeeR ddf
dØdÙ„Z�		²�d7d¯ed˜edÔedÕeeR d®eod³epddfdÚdÛ„Z‚		²�d7d¯ed˜edÔedÕeeR d®eod³epddfdÜdÝ„ZƒdÞZ„dee… fdßdà„Z†dee… fdádâ„Z‡dãeeVe…f ddfdädå„Zˆdãe…ddfdædç„Z‰dãe…ddfdèdé„ZŠedee… fdêdë„ƒZ‹e‹jdãe…ddfdìdë„ƒZ‹edee… fdídî„ƒZŒeŒjdãe…ddfdïdî„ƒZŒdðZ�deeŽ fdñdò„Z�deeŽ fdódô„Z�dõeŽddfdöd÷„Z‘dõeŽddfdødù„Z’edeeŽ fdúdû„ƒZ“e“jdõeŽddfdüdû„ƒZ“edeeŽ fdýdþ„ƒZ”e”jdõeŽddfdÿdþ„ƒZ”d.e�d e;eef ddf�d�d„Z•deeef def�d�d„Z–deeIee7f deJe—ee˜ f f�d�d„Z™			i	�d8deee7eIf d¡eedešeJeef eJeeef e&e f �dedešeJeef eJeeef e&e f �deD�d	eee&e eJe�d
f f  ddf�d�d„Z›egd¡�d�d�			i	�d9�dee deeIee7f d¡ee �deeœ �deD�d	eee&e eJe�d
f f  ddf�d�d„ƒZ��deT�de;eef dUe7def�d�d„Zž�deeŸef �de;eef dUe7ddf�d�d„Z dedeeeeXf �de;eef dUe7dee f�d�d„Z¡�deee&eT f de�de;eef dUe7de&e/ f
�d�d„Z¢�de�de;eef dUe7de&e/ f�d�d„Z£dFe/de]f�d�d „Z¤	�d3�d!e&e/ d™ee]ef dšede]ef ddf�d"�d#„Z¥�d0�d$�d%„Z¦	�d3d¡e;eef dƒee§ dee&e  f�d&�d'„Z¨egd¡d¢�	�d3d¡e;eef dƒee§ dee&e  f�d(�d)„ƒZ©	�d3dUede7ef ddf�d*�d+„ZªdS (:  Ú	PdfWriterz�
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
    Ú ÚfileobjÚreturnNc                 C   sÞ   d| _ g | _i | _i | _tƒ }| ttjƒtdƒttj	ƒt
dƒttjƒtƒ i¡ |  |¡| _tƒ }| tdƒttjd d¡ ƒi¡ |  |¡| _tƒ | _| j ttjƒttjƒttjƒ| ji¡ |  | j¡| _|| _d| _d S )Ns   %PDF-1.3z/Pagesr   z	/ProducerÚPyPDF2zutf-16beF)Ú_headerÚ_objectsÚ_idnum_hashÚ_id_translatedr=   ÚupdaterA   ÚPAÚTYPEÚCOUNTrC   ÚKIDSr7   Ú_add_objectÚ_pagesrI   ÚcodecsÚBOM_UTF16_BEÚencodeÚ_infoÚ_root_objectÚCOÚCATALOGÚPAGESÚ_rootrV   Úwith_as_usage)ÚselfrV   ÚpagesÚinfo© rq   ú]/home/esfera/Documents/content_generation/venv/lib/python3.10/site-packages/PyPDF2/_writer.pyÚ__init__‹   s:   ýÿÿÿÿþÿ
zPdfWriter.__init__c                 C   s
   d| _ | S )z+Store that writer is initialized by 'with'.T)rm   ©rn   rq   rq   rr   Ú	__enter__³   s   zPdfWriter.__enter__Úexc_typeÚexcÚ	tracebackc                 C   s   | j r|  | j ¡ dS dS )zWrite data to the fileobj.N)rV   Úwrite)rn   rv   rw   rx   rq   rq   rr   Ú__exit__¸   s   ÿzPdfWriter.__exit__c                 C   s   | j S )zì
        Header of the PDF document that is written.

        This should be something like b'%PDF-1.5'. It is recommended to set the
        lowest version that supports all features which are used within the
        PDF file.
        ©rY   rt   rq   rq   rr   Ú
pdf_headerÂ   s   	zPdfWriter.pdf_headerÚ
new_headerc                 C   s
   || _ d S ©Nr{   )rn   r}   rq   rq   rr   r|   Í   s   
Úobjc                 C   sB   t |dƒr|jj| kr|jS | j |¡ tt| jƒd| ƒ|_|jS )NÚindirect_referencer   )Úhasattrr€   ÚpdfrZ   Úappendr@   Úlen©rn   r   rq   rq   rr   rb   Ñ   s
   zPdfWriter._add_objectr€   Úidoc                 C   sn   |d ur|d urt dƒ‚|}t dt¡ |d usJ ‚t|tƒr&| j|d  S |j| kr/t dƒ‚| j|jd  S )NzGPlease only set 'indirect_reference'. The 'ido' argument is deprecated.zGThe parameter 'ido' is depreciated and will be removed in PyPDF2 4.0.0.r   zpdf must be self)	Ú
ValueErrorÚwarningsÚwarnÚDeprecationWarningÚ
isinstanceÚintrZ   r‚   Úidnum)rn   r€   r†   rq   rq   rr   Ú
get_objectØ   s    ÿþ

zPdfWriter.get_objectc                 C   ó   t dddƒ |  |¡S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        Ú	getObjectrŽ   ú3.0.0)r#   rŽ   )rn   r†   rq   rq   rr   r�   ñ   ó   
zPdfWriter.getObjectrq   ÚpageÚactionÚexcluded_keysc                 C   s  t t|tj ƒtjksJ ‚|}t|ƒ}|tjdg7 }z| jt	|j
jƒ |j
j= W n	 ty1   Y nw t d| | d|¡ƒ}|jd urU|jj}t|tƒrN| ¡ }t| j|ƒ| _| j|ttjƒ< t t|  | j¡ƒ}|j
d usmJ ‚||tj |j
ƒ t t|tj ƒ}t|d ƒ|ttjƒ< |S )Nz/StructParentsr   Fr   )r   Ústrr^   r_   ri   ÚPAGEÚlistÚPARENTr\   Úidr€   r‚   r�   Ú	ExceptionÚcloner|   r‹   rf   r   rc   rA   r=   rŽ   ra   rŒ   r`   rC   )rn   r“   r”   r•   Úpage_orgÚotherro   Ú
page_countrq   rq   rr   Ú	_add_pageü   s0   ÿÿ

zPdfWriter._add_pagec              
   C   s�   z,| j }tj|vr| j  ttjƒtt| jƒd| ƒi¡ ttj	ƒ}t
dƒ| j tj |< W d S  tyG } zt dt|ƒ¡ W Y d }~d S d }~ww )Nr   Tz&set_need_appearances_writer() catch : )rh   r'   Ú	ACRO_FORMr]   rA   r@   r„   rZ   r.   ÚNeedAppearancesr8   r›   ÚloggerÚerrorÚrepr)rn   ÚcatalogÚneed_appearancesrw   rq   rq   rr   Úset_need_appearances_writer  s   

ÿÿÿ
€ÿz%PdfWriter.set_need_appearances_writerc                 C   s   |   |tj|¡S )ar  
        Add a page to this PDF file.
        Recommended for advanced usage including the adequate excluded_keys

        The page is usually acquired from a :class:`PdfReader<PyPDF2.PdfReader>`
        instance.

        :param PageObject page: The page to add to the document. Should be
            an instance of :class:`PageObject<PyPDF2._page.PageObject>`
        )r    r˜   rƒ   ©rn   r“   r•   rq   rq   rr   Úadd_page2  s   zPdfWriter.add_pagec                 C   ó   t dddƒ |  ||¡S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        ÚaddPagerª   r‘   )r#   rª   r©   rq   rq   rr   r¬   C  s   
zPdfWriter.addPager   Úindexc                    s   |   |‡ fdd„¡S )a  
        Insert a page in this PDF file. The page is usually acquired from a
        :class:`PdfReader<PyPDF2.PdfReader>` instance.

        :param PageObject page: The page to add to the document.
        :param int index: Position at which the page will be inserted.
        c                    s   |   ˆ |¡S r~   )Úinsert)ÚlÚp©r­   rq   rr   Ú<lambda>]  s    z'PdfWriter.insert_page.<locals>.<lambda>)r    ©rn   r“   r­   r•   rq   r±   rr   Úinsert_pageP  s   zPdfWriter.insert_pagec                 C   ó   t dddƒ |  |||¡S )zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        Ú
insertPager´   r‘   )r#   r´   r³   rq   rq   rr   r¶   _  ó   zPdfWriter.insertPageÚpage_numberÚ
pageNumberc                 C   sr   |dur|durt dƒ‚tdddƒ |}|du r |du r t dƒ‚ttttf |  | j¡ƒ}tt|t	j
 |  ¡ ƒS )zÜ
        Retrieve a page by number from this PDF file.

        :param int page_number: The page number to retrieve
            (pages begin at zero)
        :return: the page at the index given by *page_number*
        Nz)Please only use the page_number parameterzget_page(pageNumber)zget_page(page_number)ú4.0.0zPlease specify the page_number)r‡   r!   r   r   r–   r	   rŽ   rc   r   r^   ra   )rn   r¸   r¹   ro   rq   rq   rr   Úget_pagem  s   
ÿzPdfWriter.get_pagec                 C   r�   )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        ÚgetPagezwriter.pages[page_number]r‘   )r#   r»   )rn   r¹   rq   rq   rr   r¼   „  ó   
zPdfWriter.getPagec                 C   s*   t tttf |  | j¡ƒ}t|tdƒ ƒS )Nz/Count)r   r   r–   r	   rŽ   rc   rŒ   rA   )rn   ro   rq   rq   rr   Ú_get_num_pages�  s   zPdfWriter._get_num_pagesc                 C   ó   t dddƒ |  ¡ S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        ÚgetNumPageszlen(writer.pages)r‘   )r#   r¾   rt   rq   rq   rr   rÀ   ‘  ó   zPdfWriter.getNumPagesc                 C   s   t | j| jƒS )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r¾   r»   rt   rq   rq   rr   ro   š  s   zPdfWriter.pagesÚwidthÚheightc                 C   s   t  | ||¡}|  |¡ |S )a  
        Append a blank page to this PDF file and returns it. If no page size
        is specified, use the size of the last page.

        :param float width: The width of the new page expressed in default user
            space units.
        :param float height: The height of the new page expressed in default
            user space units.
        :return: the newly appended page
        :raises PageSizeNotDefinedError: if width and height are not defined
            and previous page does not exist.
        )r   Úcreate_blank_pagerª   )rn   rÂ   rÃ   r“   rq   rq   rr   Úadd_blank_pageŸ  s   
zPdfWriter.add_blank_pagec                 C   r«   )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        ÚaddBlankPagerÅ   r‘   )r#   rÅ   )rn   rÂ   rÃ   rq   rq   rr   rÆ   ²  ó   zPdfWriter.addBlankPagec                 C   sX   |du s|du r|   ¡ d |kr| j| }|jj}|jj}t | ||¡}|  ||¡ |S )a8  
        Insert a blank page to this PDF file and returns it. If no page size
        is specified, use the size of the last page.

        :param float width: The width of the new page expressed in default user
            space units.
        :param float height: The height of the new page expressed in default
            user space units.
        :param int index: Position to add the page.
        :return: the newly appended page
        :raises PageSizeNotDefinedError: if width and height are not defined
            and previous page does not exist.
        Nr   )r¾   ro   ÚmediaboxrÂ   rÃ   r   rÄ   r´   )rn   rÂ   rÃ   r­   Úoldpager“   rq   rq   rr   Úinsert_blank_page½  s    
zPdfWriter.insert_blank_pagec                 C   rµ   )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        ÚinsertBlankPagerÊ   r‘   )r#   rÊ   )rn   rÂ   rÃ   r­   rq   rq   rr   rË   Ø  r·   zPdfWriter.insertBlankPagec              
   C   s¦   d| j vrdS | j d }t|ttfƒrtt|ƒƒS t|tƒrQz|dd… \}}|dd… }t|t|ƒƒ}td||ƒW S  t	yP } z
t	d|› d|› �ƒ‚d}~ww dS )a�  
        Property to access the opening destination ("/OpenAction" entry in the
        PDF catalog).
        it returns `None` if the entry does not exist is not set.

        :param destination:.
        the property can be set to a Destination, a Page or an string(NamedDest) or
            None (to remove "/OpenAction")

        (value stored in "/OpenAction" entry in the Pdf Catalog)
        ú/OpenActionNr   é   Ú
OpenActionzInvalid Destination ú: )
rh   r‹   r–   ÚbytesrI   r7   r>   Útupler<   r›   )rn   Úoar“   ÚtypÚarrayÚfitrw   rq   rq   rr   Úopen_destinationæ  s    


€ÿzPdfWriter.open_destinationÚdestc                 C   s¦   |d u rz| j d= W d S  ty   Y d S w t|tƒr&t|ƒ| j tdƒ< d S t|tƒr5|j| j tdƒ< d S t|tƒrQtd|j	d urD|j	nt
ƒ tƒj| j tdƒ< d S d S )NrÌ   ÚOpening)rh   ÚKeyErrorr‹   r–   rG   rA   r<   Ú
dest_arrayr   r€   rB   r5   ©rn   r×   rq   rq   rr   rÖ     s*   ÿ



ÿûúÿÚ
javascriptc              	   C   sÊ   d| j vrtƒ | j ttjƒ< tt| j tj ƒ}d|vr(ttdƒtƒ iƒ|tdƒ< tttt|d ƒd ƒ}tƒ }| ttj	ƒtdƒtdƒtdƒtdƒt
|› ƒi¡ | ttt ¡ ƒƒ¡ | |  |¡¡ dS )a  
        Add Javascript which will launch upon opening this PDF.

        :param str javascript: Your Javascript.

        >>> output.add_js("this.print({bUI:true,bSilent:false,bShrinkToFit:true});")
        # Example: This will launch the print window when the PDF is opened.
        z/Namesz/JavaScriptz/Actionú/Sz/JSN)rh   r=   rA   ÚCAÚNAMESr   r7   r]   r^   r_   rG   rƒ   rI   r–   ÚuuidÚuuid4rb   )rn   rÜ   ÚnamesÚjs_listÚjsrq   rq   rr   Úadd_js  s&   

ÿÿýÿzPdfWriter.add_jsc                 C   r�   )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        ÚaddJSrå   r‘   )r#   rå   )rn   rÜ   rq   rq   rr   ræ   ;  r½   zPdfWriter.addJSÚfilenameÚdatac                 C   sÎ   t ƒ }| |¡ | ttjƒtdƒi¡ tƒ }| tdƒ|i¡ tƒ }| ttjƒtdƒttjƒt	|ƒttj
ƒ|i¡ tƒ }| ttjƒtt	|ƒ|gƒi¡ tƒ }| tdƒ|i¡ | j ttjƒ|i¡ dS )a  
        Embed a file inside the PDF.

        :param str filename: The filename to display.
        :param str data: The data in the file.

        Reference:
        https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
        Section 7.11.3
        z/EmbeddedFileú/Fz	/Filespecz/EmbeddedFilesN)r;   Úset_datar]   rA   r^   r_   r=   r,   ÚFrI   ÚEFrÞ   rß   r7   rh   )rn   rç   rè   Ú
file_entryÚef_entryÚfilespecÚembedded_files_names_dictionaryÚembedded_files_dictionaryrq   rq   rr   Úadd_attachmentD  s4   

ÿ
ûÿ

ÿÿÿ
ÿzPdfWriter.add_attachmentÚfnameÚfdatac                 C   r«   )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        ÚaddAttachmentrò   r‘   )r#   rò   )rn   ró   rô   rq   rq   rr   rõ   –  rÇ   zPdfWriter.addAttachmentÚreaderÚafter_page_appendc                 C   s@   t |jƒ}t|ƒD ]}|j| }|  |¡}t|ƒr||ƒ q	dS )aÆ  
        Copy pages from reader to writer. Includes an optional callback parameter
        which is invoked after pages are appended to the writer.

        :param PdfReader reader: a PdfReader object from which to copy page
            annotations to this writer object.  The writer's annots
            will then be updated
        :param Callable[[PageObject], None] after_page_append:
            Callback function that is invoked after each page is appended to
            the writer. Signature includes a reference to the appended page
            (delegates to append_pages_from_reader). The single parameter of the
            callback is a reference to the page just appended to the document.
        N)r„   ro   Úrangerª   Úcallable)rn   rö   r÷   Úreader_num_pagesÚreader_page_numberÚreader_pageÚwriter_pagerq   rq   rr   Úappend_pages_from_reader¡  s   


€ûz"PdfWriter.append_pages_from_readerc                 C   ó   t dddƒ |  ||¡ dS )zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        ÚappendPagesFromReaderrþ   r‘   N)r#   rþ   ©rn   rö   r÷   rq   rq   rr   r   ½  ó   
ÿzPdfWriter.appendPagesFromReaderÚfieldsÚflagsc                 C   s  |   ¡  tj|vrtdtƒ dS tt|tj ƒƒD ]m}|tj |  ¡ }i }tj|v r0|tj }|D ]S}| 	t
j¡|kro| 	t
j¡dkrR| ttjƒt|| ƒi¡ | tt
jƒt|| ƒi¡ |rn| tt
jƒt|ƒi¡ q2| 	t
j¡|kr…| tt
jƒt|| ƒi¡ q2qdS )a•  
        Update the form field values for a given page from a fields dictionary.

        Copy field texts and values from fields to page.
        If the field links to a parent object, add the information to the parent.

        :param PageObject page: Page reference from PDF writer where the
            annotations and field data will be updated.
        :param dict fields: a Python dictionary of field names (/T) and text
            values (/V)
        :param int flags: An integer (0 to 7). The first bit sets ReadOnly, the
            second bit sets Required, the third bit sets NoExport. See
            PDF Reference Table 8.70 for details.
        z No fields to update on this pageNz/Btn)r¨   ÚPGÚANNOTSr$   Ú__name__rø   r„   rŽ   r™   Úgetr*   ÚTÚFTr]   rA   r%   ÚASÚVrG   ÚFfrC   )rn   r“   r  r  ÚjÚwriter_annotÚwriter_parent_annotÚfieldrq   rq   rr   Úupdate_page_form_field_valuesÌ  sV   



ÿ
ýÿ
ÿÿÿ
ÿÿÿ€
ÿÿÿ€æúz'PdfWriter.update_page_form_field_valuesc                 C   rµ   )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        ÚupdatePageFormFieldValuesr  r‘   )r#   r  )rn   r“   r  r  rq   rq   rr   r    s   ÿz#PdfWriter.updatePageFormFieldValuesc                 C   s   t t|jtj ƒ| _dS )zŠ
        Copy the reader document root to the writer.

        :param reader:  PdfReader from the document root should be copied.
        N)r   r=   ÚtrailerÚTKÚROOTrh   ©rn   rö   rq   rq   rr   Úclone_reader_document_root  s   z$PdfWriter.clone_reader_document_rootc                 C   ó   t dddƒ |  |¡ dS )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        ÚcloneReaderDocumentRootr  r‘   N)r#   r  r  rq   rq   rr   r  %  ó   ÿz!PdfWriter.cloneReaderDocumentRootc                 C   s   |   |¡ |  ||¡ dS )a)  
        Create a copy (clone) of a document from a PDF file reader

        :param reader: PDF file reader instance from which the clone
            should be created.
        :param Callable[[PageObject], None] after_page_append:
            Callback function that is invoked after each page is appended to
            the writer. Signature includes a reference to the appended page
            (delegates to append_pages_from_reader). The single parameter of the
            callback is a reference to the page just appended to the document.
        N)r  rþ   r  rq   rq   rr   Úclone_document_from_reader0  s   
z$PdfWriter.clone_document_from_readerc                 C   rÿ   )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        ÚcloneDocumentFromReaderr  r‘   N)r#   r  r  rq   rq   rr   r  D  r  z!PdfWriter.cloneDocumentFromReaderTÚuser_passwordÚowner_passwordÚ
use_128bitÚpermissions_flagÚuser_pwdÚ	owner_pwdc                 C   sê  |dur|durt dƒ‚t d¡ |}|du rt dƒ‚|dur:|dur't dƒ‚d}d}tj|› d|› d	�td
� |}|du r@|}|rKd}	d}
tdƒ}nd}	d}
tdƒ}|}tt|||
|ƒƒ}tttt	 	¡ ƒ 
d¡ƒ ¡ ƒ}tttt ¡ ƒ 
d¡ƒ ¡ ƒ}t||fƒ| _|
dkr‘t||||ƒ\}}n|
dks—J ‚t||
||||dƒ\}}tƒ }tdƒ|ttjƒ< t|	ƒ|tdƒ< |	dkrÆt|d ƒ|ttjƒ< t|
ƒ|ttjƒ< t|ƒ|ttjƒ< t|ƒ|ttjƒ< t|ƒ|ttjƒ< |  |¡| _|| _dS )a  
        Encrypt this PDF file with the PDF Standard encryption handler.

        :param str user_password: The "user password", which allows for opening
            and reading the PDF file with the restrictions provided.
        :param str owner_password: The "owner password", which allows for
            opening the PDF files without any restrictions.  By default,
            the owner password is the same as the user password.
        :param bool use_128bit: flag as to whether to use 128bit
            encryption.  When false, 40bit encryption will be used.  By default,
            this flag is on.
        :param unsigned int permissions_flag: permissions as described in
            TABLE 3.20 of the PDF 1.7 specification. A bit value of 1 means the
            permission is grantend. Hence an integer value of -1 will set all
            flags.
            Bit position 3 is for printing, 4 is for modifying content, 5 and 6
            control annotations, 9 for form fields, 10 for extraction of
            text and graphics.
        NzGPlease only set 'user_password'. The 'user_pwd' argument is deprecated.z|Please use 'user_password' instead of 'user_pwd'. The 'user_pwd' argument is deprecated and will be removed in PyPDF2 4.0.0.zuser_password may not be NonezIThe argument owner_pwd of encrypt is deprecated. Use owner_password only.r#  r  úG is deprecated as an argument and will be removed in PyPDF2 4.0.0. Use ú instead©ÚmessageÚcategoryrÍ   é   g      0@r   g      @Úutf8Fz	/Standardú/Vé   )r‡   rˆ   r‰   rŠ   rŒ   r9   r   r   r¥   Útimerf   ÚdigestÚrandomr7   Ú_IDr   r   r=   rA   ÚSAÚFILTERrC   ÚLENGTHÚEDÚRÚOÚUÚPrb   Ú_encryptÚ_encrypt_key)rn   r  r  r   r!  r"  r#  Úold_termÚnew_termr  ÚrevÚkeylenr8  r6  ÚID_1ÚID_2r7  ÚkeyÚencryptrq   rq   rr   rB  S  sl   ÿÿÿÿû

zPdfWriter.encryptÚstreamc                 C   s‚   t |dƒrd|jvrtd|j› d�tƒ | js|  | j¡| _|  | j¡ |  	|¡}|  
||¡}|  |¡ | td|› d�ƒ¡ d S )NÚmodeÚbzFile <zH> to write to is not in binary mode. It may not be written to correctly.z
startxref
z
%%EOF
)r�   rD  r$   Únamer  rl   rb   rh   Ú_sweep_indirect_referencesÚ_write_headerÚ_write_xref_tableÚ_write_trailerry   r    )rn   rC  Úobject_positionsÚxref_locationrq   rq   rr   Úwrite_stream±  s   ý


zPdfWriter.write_streamc                 C   s^   d}|dkrt d|› d�ƒ‚t|ttfƒrt|dƒ}d| _d}|  |¡ | jr+| ¡  ||fS )ae  
        Write the collection of pages added to this object out as a PDF file.

        :param stream: An object to write the file to.  The object can support
            the write method and the tell method, similar to a file object, or
            be a file path, just like the fileobj, just named it stream to keep
            existing workflow.
        FrU   zOutput(stream=z) is empty.ÚwbT)r‡   r‹   r–   r   r   rm   rM  Úclose)rn   rC  Úmy_filerq   rq   rr   ry   Ë  s   	

zPdfWriter.writec           
      C   s   g }|  | jd ¡ |  d¡ t| jƒD ]y\}}| j| }|d ur�|d }| | ¡ ¡ |  tt|ƒƒd ¡ d }t| dƒr‚|| j	j
kr‚t d|d ¡d d… }t dd¡d d	… }| j| | }t|ƒt| jƒd
 ksnJ ‚t|ƒ ¡ }	|	d tdt| jƒd
 ƒ… }| ||¡ |  d¡ q|S )Nó   
s   %âãÏÓ
r   s    0 obj
r9  z<ir)  r   rÍ   é   é   s   
endobj
)ry   r|   Ú	enumeraterZ   rƒ   Útellr    r–   r�   r9  r�   ÚstructÚpackr:  r„   r   r.  ÚminÚwrite_to_stream)
rn   rC  rK  Úir   r�   rA  Úpack1Úpack2Úmd5_hashrq   rq   rr   rH  å  s*   


€zPdfWriter._write_headerrK  c                 C   s|   |  ¡ }| d¡ | tdt| jƒd › d�ƒ¡ | tdd›ddd	›d
�ƒ¡ |D ]}| t|d›ddd	›d�ƒ¡ q*|S )Ns   xref
z0 r   Ú
r   z0>10ú iÿÿ  z0>5z f 
z n 
)rU  ry   r    r„   rZ   )rn   rC  rK  rL  Úoffsetrq   rq   rr   rI  ü  s   
  zPdfWriter._write_xref_tablec                 C   sŽ   |  d¡ tƒ }| ttjƒtt| jƒd ƒttj	ƒ| j
ttjƒ| ji¡ t| dƒr2| j|ttjƒ< t| dƒr?| j|ttjƒ< | |d ¡ d S )Ns   trailer
r   r0  r9  )ry   r=   r]   rA   r  ÚSIZErC   r„   rZ   r  rl   ÚINFOrg   r�   r0  ÚIDr9  ÚENCRYPTrY  )rn   rC  r  rq   rq   rr   rJ    s   
ýÿ

zPdfWriter._write_trailerÚinfosc                 C   s@   i }t | ¡ ƒD ]\}}t|ƒ|t|ƒ< q|  | j¡ |¡ dS )z¯
        Add custom metadata to the output.

        :param dict infos: a Python dictionary where each key is a field
            and each value is your new metadata.
        N)r˜   ÚitemsrI   rA   rŽ   rg   r]   )rn   re  ÚargsrA  Úvaluerq   rq   rr   Úadd_metadata  s   zPdfWriter.add_metadatac                 C   r  )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        ÚaddMetadatari  r‘   N)r#   ri  )rn   re  rq   rq   rr   rj  !  s   zPdfWriter.addMetadataÚrootc                 C   s|  t  ¡ }g }d }g }d }| ||||f¡ t|ƒr¼| ¡ \}}}}t|ttfƒrD| ¡ D ]\}}	| |	|||d ur>||g ng f¡ q,n't|t	ƒrk|j
| krk|  |¡}t|ƒ|vrk| t|ƒ¡ | | ¡ d d g f¡ t|ttfƒr¶t|tƒr|  |  |¡¡}g }
|| |kr—| ¡ gdd„ |D ƒ }
|||< |
D ]}| j |d ¡}|d urµ| ¡ }|d urµ|| j| ¡ < q™t|ƒsd S d S )Nc                 S   s   g | ]}|  ¡ ‘qS rq   )Ú
hash_value)Ú.0Úgrant_parentrq   rq   rr   Ú
<listcomp>j  s    ÿz8PdfWriter._sweep_indirect_references.<locals>.<listcomp>)ÚcollectionsÚdequerƒ   r„   Úpopr‹   r7   r=   rf  r@   r‚   Ú_resolve_indirect_objectr–   rŽ   rF   rb   rl  r[   )rn   rk  ÚstackÚ
discoveredÚparentÚgrant_parentsÚ	key_or_idrè   rA  rh  Úupdate_hashesÚold_hashr€   Úindirect_reference_objrq   rq   rr   rG  *  sZ   ùüÿÿ
	


ÿþÿ€Òz$PdfWriter._sweep_indirect_referencesc                 C   sÄ   t |jdƒr|jjjrtd|jjj› �ƒ‚|j| kr|S |j |¡}|du r7td|jj	› d|› d�t	ƒ t
ƒ }| ¡ }|| jv rE| j| S |j| krUt|jd| ƒ| j|< n|  |¡| j|< | j| S )zÄ
        Resolves indirect object to this pdf indirect objects.

        If it is a new object then it is added to self._objects
        and new idnum is given and generation is always 0.
        rC  zI/O operation on closed file: NzUnable to resolve [rÏ   z], returning NullObject insteadr   )r�   r‚   rC  Úclosedr‡   rF  rŽ   r$   Ú	__class__r  rB   rl  r[   r@   r�   rb   )rn   rè   Úreal_objrl  rq   rq   rr   rs  {  s$   
ý



z"PdfWriter._resolve_indirect_objectc                 C   s0   | j  |¡d }t|d| ƒ}| ¡ |ksJ ‚|S ©Nr   r   )rZ   r­   r@   rŽ   )rn   r   r�   Úrefrq   rq   rr   Úget_reference¡  s   zPdfWriter.get_referencec                 C   r�   )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        ÚgetReferencer�  r‘   )r#   r�  r…   rq   rq   rr   r‚  §  r½   zPdfWriter.getReferencec                 C   s|   t j| jv r'tt| jt j ƒ}| j |¡d }t|d| ƒ}| ¡ |ks%J ‚|S tƒ }| 	i ¡ |  
|¡}|| jtt jƒ< |S r  )ri   ÚOUTLINESrh   r   rH   rZ   r­   r@   rŽ   r]   rb   rA   )rn   Úoutliner�   Úoutline_refrq   rq   rr   Úget_outline_root°  s   û

zPdfWriter.get_outline_rootc                 C   s<   t j| jv rtt| jt j ƒ}|S tƒ }|| jtt jƒ< |S )u¥   
        the list of threads see Â§8.3.2 from PDF 1.7 spec

                :return: an Array (possibly empty) of Dictionaries with "/F" and "/I" properties
        )ri   ÚTHREADSrh   r   r7   rA   )rn   Úthreadsrq   rq   rr   Úget_threads_root¿  s   þzPdfWriter.get_threads_rootc                 C   ó   |   ¡ S )u´   
        Read-only property for the list of threads see Â§8.3.2 from PDF 1.7 spec

        :return: an Array (possibly empty) of Dictionaries with "/F" and "/I" properties
        )r‰  rt   rq   rq   rr   rˆ  Í  s   zPdfWriter.threadsc                 C   r¿   )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        ÚgetOutlineRootr†  r‘   )r#   r†  rt   rq   rq   rr   r‹  Ö  rÁ   zPdfWriter.getOutlineRootc                 C   s(  t j| jv rit| jt j tƒritt| jt j ƒ}|j}t j|v rNt|t j tƒrNtt|t j ƒ}|j}t j|v rBtt|t j ƒ}|S tƒ }||t	t jƒ< |S tƒ }|  
|¡}||t	t jƒ< tƒ }||t	t jƒ< |S tƒ }|  
|¡}|| jt	t jƒ< tƒ }|  
|¡}||t	t jƒ< tƒ }||t	t jƒ< |S r~   )rÞ   rß   rh   r‹   r=   r   r€   ÚDESTSr7   rA   rb   )rn   râ   Ú	names_refÚdestsÚ	dests_refÚndrq   rq   rr   Úget_named_dest_rootß  s:   ÿ
íð
÷

zPdfWriter.get_named_dest_rootc                 C   r¿   )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        ÚgetNamedDestRootr‘  r‘   )r#   r‘  rt   rq   rq   rr   r’    rÁ   zPdfWriter.getNamedDestRootÚpage_destinationrv  Úbeforec                 C   sž   |d ur|d urt dƒ‚|d ur#d}d}tj|› d|› d�td� |}|d u r+t dƒ‚|d u r3|  ¡ }tt| ¡ ƒ}|  |¡}|d urF|j	}| 
||| ¡ |S )Nz[The argument dest of add_outline_item_destination is deprecated. Use page_destination only.r×   r“  r$  r%  r&  ú page_destination may not be None)r‡   rˆ   r‰   rŠ   r†  r   rH   rŽ   rb   r€   Úinsert_child)rn   r“  rv  r”  r×   r;  r<  Úpage_destination_refrq   rq   rr   Úadd_outline_item_destination  s0   ÿÿû
z&PdfWriter.add_outline_item_destinationc                 C   r«   )zf
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_destination` instead.
        Úadd_bookmark_destinationr˜  r‘   ©r#   r˜  ©rn   r×   rv  rq   rq   rr   r™  0  s   
ÿz"PdfWriter.add_bookmark_destinationc                 C   r«   )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_destination` instead.
        ÚaddBookmarkDestinationr˜  r‘   rš  r›  rq   rq   rr   rœ  ?  ó   ÿz PdfWriter.addBookmarkDestinationÚoutline_item)Úbookmarkc           
      C   sœ   t ƒ }t| ¡ ƒD ]\}}||tt|ƒƒ< q	| |¡ d|v rGtƒ }tt|d ƒ}t| ¡ ƒD ]\}}||tt|ƒƒ< q/|  |¡}	|	|tdƒ< |  	|||¡S )Nú/A)
rH   r˜   rf  rA   r–   r]   r=   r   rb   r˜  )
rn   rž  rv  r”  Úoutline_item_objectÚkÚvr”   Úa_dictÚ
action_refrq   rq   rr   Úadd_outline_item_dictL  s   

zPdfWriter.add_outline_item_dictc                 C   r«   )z_
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_dict` instead.
        Úadd_bookmark_dictr¦  r‘   ©r#   r¦  ©rn   rž  rv  rq   rq   rr   r§  b  ó   	ÿzPdfWriter.add_bookmark_dictc                 C   r«   )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_dict` instead.
        ÚaddBookmarkDictr¦  r‘   r¨  r©  rq   rq   rr   r«  p  rª  zPdfWriter.addBookmarkDictFÚtitleÚcolorÚboldÚitalicrÕ   Úpagenumc
              
   C   s@  t |tƒr|dur|du r|}|  |||d||||¡S |dur'|	dur'tdƒ‚|du r.d}
n[t |tƒr6|}n$t |tƒr?|j}nt |tƒrZz| j| j}W n t	yY   t
|ƒ}Y nw |du ritd|› �tƒ tƒ }ttd| d ƒ||ƒ}|  tttjƒ|jttjƒtdƒiƒ¡}
t|
||||ƒ}|du r™|  ¡ }|  |||¡S )añ  
        Add an outline item (commonly referred to as a "Bookmark") to this PDF file.

        :param str title: Title to use for this outline item.
        :param int page_number: Page number this outline item will point to.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param tuple color: Color of the outline item's font as a red, green, blue tuple
            from 0.0 to 1.0 or as a Hex String (#RRGGBB)
        :param bool bold: Outline item font is bold
        :param bool italic: Outline item font is italic
        :param Fit fit: The fit of the destination page.
        NúMThe argument pagenum of add_outline_item is deprecated. Use page_number only.zcan not find reference of page ú/z outline itemú/GoTo)r‹   r>   Úadd_outline_itemr‡   r@   r   r€   rŒ   ro   Ú
IndexErrorrC   r$   r  rB   r<   rA   rb   r=   r-   ÚDrÚ   ÚSÚ_create_outline_itemr†  r˜  )rn   r¬  r¸   rv  r”  r­  r®  r¯  rÕ   r°  r¥  Úpage_refr×   rž  rq   rq   rr   r´  ~  sX   
ÿÿ


ÿþýþÿÿzPdfWriter.add_outline_itemú/Fitrg  c           	      G   s*   t dddƒ |  ||||||t||d�¡S )zZ
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item` instead.
        Úadd_bookmarkr´  r‘   ©Úfit_typeÚfit_args©r#   r´  r>   ©	rn   r¬  r°  rv  r­  r®  r¯  rÕ   rg  rq   rq   rr   r»  Ê  s   
ùzPdfWriter.add_bookmarkc           	      G   s,   t dddƒ |  |||d|||t||d�¡S )z[
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item` instead.
        ÚaddBookmarkr´  r‘   Nr¼  r¿  rÀ  rq   rq   rr   rÁ  å  s   
øzPdfWriter.addBookmarkc                 C   s   t dƒ‚)NzIThis method is not yet implemented. Use :meth:`add_outline_item` instead.)ÚNotImplementedErrorrt   rq   rq   rr   Úadd_outline  s   ÿzPdfWriter.add_outlineÚdestinationc                 C   sn   |   ¡ }d}|t|ƒk r,||| k r"| ||¡ | |t|ƒ¡ d S |d7 }|t|ƒk s| t|ƒ|g¡ d S )Nr   rÍ   )r‘  r„   r®   rG   Úextend)rn   r¬  rÄ  r�  rZ  rq   rq   rr   Úadd_named_destination_array  s   úz%PdfWriter.add_named_destination_arrayc                 C   s|   |d ur|d urt dƒ‚|d ur#d}d}tj|› d|› d�td� |}|d u r+t dƒ‚|  |j¡}|  td|d	 ƒ|¡ |S )
Nz[The argument dest of add_named_destination_object is deprecated. Use page_destination only.r×   r“  r$  r%  r&  r•  rG   ú/Title)r‡   rˆ   r‰   rŠ   rb   rÚ   rÆ  r   )rn   r“  r×   r;  r<  r—  rq   rq   rr   Úadd_named_destination_object  s*   ÿÿûÿz&PdfWriter.add_named_destination_objectc                 C   r�   )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        ÚaddNamedDestinationObjectrÈ  r‘   )r#   rÈ  rÛ   rq   rq   rr   rÉ  3  s   ÿ
z#PdfWriter.addNamedDestinationObjectc           
      C   sâ   |d ur|d urt dƒ‚|d ur#d}d}tj|› d|› d�td� |}|d u r+t dƒ‚|  | j¡tj | }tƒ }| 	t
tjƒt|t
tjƒtdƒgƒt
tjƒt
d	ƒi¡ |  |¡}|  ¡ }	t|tƒshtt|ƒƒ}|	 ||g¡ |S )
Nr±  r°  r¸   r$  r%  r&  zpage_number may not be Nonei:  r³  )r‡   rˆ   r‰   rŠ   rŽ   rc   r^   ra   r=   r]   rA   r-   r¶  r7   r3   ÚFIT_HrC   r·  rb   r‘  r‹   rG   r–   rÅ  )
rn   r¬  r¸   r°  r;  r<  r¹  r×   Údest_refr�  rq   rq   rr   Úadd_named_destination@  s>   ÿÿû
ÿüÿ
	
zPdfWriter.add_named_destinationc                 C   r«   )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        ÚaddNamedDestinationrÌ  r‘   )r#   rÌ  )rn   r¬  r°  rq   rq   rr   rÍ  i  r�  zPdfWriter.addNamedDestinationc                 C   sR   t t|  | j¡ƒ}t t|tj ƒ}|D ]}t t|  |¡ƒ}tj|v r&|tj= qdS )z.Remove links and annotations from this output.N)	r   r=   rŽ   rc   r7   r^   ra   r  r  )rn   Úpg_dictro   r“   r¹  rq   rq   rr   Úremove_linksv  s   
€ýzPdfWriter.remove_linksc                 C   r¿   )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        ÚremoveLinksrÏ  r‘   )r#   rÏ  rt   rq   rq   rr   rÐ    rÁ   zPdfWriter.removeLinksÚignore_byte_string_objectc                 C   sf  t t|  | j¡ƒ}t t|tj ƒ}d}|D ]›}t t|  |¡ƒ}|d  ¡ }t|tƒs/t||ƒ}g }d}	|j	D ]n\}
}|dv rO|
d }|rNt|t
ƒsNt
ƒ |
d< n6|dkrd|
d }|rct|t
ƒsct
ƒ |
d< n!|dkr…tt|
d ƒƒD ]}|r„t|
d | t
ƒs„t
ƒ |
d |< qp|d	kr‹d
}	|dkr‘d}	|	r˜||v r˜q6|dkr�q6| |
|f¡ q6||_	| tdƒ|¡ qdS )zž
        Remove images from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        )s   cmó   wó   Jó   jó   Mó   ds   rió   is   gsó   Wó   bó   só   Só   fó   Fó   nó   mó   ló   có   vó   yó   hó   Bs   Dos   shú	/ContentsF©s   Tjó   'r   ó   "rÍ   ó   TJó   qTó   Qs   reN)r   r=   rŽ   rc   r7   r^   ra   r‹   r:   Ú
operationsrG   rø   r„   rƒ   Ú__setitem__rA   )rn   rÑ  rÎ  ro   Újump_operatorsr“   r¹  ÚcontentÚ_operationsÚseq_graphicsÚoperandsÚoperatorÚtextrZ  rq   rq   rr   Úremove_imagesˆ  sX   

ÿ
€ÿ
€ÿ€ÙzPdfWriter.remove_imagesÚignoreByteStringObjectc                 C   r�   )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        ÚremoveImagesrö  r‘   )r#   rö  ©rn   r÷  rq   rq   rr   rø  Õ  r’   zPdfWriter.removeImagesc                 C   st  t t|  | j¡ƒ}t tt |tj ƒ}|D ]¢}t t|  |¡ƒ}|d  ¡ }t	|t
ƒs/t
||ƒ}|jD ]|\}}|dv rX|d }	|sKt	|	tƒrJtƒ |d< q2t	|	ttfƒrWtƒ |d< q2|dkrz|d }	|smt	|	tƒrltƒ |d< q2t	|	ttfƒrytƒ |d< q2|dkr®tt|d ƒƒD ]'}
|s›t	|d |
 tƒrštƒ |d |
< q†t	|d |
 ttfƒr­tƒ |d |
< q†q2| tdƒ|¡ qdS )zœ
        Remove text from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        ræ  rç  r   ré  rÍ   rê  N)r   r=   rŽ   rc   r   r@   r^   ra   r   r‹   r:   rí  rG   r9   rø   r„   rî  rA   )rn   rÑ  rÎ  ro   r“   r¹  rð  ró  rô  rõ  rZ  rq   rq   rr   Úremove_textà  sN   



€
€

€
€€ÿ€ßzPdfWriter.remove_textc                 C   r�   )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        Ú
removeTextrú  r‘   )r#   rú  rù  rq   rq   rr   rû    r’   zPdfWriter.removeTextÚuriÚrectÚborderc                 C   s–  |durt jdtd� |}|  | j¡tj | }ttt	t
f |  |¡ƒ}|durJdd„ |dd… D ƒ}t|ƒdkrItdd„ |d D ƒƒ}	| |	¡ ntd	ƒgd }t|t	ƒr[t|ƒ}n
t|tƒrant|ƒ}tƒ }
|
 td
ƒtdƒtdƒt|ƒi¡ tƒ }| ttjƒttjƒttjƒtdƒttjƒ|ttjƒ|tdƒtdƒttjƒt|ƒtdƒ|
i¡ |  |¡}tj|v r¿|tj  |¡ dS t|gƒ|ttjƒ< dS )aç  
        Add an URI from a rectangular area to the specified page.
        This uses the basic structure of :meth:`add_link`

        :param int page_number: index of the page on which to place the URI action.
        :param str uri: URI of resource to link to.
        :param Tuple[int, int, int, int] rect: :class:`RectangleObject<PyPDF2.generic.RectangleObject>` or array of four
            integers specifying the clickable rectangular area
            ``[xLL, yLL, xUR, yUR]``, or string in the form ``"[ xLL yLL xUR yUR ]"``.
        :param ArrayObject border: if provided, an array describing border-drawing
            properties. See the PDF spec for details. No border will be
            drawn if this argument is omitted.
        NzoThe 'pagenum' argument of add_uri is deprecated and will be removed in PyPDF2 4.0.0. Use 'page_number' instead.)r(  c                 S   ó   g | ]}t |ƒ‘qS rq   ©rA   ©rm  Únrq   rq   rr   ro  8  ó    z%PdfWriter.add_uri.<locals>.<listcomp>r)  é   c                 S   rÿ  rq   r   r  rq   rq   rr   ro  :  r  rÍ   rÝ   z/URIú/Linkz/Hú/Ir   )rˆ   r‰   rŠ   rŽ   rc   r^   ra   r   r   r–   r	   r„   r7   rƒ   rC   r‹   rA   rE   r=   r]   rG   r%   r   r  r  ÚSubtyper8  ÚRectÚBorderrb   )rn   r¸   rü  rý  rþ  r°  Ú	page_linkr¹  Ú
border_arrÚdash_patternÚlnk2ÚlnkÚlnk_refrq   rq   rr   Úadd_uri  sV   ý
€


þÿ


ÿ÷ÿ

zPdfWriter.add_uric                 C   s   t dddƒ |  ||||¡S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        ÚaddURIr  r‘   )r#   r  )rn   r°  rü  rý  rþ  rq   rq   rr   r  b  s   zPdfWriter.addURIc                 G   sz   t ddƒ t|tƒr| ¡ dd… }tdd„ | d¡D ƒƒ}n
t|tƒr%nt|ƒ}tj|||t||d�d	�}| j	||d
�S )NÚadd_linkú+add_annotation(AnnotationBuilder.link(...))r   éÿÿÿÿc                 S   s    g | ]}t |ƒd krt|ƒ‘qS )r   )r„   Úfloat)rm  Únumrq   rq   rr   ro  �  ó     z&PdfWriter.add_link.<locals>.<listcomp>r_  r¼  )rý  rþ  Útarget_page_indexrÕ   )r¸   Ú
annotation)
r#   r‹   r–   ÚstriprE   Úsplitr6   Úlinkr>   Úadd_annotation)rn   r°  r“  rý  rþ  rÕ   rg  r  rq   rq   rr   r  q  s$   	ÿ
ÿ

üzPdfWriter.add_linkc                 G   s&   t dddƒ | j|||||g|¢R Ž S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_link` instead.
        ÚaddLinkr  rº   )r!   r  )rn   r°  r“  rý  rþ  rÕ   rg  rq   rq   rr   r  �  s   ÿzPdfWriter.addLink)z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 C   ó(   z	t t| jd ƒW S  ty   Y d S w )Nú/PageLayout)r   rO   rh   rÙ   rt   rq   rq   rr   Ú_get_page_layout­  ó
   ÿzPdfWriter._get_page_layoutc                 C   r¿   )úY
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        ÚgetPageLayoutÚpage_layoutr‘   )r#   r!  rt   rq   rq   rr   r$  ³  rÁ   zPdfWriter.getPageLayoutÚlayoutc                 C   sP   t |tƒs|| jvrtddd | j¡f› �tƒ t|ƒ}| j tdƒ|i¡ dS )a  
        Set the page layout.

        :param str layout: The page layout to be used.

        .. list-table:: Valid ``layout`` arguments
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        zLayout should be one of: rU   r   N)r‹   rA   Ú_valid_layoutsr$   Újoinr  rh   r]   ©rn   r&  rq   rq   rr   Ú_set_page_layout¼  s   

þzPdfWriter._set_page_layoutc                 C   s   |   |¡ dS )a  
        Set the page layout.

        :param str layout: The page layout to be used

        .. list-table:: Valid ``layout`` arguments
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        N©r*  r)  rq   rq   rr   Úset_page_layoutÝ  s   zPdfWriter.set_page_layoutc                 C   r�   )r#  zwriter.setPageLayout(val)zwriter.page_layout = valr‘   )r#   r*  r)  rq   rq   rr   ÚsetPageLayout÷  s   ÿ
zPdfWriter.setPageLayoutc                 C   rŠ  )aÛ  
        Page layout property.

        .. list-table:: Valid ``layout`` values
           :widths: 50 200

           * - /NoLayout
             - Layout explicitly not specified
           * - /SinglePage
             - Show one page at a time
           * - /OneColumn
             - Show one column at a time
           * - /TwoColumnLeft
             - Show pages in two columns, odd-numbered pages on the left
           * - /TwoColumnRight
             - Show pages in two columns, odd-numbered pages on the right
           * - /TwoPageLeft
             - Show two pages at a time, odd-numbered pages on the left
           * - /TwoPageRight
             - Show two pages at a time, odd-numbered pages on the right
        )r!  rt   rq   rq   rr   r%    s   zPdfWriter.page_layoutc                 C   ó   |   |¡ d S r~   r+  r)  rq   rq   rr   r%    ó   c                 C   ó   t dddƒ | jS )r#  Ú
pageLayoutr%  r‘   ©r#   r%  rt   rq   rq   rr   r1    ó   zPdfWriter.pageLayoutc                 C   ó   t dddƒ || _dS )r#  r1  r%  r‘   Nr2  r)  rq   rq   rr   r1  )  ó   
)z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 C   r  )Nú	/PageMode)r   rR   rh   rÙ   rt   rq   rq   rr   Ú_get_page_mode<  r"  zPdfWriter._get_page_modec                 C   r¿   )úW
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        ÚgetPageModeÚ	page_moder‘   )r#   r7  rt   rq   rq   rr   r9  B  rÁ   zPdfWriter.getPageModerD  c                 C   sR   t |tƒr|}n|| jvrtdd | j¡› �tƒ t|ƒ}| j tdƒ|i¡ dS )r8  zMode should be one of: z, r6  N)r‹   rA   Ú_valid_modesr$   r(  r  rh   r]   )rn   rD  Ú	mode_namerq   rq   rr   Úset_page_modeK  s   

ÿzPdfWriter.set_page_modec                 C   r  )r8  zwriter.setPageMode(val)zwriter.page_mode = valr‘   N)r#   r=  ©rn   rD  rq   rq   rr   ÚsetPageMode[  r  zPdfWriter.setPageModec                 C   rŠ  )a  
        Page mode property.

        .. list-table:: Valid ``mode`` values
           :widths: 50 200

           * - /UseNone
             - Do not show outline or thumbnails panels
           * - /UseOutlines
             - Show outline (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        )r7  rt   rq   rq   rr   r:  f  s   zPdfWriter.page_modec                 C   r.  r~   )r=  r>  rq   rq   rr   r:  }  r/  c                 C   r0  )r8  ÚpageModer:  r‘   ©r#   r:  rt   rq   rq   rr   r@  �  r3  zPdfWriter.pageModec                 C   r4  )r8  r@  r:  r‘   NrA  r>  rq   rq   rr   r@  ‹  r5  r  c                 C   sÖ   t tt|ƒƒ}|  | j¡d | |tdƒ< | j| }|jd u r&tƒ |tdƒ< |jd us-J ‚| 	d¡dkr^tdƒ|v r^t t
|tdƒ ƒ}ttdƒ|d t|d	 t
|ƒd
 d�ƒ}|j|tdƒ< |  |¡}|j |¡ d S )Nz/Kidsú/Pú/Annotsú/Subtyper  ú/Destz	/LinkNamer  rÕ   r¾  r¼  )r   r=   Ú_pdf_objectifyrŽ   rc   rA   ro   Úannotationsr7   r  Údictr<   r>   rÚ   rb   rƒ   )rn   r¸   r  Úto_addr“   Útmpr×   Úind_objrq   rq   rr   r  •  s$   

ÿý
zPdfWriter.add_annotationc                 C   s–   t d| ¡ ƒ}| dg ¡D ];}| ¡ }| dd¡}| dd¡}t|tƒr-t|ƒ|tdƒ< q|durH| ¡ }| dd¡}t|tƒrHt|ƒ|tdƒ< q|S )zŸ
        Perform some clean up in the page.
        Currently: convert NameObject nameddestination to TextStringObject (required for names/dests list)
        r   rC  rE  Nr   ú/D)r   rŽ   r  r‹   rA   rG   )rn   r“   ÚaÚa_objÚdÚactrq   rq   rr   Ú
clean_page®  s   

€zPdfWriter.clean_pagec                 C   sâ   d }t |ttfƒr+t|dƒ�}t| ¡ ƒ}W d   ƒ ||fS 1 s"w   Y  ||fS t |tƒrR|jr6|j}|j 	¡ }|j 
d¡ t|j ¡ ƒ}|j 
|¡ ||fS t|dƒrmt|dƒrm| 
d¡ | ¡ }t|ƒ}||fS tdƒ‚)NÚrbr   ÚseekÚreadzÝPdfMerger.merge requires an object that PdfReader can parse. Typically, that is a Path or a string representing a Path, a file object, or an object implementing .seek and .read. Passing a PdfReader directly works as well.)r‹   r–   r   r   r   rT  r   Ú_encryptionrC  rU  rS  r�   rÂ  )rn   rV   Úencryption_objÚfrC  Ú	orig_tellÚfilecontentrq   rq   rr   Ú_create_streamÁ  s0   	
ÿê
ì
õ
úÿzPdfWriter._create_streamro   Úimport_outlineÚexcluded_fields.c                 C   sl   |du rd}t |tttfƒr*t |tƒrt |tƒs|}|}|}|  d|d|||¡ dS |  d|||||¡ dS )a0  
        Identical to the :meth:`merge()<merge>` method, but assumes you want to
        concatenate all pages onto the end of the file instead of specifying a
        position.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify a string to build an outline
            (aka 'bookmark') to identify the
            beginning of the included file.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            or a list of pages to be processed
            to merge only the specified range of pages from the source
            document into the output document.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.

        :param List excluded_fields: provide the list of fields/keys to be ignored
            if "/Annots" is part of the list, the annotation will be ignored
            if "/B" is part of the list, the articles will be ignored
        Nrq   )r‹   rÑ   r˜   rK   ÚboolÚmerge)rn   rV   rž  ro   r[  r\  rq   rq   rr   rƒ   å  s   '

ÿzPdfWriter.append)rŸ  Úimport_bookmarksÚpositionc                 C   s¦  t |tƒr|}n|  |¡\}}	t|dd�}|du rd}|du r*ttdt|jƒƒƒ}n3t |tƒr<tt| t|jƒ¡Ž ƒ}n!t |tƒrBnt |t	ƒrTt|ƒdkrTtt|Ž ƒ}n	t |t	ƒs]t
dƒ‚i }
|D ]?}|j| }|jdusoJ ‚|du r„|  |t|ƒdd	g ¡|
|jj< n|  ||t|ƒdd	g ¡|
|jj< |d
7 }||
|jj _qa|j|_|j ¡ D ]*}|j}t |d tƒr·qª|d jj|
v rÔ|
|d jj j|tdƒ< |  |d |¡ qª|durðtd| jt|ƒt|
 ¡ ƒd jtd� ¡ ƒ}n|  ¡ }td|jtj ƒ}|�rt j!|v �r|  "| #t j!d¡|
|¡}|  $||d¡ d	|v�rE|
 ¡ D ]"}|  %|j #d	d¡||
|¡}t|ƒdk�r>||t&d	ƒ< |  '|¡ �q"d|v�rQ|  (d|
|¡ dS )ae  
        Merge the pages from the given file into the output file at the
        specified page number.

        :param int position: The *page number* to insert this file. File will
            be inserted after the given number.

        :param fileobj: A File Object or an object that supports the standard
            read and seek methods similar to a File Object. Could also be a
            string representing a path to a PDF file.

        :param str outline_item: Optionally, you may specify a string to build an outline
            (aka 'bookmark') to identify the
            beginning of the included file.

        :param pages: can be a :class:`PageRange<PyPDF2.pagerange.PageRange>`
            or a ``(start, stop[, step])`` tuple
            or a list of pages to be processed
            to merge only the specified range of pages from the source
            document into the output document.

        :param bool import_outline: You may prevent the source document's
            outline (collection of outline items, previously referred to as
            'bookmarks') from being imported by specifying this as ``False``.

        :param List excluded_fields: provide the list of fields/keys to be ignored
            if "/Annots" is part of the list, the annotation will be ignored
            if "/B" is part of the list, the articles will be ignored
        F)ÚstrictNrq   r   r)  z:"pages" must be a tuple of (start, stop[, step]) or a listú/BrC  r   ú/PagerÇ  rH   )rÕ   r=   rU   ))r‹   r   rZ  r˜   rø   r„   ro   rK   ÚindicesrÑ   Ú	TypeErrorr€   rª   r�   r´   Úoriginal_pageÚnamed_destinationsÚ_namedDestsÚvaluesrÚ   rB   rC   rÆ  r   r´  rG   r5   rŽ   r†  r  r  r  ri   rƒ  Ú_get_filtered_outliner  Ú_insert_filtered_outlineÚ_insert_filtered_annotationsrA   rQ  Úadd_filtered_articles)rn   r`  rV   rž  ro   r[  r\  rö   rC  rV  ÚsrcpagesrZ  Úpgr×   ÚarrÚoutline_item_typÚ_ror„  ÚpagÚlstrq   rq   rr   r^  	  s–   
'


ÿ
ÿÿÿ
ÿ
þ€ýú	ÿÿ
ÿ
zPdfWriter.mergeÚthreadc                 C   sx  |j | ddd�}| j |j¡ td|d ƒ}|}d}|dur²|  td|d ƒ||¡}|dur“|du rGtd|  tƒ ¡ ¡ ƒ}|}	|j|t	dƒ< ntd|  tt	d	ƒ|jiƒ¡ ¡ ƒ}
|
j|t	d
ƒ< |
}||t	dƒ< |j|t	dƒ< |d |t	dƒ< td| ¡ ƒ}d|vrˆt
ƒ |t	dƒ< td|d ƒ |j¡ td|d
 ƒ}||kr®|	j|t	d
ƒ< |j|	t	d	ƒ< d}|dus|jdus¹J ‚|jS )zE
        clone the thread with only the applicable articles

        T)ré   )Úforce_duplicateÚignore_fieldsr=   ré   Nr   rB  r+  z/Nú/Tz/Rrb  r7   )rœ   rˆ  rƒ   r€   r   Ú_get_cloned_pagerb   r=   rŽ   rA   r7   )rn   ru  ro   rö   ÚnthreadÚfirst_articleÚcurrent_articleÚnew_articlers  Ú	new_firstÚnew_article2Úpag_objrq   rq   rr   Ú_add_articles_threadœ	  s^   
ÿÿþÿÿúÿÜ%zPdfWriter._add_articles_threadÚfltrc                 C   s–   t |tƒrt |¡}n
t |tƒst d¡}| ¡ D ]/}|j}| dd¡D ]#}| ¡ d }|j	j
| jt|ƒ vrG| |d d ¡rG|  |||¡ q$qdS )z<
        Add articles matching the defined criteria
        rU   rb  rq   rx  r  rÇ  N)r‹   r–   ÚreÚcompiler   ri  rf  r  rŽ   r€   r�   r\   rš   Úsearchr�  )rn   r‚  ro   rö   r°   ÚpprM  Úthrrq   rq   rr   rm  Õ	  s"   
	


ÿþ€ûþzPdfWriter.add_filtered_articlesc                 C   sz   t |tƒrd S t |tƒr|j| j}nt |tƒr$| dd¡dkr$|j}nt |tƒr+|}z||j jW S  t	y<   Y d S w )Nú/TyperU   rc  )
r‹   rB   rŒ   ro   r€   r=   r  r@   r�   r›   )rn   r“   ro   rö   Ú_irq   rq   rr   ry  ë	  s   


ÿzPdfWriter._get_cloned_pageÚannotsc                 C   sÌ  t ƒ }t|tƒrtd| ¡ ƒ}|D ]Ò}td| ¡ ƒ}|d dks3d|vs3td|d ƒd dks3d|v r‹d|vrA| | | ¡j¡ q|d }t|tƒr\t|ƒ|  	¡ v r[| | | ¡j¡ qtd	|ƒ}|  
|d
 ||¡}	|	d urŠ|j| dd�}
t |	g|dd …  ƒ|
tdƒ< | |
j¡ qtd|d ƒd }t|tƒr«t|ƒ|  	¡ v rª| | | ¡j¡ qtd	|ƒ}|  
|d
 ||¡}	|	d urã|j| dd�}
td|
ƒ}
t |	g|dd …  ƒtd|
d ƒtdƒ< | |
j¡ q|S )Nr   r=   rD  r  r   rÝ   r³  rE  r7   r   )rE  )rw  r   rL  )rL  )r7   r‹   r@   r   rŽ   rƒ   rœ   r€   r–   r‘  ry  rA   )rn   rŠ  r“   ro   rö   ÚoutlistÚanÚanorO  r°   Úancrq   rq   rr   rl   
  sP   

€
€
€

þÿ€z&PdfWriter._insert_filtered_annotationsÚnodec                 C   s
  g }|  ¡ }| dd¡dksd|vr+| dd¡}|dur)|  ¡ }||  |||¡7 }|S |durƒ|  ¡ }td| |¡ƒ}|  td|d	 ƒ||¡}|du rNtƒ }||td	ƒ< d|v rc|  |d ||¡|_ng |_t	|d	 tƒrtt
|jƒd
kry| |¡ | dd¡}|dus/|S )zEExtract outline item entries that are part of the specified page set.rˆ  rU   ú	/OutlinesrÇ  ú/FirstNr<   r   rc  r   ú/Next)rŽ   r  rj  r   Ú_build_outline_itemry  rB   rA   Úchildsr‹   r„   rƒ   )rn   r�  ro   rö   Únew_outlineÚor£  rq   rq   rr   rj  3
  s.   ò
ózPdfWriter._get_filtered_outlinec                 C   sÂ   t ƒ }|  |¡ t|d ƒ|tdƒ< t|d tƒs7|jd ur0d|jv r0|jd  | ¡|tdƒ< n|j|tdƒ< |jd ur_t	|j 
dd¡ƒ|tdƒ< t|j 
dtdƒtdƒtdƒg¡ƒ|tdƒ< |S )	NrÇ  rc  r   rE  ré   r   ú/Cg        )rH   rb   rG   rA   r‹   rB   r�  rœ   rÚ   rC   r  r7   r?   )rn   r×   Ún_olrq   rq   rr   Ú_clone_outlineS
  s   

ÿÿzPdfWriter._clone_outlineÚoutlinesc                 C   s^   |D ]*}|  dd¡dksd|vr|}n|  |¡}tt| ¡ ƒ ||| ¡ |  |j|d ¡ qd S )Nrˆ  rU   r�  rÇ  )r  r™  r   rH   rŽ   r–  rk  r”  )rn   rš  rv  r”  r×   Únprq   rq   rr   rk  j
  s   
øz"PdfWriter._insert_filtered_outlinec                 C   s   dS )z"To match the functions from MergerNrq   rt   rq   rq   rr   rO  z
  s   zPdfWriter.closec                 C   s¸   |d u r	|   ¡ }ntd|ƒ}d}|d urZ|j|ks!| dd ¡|kr$|gS d|v rB|  |tt|d ƒ¡}|rBd|v r>|g| S g | S d|v rR|d7 }tt|d ƒ}nd S |d usd S d S )NrH   r   rÇ  r‘  r’  r   )r†  r   r€   r  Úfind_outline_itemrQ   rH   )rn   rž  rk  r–  rZ  Úresrq   rq   rr   rœ  
  s&   


ÿïzPdfWriter.find_outline_itemc                 C   s   |   ||¡S )zZ
        .. deprecated:: 2.9.0
            Use :meth:`find_outline_item` instead.
        )rœ  )rn   rž  rk  rq   rq   rr   Úfind_bookmark�
  s   
zPdfWriter.find_bookmarkc                 C   s€   |du r	i | _ dS t|tƒr"z	| j t|ƒ= W dS  ty!   Y dS w t|tƒr<z
| j t|jƒ= W dS  ty;   Y dS w tdƒ‚)a)  
        reset the translation table between reader and the writer object.
        late cloning will create new independent objects

        :param reader: PdfReader or IndirectObject refering a PdfReader object.
                       if set to None or omitted, all tables will be reset.
        Nzinvalid parameter {reader})r\   r‹   r   rš   r›   r@   r‚   r  rq   rq   rr   Úreset_translation©
  s   


ÿ
ÿzPdfWriter.reset_translation)rU   )rW   rT   )NN)rq   )rW   N)r   rq   )NNr   r~   )NNNN)NNFFrº  )F)Nrº  )NNTN)NNTrq   )«r  Ú
__module__Ú__qualname__Ú__doc__r   rs   ru   r   r   ÚBaseExceptionr   rz   ÚpropertyrÐ   r|   ÚsetterrD   r@   rb   r   rŒ   rŽ   r�   r   r
   r	   r   r–   r    r¨   rª   r¬   r´   r¶   r»   r¼   r¾   rÀ   r   ro   r  rÅ   rÆ   ÚdecimalÚDecimalrÊ   rË   r<   rG   r9   rÖ   rå   ræ   rò   rõ   r   rþ   r   ÚOPTIONAL_READ_WRITE_FIELDr   r+   r  r  r  r  r  r  ÚALL_DOCUMENT_PERMISSIONSr]  r4   rB  r   rM  r   r   r   ry   rH  rI  rJ  ri  rj  r7   r8   r=   r?   rA   rC   rB   rG  rs  r�  r‚  rH   r†  r‰  rˆ  r‹  r‘  r’  r˜  r™  rœ  r"   rP   r¦  r§  r«  r5   r>   r´  rN   rS   r»  rÁ  rÃ  rÆ  rÈ  rÉ  rÌ  rÍ  rÏ  rÐ  rö  rø  rú  rû  rE   r  r  r  r  r'  rO   r!  r$  r*  r,  r-  r%  r1  r;  rR   r7  r9  r=  r?  r:  r@  r  rQ  r   r   rZ  rK   rƒ   rL   r^  r�  r   rm  ry  rl  rj  r™  rk  rO  rQ   rœ  rž  rŸ  rq   rq   rq   rr   rT   …   s>   (
þýü
û

	ýþý
ü
ÿ
þüþýü
û"ýþý
üýþý
üüþýü
ûüþýü
ûÿÿÿ
þ		ÿÿÿ
þÿÿÿ
þüþýü
ûüþýü
ûþ "	Rÿ
ÿ
þýþý
üýþý
üüþ
ýü
ûEüþ
ýü
ûýþý
üýþý
üùþýüûúù
ø^"		÷ÿþ
òQ&		#ûþýüû
ú(ý
þý
üÿÿÿ
þüþýüûÿÿÿþÿÿÿþöþýüûúùø	÷
ö
õPøþýüûúùø	÷

öøþýüûúùø	÷

öÿ
ÿ
þýþý
üÿ
þüþýü
û)ÿÿ
þ		Nÿÿ
þ-ÿÿ
þúþýüûú
ùPûþýüû
úúþýüûúù
ø$úþýüûúù
ø
	!					$	ÿþ)öþ$ÿý"ÿú	÷
öõ5ùþýüûúùø þ
ýüû9
þ
ýüûþ
ýüûþý
üûú3þ
ýüû üþ
ýüûý
þý
üý
þý
üÿÿþrT   r   rW   c                 C   sÆ   t | tƒr| S t | tƒr&tƒ }|  ¡ D ]\}}t|ƒ}t|ƒ}|||< q|S t | tƒr<tƒ }| D ]	}| 	t|ƒ¡ q0|S t | t
ƒrN|  d¡rJt| ƒS t| ƒS t | ttfƒrYt| ƒS tdt| ƒ› d�ƒ‚)Nr²  z
type(obj)=z! could not be casted to PdfObject)r‹   rD   rH  r=   rf  rA   rF  r˜   r7   rƒ   r–   Ú
startswithrG   rŒ   r  r?   rÂ  Útype)r   rI  rA  rh  Úname_keyÚcasted_valuerp  Úelrq   rq   rr   rF  Ã
  s.   





ÿrF  r¥  r¬  r­  r¯  r®  c                    s²   t ƒ }| d ur| |tdƒ< | tdƒt|ƒi¡ |r:t|tƒr#t|ƒ}t d¡‰ | tdƒt	‡ fdd„|D ƒƒi¡ |s>|rWd}|rF|d7 }|rL|d	7 }| td
ƒt
|ƒi¡ |S )Nr   rÇ  z1.00000r—  c                    s    g | ]}t t |¡ ˆ ¡ƒ‘qS rq   )r?   r¦  r§  Úquantize)rm  Úc©Úprecrq   rr   ro  õ
  r  z(_create_outline_item.<locals>.<listcomp>r   r   rÍ   ré   )rH   rA   r]   rI   r‹   r–   rJ   r¦  r§  r7   rC   )r¥  r¬  r­  r¯  r®  rž  Úformat_flagrq   r±  rr   r¸  ß
  s2   ÿÿ

ÿÿÿr¸  c                       s*   e Zd Zdededdf‡ fdd„Z‡  ZS )ÚPdfFileWriterrg  ÚkwargsrW   Nc                    s"   t dddƒ tƒ j|i |¤Ž d S )Nr´  rT   r‘   )r#   Úsuperrs   )rn   rg  rµ  ©r}  rq   rr   rs     s   zPdfFileWriter.__init__)r  r   r¡  r	   rs   Ú__classcell__rq   rq   r·  rr   r´    s    "r´  )|rd   rp  r¦  Úloggingr/  rƒ  rV  r-  rà   rˆ   Úhashlibr   Úior   r   r   Úpathlibr   Útypesr   Útypingr   r	   r
   r   r   r   r   r   r   r   r   r   r   rU  r   Ú_pager   r   Ú_readerr   Ú	_securityr   r   r   Ú_utilsr   r   r   r    r!   r"   r#   r$   Ú	constantsr%   r&   rÞ   r'   r(   ri   r)   r4  r*   r+   r,   r-   r.   r/   r  r0   r^   r1   r1  r2   r  r3   r4   Úgenericr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Ú	pagerangerK   rL   rM   rN   rO   rP   rQ   rR   rS   Ú	getLoggerr  r£   r¨  r©  rT   r–   rŒ   rF  r  r]  r¸  r´  rq   rq   rq   rr   Ú<module>   s’   <(
`$

                    *R
ÿþýüû
ú$