
     h7                    p   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jo        ep          Zq e@d           Zr eMd          Zs G d d          Ztde eeuef         euevee         f         de^fd Zwd!e deZf         d"eud#e eexexexf         eudf         d$eyd%eydebfd&Zz G 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                   |   e Zd ZdZddeddfdZddZdeee	                  d	ee	         d
ee
         ddfdZedefd            Zej        deddfd            ZdedefdZ	 	 ddedeef         dee         defdZdeeef         defdZ	 ddedeeegdf         dee         defdZddZ	 ddedee         defdZ	 ddedee         defdZ	 	 ddededee         defdZ 	 	 ddededee         defd Z!	 dd!ee         d"ee         defd#Z"d"edefd$Z#defd%Z$defd&Z%ede&e         fd'            Z'	 dd(ee(         d)ee(         defd*Z)	 dd(ee(         d)ee(         defd+Z*	 	 	 dd(ee+j,                 d)ee+j,                 dedefd,Z-	 	 	 dd(ee+j,                 d)ee+j,                 dedefd-Z.edede/e0e1f         fd.            Z2e2j        d/edee/ef         ddfd0            Z2d1eddfd2Z3d1eddfd3Z4d4ed5eeef         ddfd6Z5d7ed8eeef         ddfd9Z6	 dd:e7d;eeegdf                  ddfd<Z8	 dd:e7d;eeegdf                  ddfd=Z9e:fded>e;eef         d?e<ddfd@Z=e:fded>e;eef         d?e<ddfdAZ>d:e7ddfdBZ?d:e7ddfdCZ@	 dd:e7d;eeegdf                  ddfdDZA	 dd:e7d;eeegdf                  ddfdEZBdddFeCddfdGee         dHee         dIeDdJeEdKee         dLee         ddfdMZFdNeGddfdOZHdNeeIef         deJeDeKf         fdPZLdNeGde&e         fdQZMdNeGdRe&e         defdSZNdNeGddfdTZOdUe;eef         ddfdVZPdUe;eef         ddfdWZQdXeeReSeTeUeeVeeWe0eXf
         ddfdYZYd5edefdZZZdedefd[Z[dedefd\Z\de]fd]Z^deRfd^Z_edeRfd_            Z`de]fd`ZadeRfdaZbdeRfdbZc	 	 	 	 ddcedee]f         ddede]ef         deede]ef         d/edee]f         def
dfZd	 dd/eee]f         ddede]ef         defdgZe	 dd/eddee]         defdhZf egdij          	 	 ddiehddede]ef         deede]ef         defdk            Zi egdij          	 ddiehddee]         defdl            Zj egdij          	 ddiehddee]         defdm            Zkddddndneldfdoed!edeeef         ddede]ef         deede]ef         dpeeeJe(e(e(f         ef                  dqeDdreDdsemdtee         defduZn	 	 	 	 	 ddoedteddede]ef         dpeeJe(e(e(f                  dqeDdreDdseodwepdefdxZq	 	 	 	 	 ddoedteddede]ef         dpeeJe(e(e(f                  dqeDdreDdseodwepdefdyZrddzZsdoe0d{eeeRf         ddfd|Zt	 	 ddcee         d/ee         defd}Zud/e/defd~Zv	 	 ddoed!ee         dtee         defdZwdoedtedefdZxddZyddZzddeDddfdZ{	 ddeDddfdZ|ddeDddfdZ}	 ddeDddfdZ~	 	 dd!edededeeR         dtee         ddfdZ	 ddtedededeeR         ddf
dZ	 	 ddtedcededeeR         dseodwepddfdZ	 	 ddtedcededeeR         dseodwepddfdZdZdee         fdZdee         fdZdeeVef         ddfdZdeddfdZdeddfdZedee         fd            Zej        deddfd            Zedee         fd            Zej        deddfd            ZdZdee         fdZdee         fdZdeddfdZdeddfdZedee         fd            Zej        deddfd            Zedee         fd            Zej        deddfd            Zd!ede;eef         ddfdZdeeef         defdZdeeIee7f         deJeee         f         fdZ	 	 	 	 ddeee7eIf         dieedeeJeef         eJeeef         e&e         f         dedeeJeef         eJeeef         e&e         f         deDdeee&e         eJedf         f                  ddfdZ egdid          	 	 	 	 ddee         deeIee7f         diee         dee         deDdeee&e         eJedf         f                  ddfd            ZdeTde;eef         d:e7defdZdeeef         de;eef         d:e7ddfdZdedeeeeXf         de;eef         d:e7dee         fdZdeee&eT         f         dede;eef         d:e7de&e/         f
dZdede;eef         d:e7de&e/         fdZd/e/de]fdZ	 dde&e/         ddee]ef         deede]ef         ddfdZddZ	 ddie;eef         dXee         dee&e                  fdZ egdij          	 ddie;eef         dXee         dee&e                  fd            Z	 dd:ede7ef         ddfdZdS )	PdfWriterz
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
     fileobjreturnNc           	         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          z             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>   updaterB   PATYPECOUNTrD   KIDSr8   _add_object_pagesrJ   codecsBOM_UTF16_BEencode_info_root_objectCOCATALOGPAGES_rootrX   with_as_usage)selfrX   pagesinfos       S/var/www/flask_pdf_extract_app/myenv/lib/python3.11/site-packages/PyPDF2/_writer.py__init__zPdfWriter.__init__   s   ")+8:9; !""27##Z%9%928$$l1oo27##[]]	
 	
 	
 &&u--  !!;'')='(//**E*EE* *	
 	
 	
 %%d++
 -..  27##Z
%;%;28$$dk	
 	
 	
 %%d&788
"    c                     d| _         | S )z+Store that writer is initialized by 'with'.T)rp   rq   s    rt   	__enter__zPdfWriter.__enter__   s    !rv   exc_typeexc	tracebackc                 L    | j         r|                     | j                    dS dS )zWrite data to the fileobj.N)rX   write)rq   rz   r{   r|   s       rt   __exit__zPdfWriter.__exit__   s2     < 	%JJt|$$$$$	% 	%rv   c                     | 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.
        r\   rx   s    rt   
pdf_headerzPdfWriter.pdf_header   s     |rv   
new_headerc                     || _         d S Nr   )rq   r   s     rt   r   zPdfWriter.pdf_header   s    !rv   objc                     t          |d          r|j        j        | k    r|j        S | j                            |           t          t          | j                  d|           |_        |j        S )Nindirect_referencer   )hasattrr   pdfr]   appendrA   lenrq   r   s     rt   re   zPdfWriter._add_object   sl    3,-- 	*#2H2LPT2T2T))S!!!!/DM0B0BAt!L!L%%rv   r   idoc                    |-|t          d          |}t          j        dt                     |J t	          |t
                    r| j        |dz
           S |j        | k    rt          d          | j        |j        dz
           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intr]   r   idnum)rq   r   r   s      rt   
get_objectzPdfWriter.get_object   s    
 ?!- ]   &)"]&  
 ***(#.. 	9=!3a!788!T))/000}/59::rv   c                 N    t          ddd           |                     |          S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        	getObjectr   3.0.0)r$   r   )rq   r   s     rt   r   zPdfWriter.getObject   s(     	%[,HHHs###rv    pageactionexcluded_keysc                    t          t          |t          j                           t          j        k    sJ |}t          |          }|t          j        dgz  }	 | j        t          |j
        j                           |j
        j        = n# t          $ r Y nw xY wt          d|                    | d|                    }|j        O|j        j        }t!          |t                    r|                                }t%          | j        |          | _        | j        |t)          t          j                  <   t          t*          |                     | j                            }|j
        J  ||t          j                 |j
                   t          t0          |t          j                           }t5          |dz             |t)          t          j                  <   |S )Nz/StructParentsr   Fr   )r   strra   rb   rl   PAGElistPARENTr_   idr   r   r   	Exceptioncloner   r   ri   r    rf   rB   r>   r   rd   r   rc   rD   )rq   r   r   r   page_orgotherrr   
page_counts           rt   	_add_pagezPdfWriter._add_page   s    Cbg''272222]++")%566	#Bx'B'F$G$GH+1   	 	 	D	L(..um"L"LMM<#L+E%%% '9$/5QQDO&*kZ	""#%tt{'C'CDD&222uRW~t6777#uRX//
&2:>&B&Bj""#s   /B	 	
BBc                    	 | j         }t          j        |vrT| j                             t	          t          j                  t          t          | j                  d|           i           t	          t          j	                  }t          d          | j         t          j                 |<   d S # t          $ r3}t                              dt          |                     Y d }~d S d }~ww xY w)Nr   Tz&set_need_appearances_writer() catch : )rk   r(   	ACRO_FORMr`   rB   rA   r   r]   r/   NeedAppearancesr9   r   loggererrorrepr)rq   catalogneed_appearancesr{   s       rt   set_need_appearances_writerz%PdfWriter.set_need_appearances_writer  s    	N'G *'99!(("#4#>??..4B B    **D*TUUO\]aObObD/9:;KLLL 	N 	N 	NLLA499MMMMMMMMM	Ns   B)B- -
C*7(C%%C*c                 D    |                      |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   rq   r   r   s      rt   add_pagezPdfWriter.add_page2  s     ~~dDK???rv   c                 P    t          ddd           |                     ||          S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        addPager   r   )r$   r   r   s      rt   r   zPdfWriter.addPageC  s*     	%Y
GDDD}}T=111rv   r   indexc                 6    |                      |f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                 0    |                      |          S r   )insert)lpr   s     rt   <lambda>z'PdfWriter.insert_page.<locals>.<lambda>]  s    %1C1C rv   )r   rq   r   r   r   s     ` rt   insert_pagezPdfWriter.insert_pageP  s#     ~~d$C$C$C$CDDDrv   c                 R    t          ddd           |                     |||          S )zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        
insertPager   r   )r$   r   r   s       rt   r   zPdfWriter.insertPage_  s.     	%\='JJJe];;;rv   page_number
pageNumberc                 l   |$|t          d          t          ddd           |}||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   rf   r   ra   rd   )rq   r   r   rr   s       rt   get_pagezPdfWriter.get_pagem  s     !& !LMMM&&(?   %K:#5=>>>T#s(^T__T[%A%ABBJbg{ ; F F H HIIIrv   c                 N    t          ddd           |                     |          S )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        getPagezwriter.pages[page_number]r   )r$   r   )rq   r   s     rt   r   zPdfWriter.getPage  s)     	%Y0KWUUU}}Z(((rv   c                     t          t          t          t          f         |                     | j                            }t          |t          d                             S )Nz/Count)r   r   r   r
   r   rf   r   rB   )rq   rr   s     rt   _get_num_pageszPdfWriter._get_num_pages  sB    T#s(^T__T[%A%ABB5H--.///rv   c                 L    t          ddd           |                                 S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        getNumPageszlen(writer.pages)r   )r$   r   rx   s    rt   r   zPdfWriter.getNumPages  s)     	%]4GQQQ""$$$rv   c                 6    t          | j        | j                  S )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r   r   rx   s    rt   rr   zPdfWriter.pages  s     D/???rv   widthheightc                 \    t          j        | ||          }|                     |           |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   )rq   r   r   r   s       rt   add_blank_pagezPdfWriter.add_blank_page  s/     +D%@@drv   c                 P    t          ddd           |                     ||          S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        addBlankPager   r   )r$   r   )rq   r   r   s      rt   r   zPdfWriter.addBlankPage  s-     	%^5EwOOO""5&111rv   c                     ||@|                                  dz
  |k    r%| j        |         }|j        j        }|j        j        }t          j        | ||          }|                     ||           |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   rr   mediaboxr   r   r   r   r   )rq   r   r   r   oldpager   s         rt   insert_blank_pagezPdfWriter.insert_blank_page  sy    & =FN0C0C0E0E0Ie/S/Sj'G$*E%,F+D%@@u%%%rv   c                 R    t          ddd           |                     |||          S )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        insertBlankPager   r   )r$   r   )rq   r   r   r   s       rt   r   zPdfWriter.insertBlankPage  s0     	%%68KWUUU%%eVU;;;rv   c                    d| j         vrdS | j         d         }t          |t          t          f          rt	          t          |                    S t          |t
                    rm	 |dd         \  }}|dd         }t          |t          |                    }t          d||          S # t          $ r}t          d| d|           d}~ww xY 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 : )
rk   r   r   bytesrJ   r8   r?   tupler=   r   )rq   oar   typarrayfitr{   s          rt   open_destinationzPdfWriter.open_destination  s      1114}-b3,'' 	'B000K(( 		DqsG	c122#uU||,,"<s;;; D D D Br B BS B BCCCD 4s   'AB, ,
C6CCdestc                    |	 | j         d= d S # t          $ r Y d S w xY wt          |t                    r&t	          |          | j         t          d          <   d S t          |t                    r|j        | j         t          d          <   d S t          |t                    rLt          d|j	        |j	        nt                      t                    j        | j         t          d          <   d S d S )Nr   Opening)rk   KeyErrorr   r   rH   rB   r=   
dest_arrayr   r   rC   r6   rq   r   s     rt   r   zPdfWriter.open_destination  s   <%m444   c"" 	;KD;Q;QDj77888k** 		;??Dj77888j)) 	;F*6 ''\\< <  j77888	 	s    

javascriptc           
      ~   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          j                                                   |                    |                     |                     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)rk   r>   rB   CANAMESr   r8   r`   ra   rb   rH   r   rJ   r   uuiduuid4re   )rq   r   namesjs_listjss        rt   add_jszPdfWriter.add_js  sl    4,,,6F6H6HDj223%t'8'BCC%%/?H%%{}}50 0E*]++, .m0DEEhO
 
 
		27##Z	%:%:4  *]";";5!!#3zO#D#D	
 	
 	
 	+C
,=,=>>???t''++,,,,,rv   c                 N    t          ddd           |                     |          S )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        addJSr   r   )r$   r   )rq   r   s     rt   r   zPdfWriter.addJS;  s(     	%Wh@@@{{:&&&rv   filenamedatac           	         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`   rB   ra   rb   r>   r-   FrJ   EFr   r   r8   rk   )rq   r   r   
file_entryef_entryfilespecembedded_files_names_dictionaryembedded_files_dictionarys           rt   add_attachmentzPdfWriter.add_attachmentD  s   8 )**
D!!!:bg..
?0K0KLMMM $%%D)):6777#%%27##Z%<%<=?@@BVC C =@AA8	
 	
 	
* +;*<*<''..28$$k)(33X>' '	
 	
 	
 %5$6$6!!((())+JK	
 	
 	
 	  *RX"6"68Q!RSSSSSrv   fnamefdatac                 P    t          ddd           |                     ||          S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        addAttachmentr  r   )r$   r  )rq   r	  r
  s      rt   r  zPdfWriter.addAttachment  s-     	%_6FPPP""5%000rv   readerafter_page_appendc                     t          |j                  }t          |          D ]>}|j        |         }|                     |          }t	          |          r ||           ?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   rr   ranger   callable)rq   r  r  reader_num_pagesreader_page_numberreader_pagewriter_pages          rt   append_pages_from_readerz"PdfWriter.append_pages_from_reader  sx    & v|,,"'(8"9"9 	/ 	/ ,'9:K--44K)** /!!+...	/ 	/rv   c                 T    t          ddd           |                     ||           dS )zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        appendPagesFromReaderr  r   N)r$   r  rq   r  r  s      rt   r  zPdfWriter.appendPagesFromReader  s=     	%#%?	
 	
 	
 	%%f.?@@@@@rv   fieldsflagsc           	      V   |                                   t          j        |vrt          dt                     dS t          t          |t          j                                     D ]}|t          j                 |                                         }i }t          j        |v r|t          j                 }|D ]n}|	                    t          j                  |k    r|	                    t          j                  dk    rA|                    t          t          j                  t          ||                   i           |                    t          t          j                  t%          ||                   i           |r;|                    t          t          j                  t)          |          i           
|	                    t          j                  |k    rA|                    t          t          j                  t%          ||                   i           p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`   rB   r&   ASVrH   FfrD   )rq   r   r  r  jwriter_annotwriter_parent_annotfields           rt   update_page_form_field_valuesz'PdfWriter.update_page_form_field_values  s   ( 	((***9D  =xHHHFs4	?++,, &	 &	A	?1-88::L"$yL((&229&=#    ##$=$?@@EII#''(A(DEEOO$++ *$B$E!" !"#-fUm#<#<   !''&'@'BCCEU &uF F    $++ *+D+G H H,$)K" K"   ),,-F-HIIURR'..&'@'BCCEU &uF F  5 &	 &	rv   c                 R    t          ddd           |                     |||          S )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        updatePageFormFieldValuesr*  r   )r$   r*  )rq   r   r  r  s       rt   r,  z#PdfWriter.updatePageFormFieldValues  s8     	%')H'	
 	
 	
 11$FFFrv   c                 d    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ROOTrk   rq   r  s     rt   clone_reader_document_rootz$PdfWriter.clone_reader_document_root  s&     !!16>"'3JKKrv   c                 R    t          ddd           |                     |           dS )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        cloneReaderDocumentRootr2  r   N)r$   r2  r1  s     rt   r4  z!PdfWriter.cloneReaderDocumentRoot%  s:     	%%'CW	
 	
 	
 	''/////rv   c                 \    |                      |           |                     ||           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)r2  r  r  s      rt   clone_document_from_readerz$PdfWriter.clone_document_from_reader0  s5    " 	''///%%f.?@@@@@rv   c                 T    t          ddd           |                     ||           dS )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        cloneDocumentFromReaderr6  r   N)r$   r6  r  s      rt   r8  z!PdfWriter.cloneDocumentFromReaderD  s=     	%%'CW	
 	
 	
 	''0ABBBBBrv   Tuser_passwordowner_password
use_128bitpermissions_flaguser_pwd	owner_pwdc           	      D   |'|t          d          t          j        d           |}|t          d          |8|t          d          d}d}t          j        | d| d	t          
           |}||}|rd}	d}
t	          d          }nd}	d}
t	          d          }|}t          t          |||
|                    }t          t          t          t          j	                              
                    d                                                              }t          t          t          t          j                              
                    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z            |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   r:   r   r   r   timeri   digestrandomr8   _IDr   r   r>   rB   SAFILTERrD   LENGTHEDROUPre   _encrypt_encrypt_key)rq   r9  r:  r;  r<  r=  r>  old_termnew_termr$  revkeylenrT  rR  ID_1ID_2rS  keyencrypts                      rt   r^  zPdfWriter.encryptS  s   8 ( =  
 7  
 !) <=== ) _   '+# K K8@K K K 0    "+!*N 	!AC\\FFAC[[FVNM3OOPPT$)++%6%6$>$>v$F$F G G N N P PQQT&-//%:%:$B$B6$J$J K K R R T TUUd|,,!88M1a66FAss!8888M31dEJJFAs"$$)3K)@)@
29%%&$0OO
4  !66-9&1*-E-EGJry))*$0$5$5
24  !$4Q$7$7
24  !$4Q$7$7
24  !$0OO
24  !((11rv   streamc                    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   ra  r%   namer  ro   re   rk   _sweep_indirect_references_write_header_write_xref_table_write_trailerr~   r!   )rq   r_  object_positionsxref_locations       rt   write_streamzPdfWriter.write_stream  s    66"" 	s&+'='=6 6 6 6   z 	=))$*;<<DJ 	''
333--f55..v7GHHF###R@@@@AABBBBBrv   c                 
   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.
        FrW   zOutput(stream=z) is empty.wbT)r   r   r   r   r   rp   rj  close)rq   r_  my_files      rt   r~   zPdfWriter.write  s     R<<AfAAABBBfsDk** 	FD))F!%DG&!!! 	LLNNNrv   c           	         g }|                     | j        dz              |                     d           t          | j                  D ]\  }}| j        |         }|m|dz   }|                    |                                           |                     t          t          |                    dz              d }t          | d          r|| j	        j
        k    rt          j        d|dz             d d         }t          j        dd          d d	         }| j        |z   |z   }t          |          t          | j                  d
z   k    sJ t          |                                          }	|	d t#          dt          | j                  d
z                      }|                    ||           |                     d           |S )N   
s   %
r   s    0 obj
rU  z<irE  r   r         s   
endobj
)r~   r   	enumerater]   r   tellr!   r   r   rU  r   structpackrV  r   r   rJ  minwrite_to_stream)
rq   r_  rh  ir   r   r]  pack1pack2md5_hashs
             rt   re  zPdfWriter._write_header  s   T_u,---+,,,.. 	, 	,FAs-"CA ''666RE

^^k9:::4,, J$-:M1M1M"Ka!e44RaR8E"Ka00!4E+e3e;Cs88D,=(>(>(BCCCC"3xx00H"#HSS1B-C-Ca-G%H%H#HIC##FC000]+++rv   rh  c           	         |                                 }|                    d           |                    t          dt          | j                  dz    d                     |                    t          ddddd	d
                     |D ],}|                    t          |dddd	d                     -|S )Ns   xref
z0 r   
r   z0>10 i  z0>5z f 
z n 
)rt  r~   r!   r   r]   )rq   r_  rh  ri  offsets        rt   rf  zPdfWriter._write_xref_table  s    YR7S//!377788999R1444E444455666& 	< 	<FLLv999Q9999::;;;;rv   c           	      T   |                     d           t                      }|                    t          t          j                  t          t          | j                  dz             t          t          j	                  | j
        t          t          j                  | j        i           t          | d          r!| j        |t          t          j                  <   t          | d          r!| j        |t          t          j                  <   |                    |d            d S )Ns   trailer
r   rL  rU  )r~   r>   r`   rB   r/  SIZErD   r   r]   r0  ro   INFOrj   r   rL  IDrU  ENCRYPTrx  )rq   r_  r.  s      rt   rg  zPdfWriter._write_trailer  s    \""""$$27##\#dm2D2Dq2H%I%I27##TZ27##TZ	
 	
 	
 4 	2)-GJru%%&4$$ 	<.2mGJrz**+-----rv   infosc                     i }t          |                                          D ]$\  }}t          |          |t          |          <   %|                     | 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   itemsrJ   rB   r   rj   r`   )rq   r  argsr]  values        rt   add_metadatazPdfWriter.add_metadata  sq     u{{}}-- 	@ 	@JC$8$?$?DC!!
##**400000rv   c                 R    t          ddd           |                     |           dS )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        addMetadatar  r   N)r$   r  )rq   r  s     rt   r  zPdfWriter.addMetadata!  s0     	%]NGLLL%     rv   rootc                 ~   t          j                    }g }d }g }d }|                    ||||f           t          |          r|                                \  }}}}t          |t          t          f          r<|                                D ]&\  }}	|                    |	|||||gz   ng f           'nt          |t                    r~|j
        | k    rs|                     |          }t          |          |vrM|                    t          |                     |                    |                                d d g f           t          |t          t          f          rt          |t                    r(|                     |                     |                    }g }
||         |k    r'|                                gd |D             z   }
|||<   |
D ]Q}| j                            |d           }|2|                                }||| j        |                                <   Rt          |          d S d S )Nc                 6    g | ]}|                                 S r   )
hash_value).0grant_parents     rt   
<listcomp>z8PdfWriter._sweep_indirect_references.<locals>.<listcomp>j  s1     = = =6B//11= = =rv   )collectionsdequer   r   popr   r8   r>   r  rA   r   _resolve_indirect_objectr   r   rG   re   r  r^   )rq   r  stack
discoveredparentgrant_parents	key_or_idr   r]  r  update_hashesold_hashr   indirect_reference_objs                 rt   rd  z$PdfWriter._sweep_indirect_references*  s   ,  	 
)+	 	dFI}=>>>%jj 0	35:YY[[2D&)] $.> ?@@ J"&**,,  JCLL! 8>8JMVH44PR	    D.11 J8t##88>>D4yy
22"))#d))444doo&7&7tR%HIII &#3["ABB 3dL11 Q  889I9I$9O9OPPD " )$,,%+%6%6%8%8$9 = =FS= = = %M )-F9% !. 	3 	3H)-)9)=)=h)M)M&)51C1N1N1P1P.1= !3 !, 6 A A C C] %jj 0	3 0	3 0	3 0	3 0	3rv   c                 F   t          |j        d          r2|j        j        j        r!t	          d|j        j        j                   |j        | k    r|S |j                            |          }|4t          d|j        j	         d| dt                     t                      }|                                }|| j        v r| j        |         S |j        | k    rt          |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.
        r_  zI/O operation on closed file: NzUnable to resolve [r   z], returning NullObject insteadr   )r   r   r_  closedr   rc  r   r%   	__class__r  rC   r  r^   rA   r   re   )rq   r   real_objr  s       rt   r  z"PdfWriter._resolve_indirect_object{  sA    48X&& 	V48?+A 	VTdho>RTTUUU8tK 8&&t,,/dn&= / / / / /  
 "||H((**
 )))#J//8t+9$*a+N+NDZ(( ,0+;+;H+E+EDZ(
++rv   c                     | j                             |          dz   }t          |d|           }|                                |k    sJ |S Nr   r   )r]   r   rA   r   )rq   r   r   refs       rt   get_referencezPdfWriter.get_reference  sM    ##C((1,UAt,,~~3&&&&
rv   c                 N    t          ddd           |                     |          S )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        getReferencer  r   )r$   r  r   s     rt   r  zPdfWriter.getReference  s*     	%^_gNNN!!#&&&rv   c                    t           j        | j        v rst          t          | j        t           j                           }| j                            |          dz   }t          |d|           }|                                |k    sJ nYt	                      }|	                    i            | 
                    |          }|| j        t          t           j                  <   |S r  )rl   OUTLINESrk   r   rI   r]   r   rA   r   r`   re   rB   )rq   outliner   outline_refs       rt   get_outline_rootzPdfWriter.get_outline_root  s    ;$+++:t'8'EFFGM''0014E(488K))++w66666 llGNN2**733K9DDj556rv   c                     t           j        | j        v r+t          t          | j        t           j                           }n/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
        )rl   THREADSrk   r   r8   rB   )rq   threadss     rt   get_threads_rootzPdfWriter.get_threads_root  sT     :***;(9"*(EFFGG!mmG8?Dj445rv   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  rx   s    rt   r  zPdfWriter.threads  s     $$&&&rv   c                 L    t          ddd           |                                 S )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        getOutlineRootr  r   )r$   r  rx   s    rt   r  zPdfWriter.getOutlineRoot  s*     	%%57I7SSS$$&&&rv   c                    t           j        | j        v rt          | j        t           j                 t                    r[t          t          | j        t           j                           }|j        }t           j        |v rt          |t           j                 t                    rt          t          |t           j                           }|j        }t           j        |v r't          t          |t           j                           }nCt                      }||t          t           j                  <   nt	                      }| 
                    |          }||t          t           j                  <   t                      }||t          t           j                  <   nt	                      }| 
                    |          }|| j        t          t           j                  <   t	                      }| 
                    |          }||t          t           j                  <   t                      }||t          t           j                  <   |S r   )r   r   rk   r   r>   r   r   DESTSr8   rB   re   )rq   r   	names_refdests	dests_refnds         rt   get_named_dest_rootzPdfWriter.get_named_dest_root  s   8t(((Zbh')9.
 .
( )4+<RX+FGGE0Ix5  ZbhAQ%R%R -uRX??!4	8u$$k5?;;BB$B24E*RX..//(** ,,U33	.7j**+ ]].0j**++ %&&E((//I6?Dj223$&&E((//I*3E*RX&&'B*,E*RX&&'	rv   c                 L    t          ddd           |                                 S )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        getNamedDestRootr  r   )r$   r  rx   s    rt   r  zPdfWriter.getNamedDestRoot  s+     	%%79NPWXXX'')))rv   page_destinationr  beforec                    ||t          d          |'d}d}t          j        | d| dt                     |}|t          d          ||                                 }t          t          |                                          }|                     |          }||j	        }|
                    |||            |S )Nz[The argument dest of add_outline_item_destination is deprecated. Use page_destination only.r   r  r@  rA  rB   page_destination may not be None)r   r   r   r   r  r   rI   r   re   r   insert_child)rq   r  r  r  r   rW  rX  page_destination_refs           rt   add_outline_item_destinationz&PdfWriter.add_outline_item_destination  s    'D,<m   H)HM G G4<G G G ,     $#?@@@>**,,Fj&"3"3"5"566#//0@AA.F0&$???##rv   c                 P    t          ddd           |                     ||          S )zf
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_destination` instead.
        add_bookmark_destinationr  r   r$   r  rq   r   r  s      rt   r  z"PdfWriter.add_bookmark_destination0  s6     	%&(F	
 	
 	
 00v>>>rv   c                 P    t          ddd           |                     ||          S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_destination` instead.
        addBookmarkDestinationr  r   r  r  s      rt   r  z PdfWriter.addBookmarkDestination?  s6     	%$&Dg	
 	
 	
 00v>>>rv   outline_item)bookmarkc                 6   t                      }t          |                                          D ]$\  }}||t          t	          |                    <   %|                    |           d|v rt                      }t          t          |d                   }t          |                                          D ]$\  }}||t          t	          |                    <   %|                     |          }	|	|t          d          <   | 	                    |||          S )N/A)
rI   r   r  rB   r   r`   r>   r   re   r  )
rq   r  r  r  outline_item_objectkvr   a_dict
action_refs
             rt   add_outline_item_dictzPdfWriter.add_outline_item_dictL  s    )ll++--.. 	8 	8DAq67
3q66 2 233""<000<%''F*L,>??FV\\^^,, / /1-.z#a&&))**))&11J4>
4 0 01001DffUUUrv   c                 P    t          ddd           |                     ||          S )z_
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item_dict` instead.
        add_bookmark_dictr  r   r$   r  rq   r  r  s      rt   r  zPdfWriter.add_bookmark_dictb  s6     	%!8'	
 	
 	
 )),???rv   c                 P    t          ddd           |                     ||          S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item_dict` instead.
        addBookmarkDictr  r   r  r  s      rt   r  zPdfWriter.addBookmarkDictp  s6     	%6	
 	
 	
 )),???rv   Ftitlecolorbolditalicr   pagenumc
           
         t          |t                    r"|||}|                     |||d||||          S ||	t          d          |d}
n/t          |t                    r|}net          |t
                    r|j        }nHt          |t                    r3	 | j        |         j        }n# t          $ r t          |          }Y nw xY w|&t          d| t                     t                      }t          t          d|z   dz             ||          }|                     t#          t          t$          j                  |j        t          t$          j                  t          d          i                    }
t-          |
||||          }||                                 }|                     |||          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.
        NMThe 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   rA   r   r   r   rr   
IndexErrorrD   r%   r  rC   r=   rB   re   r>   r.   Dr   S_create_outline_itemr  r  )rq   r  r   r  r  r  r  r  r   r  r  page_refr   r  s                 rt   r  zPdfWriter.add_outline_item~  s   8 fc"" 	;#6!(({FD&%v   "w':_   JJ+~66 9&K44 9&9K-- 99#z+6IHH! 9 9 9+K88HHH9CkCC   &<<3;899 D )) "#6#8994?"#6#899:g;N;N  J ,JufdSS>**,,F00vvNNNs   B/ /C
C/Fitr  c                 x    t          ddd           |                     ||||||t          ||                    S )zZ
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item` instead.
        add_bookmarkr  r   fit_typefit_argsr$   r  r?   	rq   r  r  r  r  r  r  r   r  s	            rt   r  zPdfWriter.add_bookmark  sQ      	%^5GQQQ$$t,,,
 
 	
rv   c                 z    t          ddd           |                     |||d|||t          ||                    S )z[
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item` instead.
        addBookmarkr  r   Nr  r  r  s	            rt   r  zPdfWriter.addBookmark  sT      	%]4FPPP$$t,,,	
 	
 		
rv   c                      t          d          )NzIThis method is not yet implemented. Use :meth:`add_outline_item` instead.)NotImplementedErrorrx   s    rt   add_outlinezPdfWriter.add_outline  s    !W
 
 	
rv   destinationc                 ^   |                                  }d}|t          |          k     r_|||         k     r;|                    ||           |                    |t          |                     d S |dz  }|t          |          k     _|                    t          |          |g           d S )Nr   r   )r  r   r   rH   extend)rq   r  r  r  ry  s        rt   add_named_destination_arrayz%PdfWriter.add_named_destination_array  s     %%''#b''kkr!u}}		![)))		!-e44555Q #b''kk 			#E**K8999rv   c                 (   ||t          d          |'d}d}t          j        | d| dt                     |}|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@  rA  rB  r  rH   /Title)r   r   r   r   re   r   r  r   )rq   r  r   rW  rX  r  s         rt   add_named_destination_objectz&PdfWriter.add_named_destination_object  s    
 'D,<m   H)HM G G4<G G G ,     $#?@@@#//0@0KLL((#%5h%?@@BV	
 	
 	
 $#rv   c                 N    t          ddd           |                     |          S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        addNamedDestinationObjectr  r   )r$   r  r   s     rt   r  z#PdfWriter.addNamedDestinationObject3  s4     	%')G	
 	
 	
 00666rv   c           
         ||t          d          |'d}d}t          j        | d| dt                     |}|t          d          |                     | j                  t          j                 |         }t                      }|	                    t          t          j                  t          |t          t          j                  t!          d          g          t          t          j                  t          d	          i           |                     |          }|                                 }	t)          |t*                    st+          t-          |                    }|	                    ||g           |S )
Nr  r  r   r@  rA  rB  zpage_number may not be Nonei:  r  )r   r   r   r   r   rf   ra   rd   r>   r`   rB   r.   r  r8   r4   FIT_HrD   r  re   r  r   rH   r   r  )
rq   r  r   r  rW  rX  r  r   dest_refr  s
             rt   add_named_destinationzPdfWriter.add_named_destination@  s    "w':_    H$HM G G4<G G G ,    "K:;;;??4;//8E!!.011;z/*?@@,sBSBST4 4 .011:g3F3F		
 	
 	
 ##D))%%''%!122 	1$SZZ00E
		5(#$$$rv   c                 P    t          ddd           |                     ||          S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        addNamedDestinationr  r   )r$   r  )rq   r  r  s      rt   r  zPdfWriter.addNamedDestinationi  s6     	%!#:G	
 	
 	
 ))%999rv   c                 :   t          t          |                     | j                            }t          t          |t
          j                           }|D ]E}t          t          |                     |                    }t          j        |v r|t          j        = FdS )z.Remove links and annotations from this output.N)	r   r>   r   rf   r8   ra   rd   r  r  )rq   pg_dictrr   r   r  s        rt   remove_linkszPdfWriter.remove_linksv  s    ')E)EFF['"'"233 	( 	(D,dood.C.CDDHyH$$RY'	( 	(rv   c                 L    t          ddd           |                                 S )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        removeLinksr
  r   )r$   r
  rx   s    rt   r  zPdfWriter.removeLinks  s(     	%]NGLLL  """rv   ignore_byte_string_objectc                    t          t          |                     | j                            }t          t          |t
          j                           }d}|D ]}t          t          |                     |                    }|d                                         }t          |t                    st          ||          }g }d}	|j	        D ]\  }
}|dv r1|
d         }|r&t          |t                    st                      |
d<   n|dk    r1|
d         }|r&t          |t                    st                      |
d<   ne|dk    r_t          t          |
d                             D ]<}|r8t          |
d         |         t                    st                      |
d         |<   =|d	k    rd
}	|dk    rd}	|	r||v r|dk    r|                    |
|f           ||_	        |                    t          d          |           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   rf   r8   ra   rd   r   r;   
operationsrH   r  r   r   __setitem__rB   )rq   r  r	  rr   jump_operatorsr   r  content_operationsseq_graphicsoperandsoperatortextry  s                 rt   remove_imageszPdfWriter.remove_images  sT    ')E)EFF['"'"233
6  '	C '	CD,dood.C.CDDH{+6688Gg}55 ;'::K L&-&8 9 9"(},,#A;D0 9.: : 9 '7&8&8%%#A;D0 9.: : 9 '7&8&8&&"3x{#3#344 @ @4 @Z$QKN,<> > @ .>-?-?HQKNt###'Lt###(L H$>$>u$$""Hh#78888!,G  K!8!8'BBBBO'	C '	Crv   ignoreByteStringObjectc                 N    t          ddd           |                     |          S )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        removeImagesr3  r   )r$   r3  rq   r4  s     rt   r6  zPdfWriter.removeImages  s+     	%^_gNNN!!"8999rv   c                    t          t          |                     | j                            }t          t          t
                   |t          j                           }|D ]	}t          t          |                     |                    }|d                                         }t          |t                    st          ||          }|j        D ]s\  }}|dv r_|d         }	|s't          |	t                    rt                      |d<   ;t          |	t          t          f          rt                      |d<   i|dk    r_|d         }	|s't          |	t                    rt                      |d<   t          |	t          t          f          rt                      |d<   |dk    rt          t          |d                             D ]|}
|s9t          |d         |
         t                    rt                      |d         |
<   =t          |d         |
         t          t          f          rt                      |d         |
<   }u|                    t#          d          |           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   rf   r   rA   ra   rd   r   r   r;   r*  rH   r:   r  r   r+  rB   )rq   r  r	  rr   r   r  r-  r0  r1  r2  ry  s              rt   remove_textzPdfWriter.remove_text  s_    ')E)EFFT.)727+;<< !	C !	CDJ(=(=>>H{+6688Gg}55 ;'::&-&8 D D"(},,#A;D4 =%d,<== =*:*<*<HQK%d-=?O,PQQ =*:*<*<HQK%%#A;D4 =%d,<== =*:*<*<HQK%d-=?O,PQQ =*:*<*<HQK&&"3x{#3#344 D D8 D)(1+a.:JKK D1A1C1CA) (A1ACS0T    D 2B1C1CA  K!8!8'BBBBC!	C !	Crv   c                 N    t          ddd           |                     |          S )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        
removeTextr9  r   )r$   r9  r7  s     rt   r;  zPdfWriter.removeText  s+     	%\='JJJ 6777rv   urirectborderc                 $   |t          j        dt                     |}|                     | j                  t
          j                 |         }t          t          t          t          f         |                     |                    }|\d |dd         D             }t          |          dk    r4t          d |d         D                       }	|                    |	           nt          d          gdz  }t          |t                    rt!          |          }n%t          |t"                    rn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.)rD  c                 ,    g | ]}t          |          S r   rB   r  ns     rt   r  z%PdfWriter.add_uri.<locals>.<listcomp>8  s    <<<A*Q--<<<rv   rE     c                 ,    g | ]}t          |          S r   rA  rB  s     rt   r  z%PdfWriter.add_uri.<locals>.<listcomp>:  s    +M+M+MaJqMM+M+M+Mrv   r   r   z/URI/Linkz/H/Ir  )r   r   r   r   rf   ra   rd   r   r   r   r
   r   r8   r   rD   r   rB   rF   r>   r`   rH   r&   r   r  r  SubtyperT  RectBorderre   )rq   r   r<  r=  r>  r  	page_linkr  
border_arrdash_patternlnk2lnklnk_refs                rt   add_urizPdfWriter.add_uri  s   * MF+   
 "KOODK009+F	S#X	(B(BCC <<<<<J6{{a*+M+M6!9+M+M+MNN!!,///&q//*Q.JdC   	)d##DDo.. 	)"4((D!!4  *V"4"46""$4S$9$9	
 	
 	
   

9>??BIAVAV9ABBJwDWDW9;<<i9>??4  *T"2"29@AA;D D 4  $
	
 	
 	
 ""3''9  RY&&w/////.97).D.DHZ	**+++rv   c                 T    t          ddd           |                     ||||          S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        addURIrQ  r   )r$   rQ  )rq   r  r<  r=  r>  s        rt   rS  zPdfWriter.addURIb  s.     	%Xy'BBB||GS$777rv   c           	         t          dd           t          |t                    rI|                                dd         }t	          d |                    d          D                       }n%t          |t                    rnt	          |          }t          j        |||t          ||                    }| 	                    ||	          S )
Nadd_link+add_annotation(AnnotationBuilder.link(...))r   c                 R    g | ]$}t          |          d k    t          |          %S )r   )r   float)r  nums     rt   r  z&PdfWriter.add_link.<locals>.<listcomp>  s)    GGG#c((Q,,s,,,rv   r  r  )r=  r>  target_page_indexr   )r   
annotation)
r$   r   r   striprF   splitr7   linkr?   add_annotation)rq   r  r  r=  r>  r   r  r\  s           rt   rU  zPdfWriter.add_linkq  s     	%E	
 	
 	
 dC   	)::<<"%D"GGtzz#GGG DD o.. 	)"4((D&+.S4000	
 
 

 ""w:"NNNrv   c                 H    t          ddd            | j        |||||g|R  S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_link` instead.
        addLinkrV  r   )r"   rU  )rq   r  r  r=  r>  r   r  s          rt   rb  zPdfWriter.addLink  sC     	#Dg	
 	
 	
 t}W&6fcQDQQQQrv   )z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 f    	 t          t          | j        d                   S # t          $ r Y d S w xY w)N/PageLayout)r   rP   rk   r   rx   s    rt   _get_page_layoutzPdfWriter._get_page_layout  sA    	
D$5m$DEEE 	 	 	44	   " 
00c                 L    t          ddd           |                                 S )Y
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        getPageLayoutpage_layoutr   )r$   re  rx   s    rt   ri  zPdfWriter.getPageLayout  s(     	%_mWMMM$$&&&rv   layoutc                    t          |t                    sJ|| j        vr2t          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: rW   rd  N)r   rB   _valid_layoutsr%   joinr  rk   r`   rq   rk  s     rt   _set_page_layoutzPdfWriter._set_page_layout  s    0 &*-- 	(T000RBGGD<O4P4P/QRR    ''F  *]";";V!DEEEEErv   c                 0    |                      |           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rp  ro  s     rt   set_page_layoutzPdfWriter.set_page_layout  s    0 	f%%%%%rv   c                 N    t          ddd           |                     |          S )rh  zwriter.setPageLayout(val)zwriter.page_layout = valr   )r$   rp  ro  s     rt   setPageLayoutzPdfWriter.setPageLayout  s4     	%')CW	
 	
 	
 $$V,,,rv   c                 *    |                                  S )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
        )re  rx   s    rt   rj  zPdfWriter.page_layout  s    . $$&&&rv   c                 0    |                      |           d S r   rr  ro  s     rt   rj  zPdfWriter.page_layout  s    f%%%%%rv   c                 2    t          ddd           | j        S )rh  
pageLayoutrj  r   r$   rj  rx   s    rt   ry  zPdfWriter.pageLayout  s     	%\='JJJrv   c                 6    t          ddd           || _        dS )rh  ry  rj  r   Nrz  ro  s     rt   ry  zPdfWriter.pageLayout)  s$     	%\='JJJ!rv   )z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 f    	 t          t          | j        d                   S # t          $ r Y d S w xY w)N	/PageMode)r   rS   rk   r   rx   s    rt   _get_page_modezPdfWriter._get_page_mode<  sA    	d&7&DEEE 	 	 	44	rf  c                 L    t          ddd           |                                 S )W
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        getPageMode	page_moder   )r$   r~  rx   s    rt   r  zPdfWriter.getPageModeB  s(     	%]KIII""$$$rv   ra  c                    t          |t                    r|}nH|| j        vr0t          dd                    | j                   t
                     t          |          }| j                            t          d          |i           dS )r  zMode should be one of: z, r}  N)r   rB   _valid_modesr%   rn  r  rk   r`   )rq   ra  	mode_names      rt   set_page_modezPdfWriter.set_page_modeK  s     dJ'' 	)$(II4,,,Ldii8I.J.JLLh   #4((I  *["9"99!EFFFFFrv   c                 R    t          ddd           |                     |           dS )r  zwriter.setPageMode(val)zwriter.page_mode = valr   N)r$   r  rq   ra  s     rt   setPageModezPdfWriter.setPageMode[  s:     	%%'?	
 	
 	
 	4     rv   c                 *    |                                  S )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
        )r~  rx   s    rt   r  zPdfWriter.page_modef  s    * ""$$$rv   c                 0    |                      |           d S r   )r  r  s     rt   r  zPdfWriter.page_mode}  s    4     rv   c                 2    t          ddd           | j        S )r  pageModer  r   r$   r  rx   s    rt   r  zPdfWriter.pageMode  s     	%ZgFFF~rv   c                 6    t          ddd           || _        dS )r  r  r  r   Nr  r  s     rt   r  zPdfWriter.pageMode  s!     	%ZgFFFrv   r\  c           
         t          t          t          |                    }|                     | j                  d         |         |t          d          <   | j        |         }|j        t                      |t          d          <   |j        J |	                    d          dk    rt          d          |v rt          t          |t          d                             }t          t          d          |d         t          |d	         t          |          d
                             }|j        |t          d          <   |                     |          }|j                            |           d S )Nz/Kids/P/Annots/SubtyperF  /Destz	/LinkNamer[  r   r  r  )r   r>   _pdf_objectifyr   rf   rB   rr   annotationsr8   r   dictr=   r?   r   re   r   )rq   r   r\  to_addr   tmpr   ind_objs           rt   r`  zPdfWriter.add_annotation  sT   &z(B(BCC#'??4;#?#?#H#Uz$ z+&#*5--DI&&'+++ ::j!!W,,G1D1D1N1NtVJw$7$7899C;'''( Z$s))J2G   D +//F:g&&'""6**(((((rv   c                 &   t          d|                                          }|                    dg           D ]}|                                }|                    dd          }|                    dd          }t          |t                    r t          |          |t	          d          <   w|^|                                }|                    dd          }t          |t                    rt          |          |t	          d          <   |S )z
        Perform some clean up in the page.
        Currently: convert NameObject nameddestination to TextStringObject (required for names/dests list)
        r   r  r  Nr  /D)r   r   r   r   rB   rH   )rq   r   aa_objdacts         rt   
clean_pagezPdfWriter.clean_page  s    
 L$//"3"344)R(( 
	@ 
	@ALLNNE		'4((A))D$''C!Z(( @-=a-@-@j))**nn&&GGD$''a,, @,<Q,?,?C
4(()rv   c                    d }t          |t          t          f          rJt          |d          5 }t	          |                                          }d d d            n# 1 swxY w Y   nt          |t                    r|j        r|j        }|j        	                                }|j        
                    d           t	          |j                                                  }|j        
                    |           nht          |d          rIt          |d          r9|
                    d           |                                }t	          |          }nt          d          ||fS )Nrbr   seekreadzPdfMerger.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   r  r   _encryptionr_  rt  r  r   r  )rq   rX   encryption_objfr_  	orig_tellfilecontents          rt   _create_streamzPdfWriter._create_stream  s    gT{++ 	&& +! **+ + + + + + + + + + + + + + +++ 	" 5!(!4++--IN"""W^002233F N	****Wf%% 
	''6*B*B 
	LLOOO!,,..K[))FF%>   ~%%s   "AA!$A!rr   import_outlineexcluded_fields.c                    |d}t          |t          t          t          f          rLt          |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
        Nr   )r   r   r   rL   boolmerge)rq   rX   r  rr   r  r  s         rt   r   zPdfWriter.append  s    N " OlUD)$<== 
	%&& '!.$77 5&4O!& EJJtWdE>?SSSSSJJg|UNO    rv   )r  import_bookmarkspositionc           
         t          |t                    r|}n)|                     |          \  }}	t          |d          }|d}|0t          t	          dt          |j                                      }nt          |t                    r<t          t	          |                    t          |j                                       }nyt          |t                    rnct          |t                    r*t          |          dk    rt          t	          |           }n$t          |t                    st          d          i }
|D ]}|j        |         }|j        J |6|                     |t          |          dd	gz             |
|j        j        <   n;|                     ||t          |          dd	gz             |
|j        j        <   |d
z  }||
|j        j                 _        |j        |_        |j                                        D ]}|j        }t          |d         t(                    r%|d         j        j        |
v rI|
|d         j        j                 j        |t+          d          <   |                     |d         |           |ut/          d|                     t3          |          t          |
                                          d         j        t4                                                              }n|                                 }t/          d|j        t<          j                           }|rZt@          j!        |v rL| "                    |#                    t@          j!        d          |
|          }| $                    ||d           d	|vr|
                                D ]m}| %                    |j        #                    d	d          ||
|          }t          |          dk    r||tM          d	          <   | '                    |           nd|vr| (                    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)strictNr   r   rE  z:"pages" must be a tuple of (start, stop[, step]) or a list/Br  r   /Pager  rI   )r   r>   rW   ))r   r   r  r   r  r   rr   rL   indicesr   	TypeErrorr   r   r   r   original_pagenamed_destinations_namedDestsvaluesr   rC   rD   r  r   r  rH   r6   r   r  r.  r/  r0  rl   r  _get_filtered_outliner   _insert_filtered_outline_insert_filtered_annotationsrB   r  add_filtered_articles)rq   r  rX   r  rr   r  r  r  r_  r  srcpagesry  pgr   arroutline_item_typ_ror  paglsts                       rt   r  zPdfWriter.merge	  sS   N gy)) 	5FF%)%8%8%A%A"FN ve444F" O=q#fl"3"34455EEy)) 		c&,.?.? @ @ABBEEt$$ 	u%% 	#e**//''EEE5)) 	L    	E 	EAaB(4448<_--y0AA9 9.455 9=8H8H$"7"74:K"K9 9.45 ABDHR*01?? % 	 &--// 		F 		FD/C$w-44 Fg178CC'/M4:($ LOO$ 00hEEE
 ##%%$\22**++A.A  &   *,,     $4466%v~bg'>?? 	bkS0000T**Hf G )))4   O++(( % %77%)))R88#x  s88a<<14C
9--.$$$$&&&&r8V<<<rv   threadc           
         |                     | dd          }| j                            |j                   t	          d|d                   }|}d}||                     t	          d|d                   ||          }||[t	          d|                     t                                                                          }|}	|j        |t          d          <   not	          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    r0|	j        |t          d
          <   |j        |	t          d	          <   d}||j        J |j        S )zE
        clone the thread with only the applicable articles

        T)r   )force_duplicateignore_fieldsr>   r   Nr   r  rG  z/N/Tz/Rr  r8   )r   r  r   r   r   _get_cloned_pagere   r>   r   rB   r8   )rq   r  rr   r  nthreadfirst_articlecurrent_articlenew_articler  	new_firstnew_article2pag_objs               rt   _add_articles_threadzPdfWriter._add_articles_thread	  su    ,,$g  
 
 	G6777/>>6C26)''\?4#8995& C &"&*(()9););<<GGII# #K !,I0;0NGJt,,--#'*((,!+D!1!1;3Q R   %*,,$ $L 5A4SK
4 0 01".K03Jt,,-070JJt,,-0?0EJt,,-|S^^-=-=>>w&&0;GJt,,-]GDM22992   ##5t7LMMO-//090LJt,,-.9.L	*T**+"&I )J )555))rv   fltrc                 
   t          |t                    rt          j        |          }n)t          |t                    st          j        d          }|                                D ]}|j        }|                    dd          D ]z}|                                d         }|j	        j
        | j        t          |                   vr8|                    |d         d                   r|                     |||           {dS )z<
        Add articles matching the defined criteria
        rW   r  r   r  rG  r  N)r   r   recompiler   r  r  r   r   r   r   r_   r   searchr  )rq   r  rr   r  r   ppr  thrs           rt   r  zPdfWriter.add_filtered_articles	  s    dC   	":d##DDD'** 	":b>>D 	B 	BABVVD"%% B BllnnT*)/t7JvJJ8  kk#d)H"566 --c5&AAAB	B 	Brv   c                 d   t          |t                    rd S t          |t                    r|j        |         j        }nNt          |t
                    r"|                    dd          dk    r|j        }nt          |t                    r|}	 ||j                 j        S # t          $ r Y d S w xY w)N/TyperW   r  )
r   rC   r   rr   r   r>   r   rA   r   r   )rq   r   rr   r  _is        rt   r  zPdfWriter._get_cloned_page	  s     dJ'' 	4dC   	d#6BB .// 	DHHWb4I4IW4T4T(BBn-- 	B	?55 	 	 	44	s   B! !
B/.B/annotsc                 
   t                      }t          |t                    r"t          d|                                          }|D ]}t          d|                                          }|d         dk    s)d|vs%t          d|d                   d         dk    sd|v r-d|vr.|                    |                    |           j                   |d         }t          |t                    rQt          |          | 	                                v r-|                    |                    |           j                   t          d	|          }| 
                    |d
         ||          }	|	\|                    | d          }
t          |	g|dd          z             |
t          d          <   |                    |
j                   t          d|d                   d         }t          |t                    rRt          |          | 	                                v r-|                    |                    |           j                   
t          d	|          }| 
                    |d
         ||          }	|	|                    | d          }
t          d|
          }
t          |	g|dd          z             t          d|
d                   t          d          <   |                    |
j                   |S )Nr   r>   r  rF  r  r   r  r  r8   r   )r  )r  r   r  )r  )r8   r   rA   r   r   r   r   r   r   r  r  rB   )rq   r  r   rr   r  outlistananor  r   ancs              rt   r  z&PdfWriter._insert_filtered_annotations 
  s    --fn-- 	7&&"3"3"5"566F &	? &	?B)2==??;;CJ7**s??*CI66t<GGc>>#%%NN399T??#EFFFFGA!!S)) 
Cq66T%=%=%?%???#NN399T??+MNNN 22 11!A$vFF="%))D
)"K"KC7BA3122;7O7OC
7 3 34#NN3+ABBB+SY77=a%% ?1vv!9!9!;!;;;syy'IJJJ]A..A--adE6BBA}!iiGiDD"#5s;; (ae44 /T;;&t,,  s'=>>>rv   nodec                 *   g }|                                 }|                    dd          dk    sd|vrH|                    dd          }|.|                                 }||                     |||          z  }n||                                 }t          d|                    |                    }|                     t          d|d	                   ||          }|t                      }||t          d	          <   d|v r#|                     |d         ||          |_        ng |_        t          |d	         t                    rt          |j                  d
k    r|                    |           |                    dd          }||S )zEExtract outline item entries that are part of the specified page set.r  rW   	/Outlinesr  /FirstNr=   r   r  r   /Next)r   r   r  r   _build_outline_itemr  rC   rB   childsr   r   r   )rq   r  rr   r  new_outlineor  s          rt   r  zPdfWriter._get_filtered_outline3
  s      88GR  K//843G3G88Hd++D((t99$vNNN "(((B(B4(H(HII))$|QwZ*H*H%QWXX9"A)**W%%&t###99$x.%QWXXAHH!AH!!G*j99 *S]]Q=N=N&&q)))xx.. " rv   c           
         t                      }|                     |           t          |d                   |t          d          <   t	          |d         t
                    sX|j        :d|j        v r1|j        d                             |           |t          d          <   n|j        |t          d          <   |j        t          |j        
                    dd                    |t          d          <   t          |j        
                    dt          d          t          d          t          d          g                    |t          d          <   |S )	Nr  r  r  r  r   r   /Cg        )rI   re   rH   rB   r   rC   r  r   r   rD   r   r8   r@   )rq   r   n_ols      rt   _clone_outlinezPdfWriter._clone_outlineS
  s2   ||%5d8n%E%EZ!!"$w-44 	<y$):):)-4)>)>t)D)DZ%%&& -1OZ(()9 %1$)--a2H2H%I%IDD!!"%0	;s++[-=-={3?O?OP & &DD!!"
 rv   outlinesc                 ,   |D ]}|                     dd          dk    sd|vr|}nQ|                     |          }t          t          |                                                              |||            |                     |j        |d            d S )Nr  rW   r  r  )r   r  r   rI   r   r  r  r  )rq   r  r  r  r   nps         rt   r  z"PdfWriter._insert_filtered_outlinej
  s      	A 	AD xx$$33xt7K7K((..Z!2!2!4!455BB2vtTTT))$+r4@@@@	A 	Arv   c                     dS )z"To match the functions from MergerNr   rx   s    rt   rm  zPdfWriter.closez
  s    rv   c                    ||                                  }nt          d|          }d}||j        |k    s|                    dd           |k    r|gS d|v r=|                     |t          t
          |d                             }|rd|v r|gng |z   S d|v r!|dz  }t          t          |d                   }nd S |d S d S )NrI   r   r  r  r  r   )r  r   r   r   find_outline_itemrR   rI   )rq   r  r  r  ry  ress         rt   r  zPdfWriter.find_outline_item
  s    
 <%%''AA\4((Am$44554((L88s
q==00$d;(&D&D C  D'/1}}"CC!||QQwZ00t# mmmmmrv   c                 .    |                      ||          S )zZ
        .. deprecated:: 2.9.0
            Use :meth:`find_outline_item` instead.
        )r  )rq   r  r  s      rt   find_bookmarkzPdfWriter.find_bookmark
  s     %%lD999rv   c                 8   |	i | _         dS t          |t                    r)	 | j         t          |          = dS # t          $ r Y dS w xY wt          |t
                    r.	 | j         t          |j                  = dS # t          $ r Y dS w xY 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   rA   r   r1  s     rt   reset_translationzPdfWriter.reset_translation
  s     >"$D	** 	:'6

333   // 	:'6:777    8999s!   9 
AA A< <
B
	B
)rW   )rY   rV   )NN)r   )rY   N)r   r   )NNr   r   )NNNN)NNFFr  )F)Nr  )NNTN)NNTr   )r  
__module____qualname____doc__r   ru   ry   r   r   BaseExceptionr   r   propertyr   r   setterrE   rA   re   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   rY  r   r   decimalDecimalr   r   r=   rH   r:   r   r   r   r  r  r   r  r  OPTIONAL_READ_WRITE_FIELDr   r,   r*  r,  r2  r4  r6  r8  ALL_DOCUMENT_PERMISSIONSr  r5   r^  r   rj  r   r   r	   r~   re  rf  rg  r  r  r8   r9   r>   r@   rB   rD   rC   rd  r  r  r  rI   r  r  r  r  r  r  r  r  r  r#   rQ   r  r  r  r6   r?   r  rO   rT   r  r  r  r  r  r  r  r  r
  r  r3  r6  r9  r;  rF   rQ  rS  rU  rb  rm  rP   re  ri  rp  rs  ru  rj  ry  r  rS   r~  r  r  r  r  r  r`  r  r   r   r  rL   r   rM   r  r  r   r  r  r  r  r  r  rm  rR   r  r  r  r   rv   rt   rV   rV      sZ        
&# &# &#T &# &# &# &#P   
%4./% m$% M*	%
 
% % % % E    X "U "t " " " "&y &^ & & & & @D(,; ;!$^";<; n%; 
	; ; ; ;2	$n,-	$		$ 	$ 	$ 	$ (*	     #~.45   }	 
 
       DN N N N. (*@ @@  }@ 
	@ @ @ @( (*2 22  }2 
	2 2 2 2  ')	E EE E  }	E
 
E E E E$ ')	< << <  }	<
 
< < < < NRJ J#C=J=Ec]J	J J J J.)# )* ) ) ) )0 0 0 0 0%S % % % % @tJ' @ @ @ X@
 HL e_5=e_	   ( HL	2 	2e_	25=e_	2		2 	2 	2 	2 ,0,0	 ( ) 	
 
   : ,0,0	< <(< )< 	<
 
< < < < 	t["24DD	E   X< U4k:+M%N SW    & -  -  -  -  -  -D' ' ' ' ' 'PTs PT%U
2C PT PT PT PT PTd	1	1!&sEz!2	1		1 	1 	1 	1 EI/ // $Hj\4-?$@A/ 
	/ / / /> EIA AA $Hj\4-?$@AA 
	A A A A& 5	? ?? S#X? 	?
 
? ? ? ?J 5	G GG S#XG 	G
 
G G G G L Lt L L L L	0i 	0D 	0 	0 	0 	0 EIA AA $Hj\4-?$@AA 
	A A A A. EIC CC $Hj\4-?$@AC 
	C C C C" (,(,2J"&#'\  \ }\  !\  	\ 
 0\  3-\  C=\  
\  \  \  \ |C: C$ C C C C4E$"34 tRx    4 J  49        .
 d3i TW    .Z .D . . . . 
1$sCx. 
1T 
1 
1 
1 
1!c3h !D ! ! ! !O3	
O3 
O3 O3 O3 O3b$,^ $, $, $, $, $,L ~    '	 'n ' ' ' '*    +     ' ' ' ' X''
 ' ' ' '![ ! ! ! !F*+ * * * * AE:>:>48#$ #$j* <=#$ dJ67#$ dJ67	#$
 D*j01#$ 
#$ #$ #$ #$P ;?? ?J
*+? dJ67? 
	? ? ? ?  @D? ??(0(<?	? ? ? ? >222 ;?:>	V V%V dJ67V dJ67	V
 
V V V 32V* >222LP@ @+@5=j5I@	@ @ @ 32@ >222LP@ @+@5=j5I@	@ @ @ 32@" ;?:>BF!%JO JOJO 4^S@AJO dJ67	JO
 dJ67JO eE5%$78#=>?JO JO JO JO #JO 
JO JO JO JO` ;?6:
 

 
 dJ67	

 eUE123
 
 
 
 
 

 
 
 
> ;?6:
 

 
 dJ67	

 eUE123
 
 
 
 
 

 
 
 
8
 
 
 

%49.+:U4V	   " 15$($ $"9-$ y!$ 
	$ $ $ $<77	7 7 7 7  &*!%	' '' c]' #	'
 
' ' ' 'R::#&:	: : : :( ( ( (# # # #KC KCt KC KC KC KC KC\ .3	: 	:&*	:		: 	: 	: 	:*C *CT *Cd *C *C *C *CZ .3	8 	8&*	8		8 	8 	8 	8  )-!%IE IEIE IE 	IE
 %IE #IE 
IE IE IE IE` )-8 88 8 	8
 %8 
8 8 8 8( )-O OO O 	O
 %O O O 
O O O OH )-R RR R 	R
 %R R R 
R R R R&N(:"6    'x
3 ' ' ' 'FuZ-C'D F F F F FB&j &T & & & &4	-J 	-4 	- 	- 	- 	- 'Xj1 ' ' ' X'0 &* & & & & &  HZ0       X  " " " " " "L 6    %Xl3 % % % %G, G4 G G G G 	! 	! 	! 	! 	! 	! %8L1 % % % X%, !l !t ! ! ! ! (<0    X _\ d    _)# )4S> )d ) ) ) )2uZ%?@ Z    &"&T;	9:"&	vx
++	,"& "& "& "&R  #GK3 3{It343 y%S/5c33GcR
3 )U38_eCcM.BDIM
3 3 "%S	5c?(B"CD3 
3 3 3 3j >DTUUU
 '+)-#GI 3- t[)34 sm	
 &  "%S	5c?(B"CD 
   VUB7* 7* CO$7* 	7*
 
7* 7* 7* 7*rBGSL!B CO$B 	B
 
B B B B,D#~z:EF CO$ 	
 
.	!   *1nd+;&<<=1 1 CO$	1
 1 
k	1 1 1 1f CO$ 	
 
k	   @; :    6 ;?	A A{#A j.01A dJ67	A
 
A A A A     '+ 38n {# 
$s)		   < >222 '+	: 	:38n	: {#	: 
$s)			: 	: 	: 32	: @D: :D)^;<:	: : : : : :rv   rV   r   rY   c                    t          | t                    r| S t          | t                    rMt                      }|                                 D ](\  }}t          |          }t          |          }|||<   )|S t          | t                    r7t                      }| D ]$}|	                    t          |                     %|S t          | t                    r3|                     d          rt          |           S t          |           S t          | t          t          f          rt          |           S t!          dt#          |            d          )Nr  z
type(obj)=z! could not be casted to PdfObject)r   rE   r  r>   r  rB   r  r   r8   r   r   
startswithrH   r   rY  r@   r  type)r   r  r]  r  name_keycasted_valuer  els           rt   r  r  
  sQ   #y!! 
#t 
!##))++ 	, 	,JC!#H)%00L+F8	C		 
mm 	+ 	+BJJ~b))****
	C		 

>># 	)c??"#C(((	C#u	&	& 
3!EcEEE
 
 	
rv   r  r  r  r  r  c                 &   t                      }| | |t          d          <   |                    t          d          t          |          i           |rut	          |t
                    rt          |          }t          j        d          |                    t          d          t          fd|D                       i           |s|rAd}|r|dz  }|r|dz  }|                    t          d	          t          |          i           |S )
Nr  r  z1.00000r  c                 x    g | ]6}t          t          j        |                                                  7S r   )r@   r  r  quantize)r  cprecs     rt   r  z(_create_outline_item.<locals>.<listcomp>
  s9    SSS[!3!3!<!<T!B!BCCSSSrv   r   r   r   r   )rI   rB   r`   rJ   r   r   rK   r  r  r8   rD   )r  r  r  r  r  r  format_flagr  s          @rt   r  r  
  sG    <<L)3Z%%&x  "6u"="=	
  
  

eS!! 	&u%%Ey))4  +SSSSUSSS# #	
 	
 	
  K K 	1K 	1KZ--|K/H/HIJJJrv   c                   ,     e Zd Zdededdf fdZ xZS )PdfFileWriterr  kwargsrY   Nc                 \    t          ddd            t                      j        |i | d S )Nr  rV   r   )r$   superru   )rq   r  r  r  s      rt   ru   zPdfFileWriter.__init__  s7    $_k7KKK$)&)))))rv   )r  r  r  r
   ru   __classcell__)r  s   @rt   r  r    sR        *c *S *T * * * * * * * * * *rv   r  )|rg   r  r  loggingrK  r  ru  rI  r   r   hashlibr   ior   r   r   pathlibr   typesr   typingr	   r
   r   r   r   r   r   r   r   r   r   r   r   r  r   _pager   r   _readerr   	_securityr   r   r   _utilsr   r   r    r!   r"   r#   r$   r%   	constantsr&   r'   r   r(   r)   rl   r*   rP  r+   r,   r-   r.   r/   r0   r  r1   ra   r2   rM  r3   r/  r4   r5   genericr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   	pagerangerL   rM   rN   rO   rP   rQ   rR   rS   rT   	getLoggerr  r   r  r  rV   r   r   r  rY  r  r  r  r   rv   rt   <module>r(     s  <         				           & & & & & & & & & &                                           $ # # # # # + + + + + + + +       - - - - - - - - - -	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 6 5 5 5 5 5 . . . . . . ( ( ( ( ( ( ! ! ! ! ! ! 5 5 5 5 5 5              , + + + + + , , , , , , - - - - - - ( ( ( ( ( ( = = = = = = = =                                               0 0 / / / / / / /                  
	8	$	$ &IaLL 00AA {(: {(: {(: {(: {(: {(: {(: {(:|Q
d38nc3S	AB 
y 
 
 
 
8!dN*+!! ueU*+S$67! 	!
 ! ! ! ! !H* * * * *I * * * * *rv   