o
    HRh7                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! ddl"m#Z# dd	l$m%Z%m&Z& dd
l'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl6m8Z9 ddl6m:Z: ddl6m;Z< ddl6m=Z> ddl6m?Z?m@Z@mAZAmBZBmCZC ddl6mDZE ddl6mFZG ddl6mHZI ddl6mJZK ddl6mLZLmMZM ddlNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZd ddlemfZfmgZg ddlmhZhmiZimjZjmkZkmlZlmmZmmnZn eoepZqe@d ZreMdZsG dd dZtde eeuef euevee f de^fd d!Zwd"e deZf d#eud$e eexexexf eudf d%eyd&eydebfd'd(ZzG d)d* d*etZ{dS )+    N)md5)BytesIOFileIOIOBase)Path)TracebackType)IOAnyCallableDequeDictIterableListOptionalPatternTupleTypeUnioncast   )
Encryption)
PageObject_VirtualList)	PdfReader)_alg33_alg34_alg35)StrByteType
StreamType_get_max_pdf_version_headerb_deprecate_with_replacementdeprecation_bookmarkdeprecation_with_replacementlogger_warning)AnnotationDictionaryAttributes)CatalogAttributes)CatalogDictionary)Core)EncryptionDictAttributes)FieldDictionaryAttributes	FieldFlag"FileSpecificationDictionaryEntriesGoToActionArgumentsInteractiveFormDictEntries)PageAttributes)PagesAttributes)StreamAttributes)TrailerKeys)TypFitArgumentsUserAccessPermissions)PAGE_FITAnnotationBuilderArrayObjectBooleanObjectByteStringObjectContentStreamDecodedStreamObjectDestinationDictionaryObjectFitFloatObjectIndirectObject
NameObject
NullObjectNumberObject	PdfObjectRectangleObjectStreamObjectTextStringObject
TreeObjectcreate_string_object
hex_to_rgb)	PageRangePageRangeSpec)BorderArrayTypeFitType
LayoutTypeOutlineItemTypeOutlineTypePagemodeTypeZoomArgTypeic                   @   s:  e Zd ZdZd,deddfddZd-dd	Zd
eee	  dee	 dee
 ddfddZedefddZejdeddfddZdedefddZ		d.dedeef dee defddZdeeef defddZ	d/dedeeegdf dee defd d!Zd0d"d#Z	d/dedee defd$d%Z	d/dedee defd&d'Z	(	d1ded)edee defd*d+Z 	(	d1ded)edee defd,d-Z!	d.d.ee d/ee defd0d1Z"d/edefd2d3Z#defd4d5Z$defd6d7Z%ede&e fd8d9Z'	d.d:ee( d;ee( defd<d=Z)	d.d:ee( d;ee( defd>d?Z*			(d2d:ee+j, d;ee+j, d)edefd@dAZ-			(d2d:ee+j, d;ee+j, d)edefdBdCZ.edede/e0e1f fdDdEZ2e2jdFedee/ef ddfdGdEZ2dHeddfdIdJZ3dHeddfdKdLZ4dMedNeeef ddfdOdPZ5dQedReeef ddfdSdTZ6	d3dUe7dVeeegdf  ddfdWdXZ8	d3dUe7dVeeegdf  ddfdYdZZ9e:fded[e;eef d\e<ddfd]d^Z=e:fded[e;eef d\e<ddfd_d`Z>dUe7ddfdadbZ?dUe7ddfdcddZ@	d3dUe7dVeeegdf  ddfdedfZA	d3dUe7dVeeegdf  ddfdgdhZBdddieCddfdjee dkee dleDdmeEdnee doee ddfdpdqZFdreGddfdsdtZHdreeIef deJeDeKf fdudvZLdreGde&e fdwdxZMdreGdye&e defdzd{ZNdreGddfd|d}ZOd~e;eef ddfddZPd~e;eef ddfddZQdeeReSeTeUeeVeeWe0eXf
 ddfddZYdNedefddZZdedefddZ[dedefddZ\de]fddZ^deRfddZ_edeRfddZ`de]fddZadeRfddZbdeRfddZc				d4dedee]f dede]ef dede]ef dFedee]f def
ddZd	d3dFeee]f dede]ef defddZe	d3dFedee] defddZfegdd		d.dehdede]ef dede]ef defddZiegdd	d3dehdee] defddZjegdd	d3dehdee] defddZkdddddeldfded.edeeef dede]ef dede]ef deeeJe(e(e(f ef  deDdeDdemdee defddZn					d5dededede]ef deeJe(e(e(f  deDdeDdeodepdefddZq					d5dededede]ef deeJe(e(e(f  deDdeDdeodepdefddZrd0ddZsde0deeeRf ddfddZt		d.dee dFee defddZudFe/defddZv		d.ded.ee dee defddZwdededefddĄZxd0ddƄZyd0ddȄZzd6deDddfdd˄Z{	d6deDddfdd΄Z|d6deDddfddЄZ}	d6deDddfdd҄Z~		d.d.edededeeR dee ddfddׄZ	d3dedededeeR ddf
ddلZ		d7dedededeeR deodepddfddۄZ		d7dedededeeR deodepddfdd݄ZdZdee fddZdee fddZdeeVef ddfddZdeddfddZdeddfddZedee fddZejdeddfddZedee fddZejdeddfddZdZdee fddZdee fddZdeddfddZdeddfddZedee fddZejdeddfddZedee fddZejdeddfddZd.ed e;eef ddfddZdeeef defddZdeeIee7f deJeee f fddZ			i	d8deee7eIf deedeeJeef eJeeef e&e f dedeeJeef eJeeef e&e f deDd	eee&e eJed
f f  ddfddZegddd			i	d9dee deeIee7f dee dee deDd	eee&e eJed
f f  ddfddZdeTde;eef dUe7defddZdeeef de;eef dUe7ddfddZdedeeeeXf de;eef dUe7dee fddZdeee&eT f dede;eef dUe7de&e/ f
ddZdede;eef dUe7de&e/ fddZdFe/de]fdd Z	d3d!e&e/ dee]ef dede]ef ddfd"d#Zd0d$d%Z	d3de;eef dee dee&e  fd&d'Zegdd	d3de;eef dee dee&e  fd(d)Z	d3dUede7ef ddfd*d+ZdS (:  	PdfWriterz
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
     fileobjreturnNc                 C   s   d| _ g | _i | _i | _t }|ttjtdttj	t
dttjt i | || _t }|tdttjdd i | || _t | _| jttjttjttj| ji | | j| _|| _d| _d S )Ns   %PDF-1.3z/Pagesr   z	/ProducerPyPDF2zutf-16beF)_header_objects_idnum_hash_id_translatedr=   updaterA   PATYPECOUNTrC   KIDSr7   _add_object_pagesrI   codecsBOM_UTF16_BEencode_info_root_objectCOCATALOGPAGES_rootrV   with_as_usage)selfrV   pagesinfo rq   P/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/PyPDF2/_writer.py__init__   s:   
zPdfWriter.__init__c                 C   s
   d| _ | S )z+Store that writer is initialized by 'with'.T)rm   rn   rq   rq   rr   	__enter__   s   zPdfWriter.__enter__exc_typeexc	tracebackc                 C   s   | j r| | j  dS dS )zWrite data to the fileobj.N)rV   write)rn   rv   rw   rx   rq   rq   rr   __exit__   s   zPdfWriter.__exit__c                 C   s   | j S )z
        Header of the PDF document that is written.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        :param str javascript: Your Javascript.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            Use :meth:`get_outline_root` instead.
        getOutlineRootr  r   )r#   r  rt   rq   rq   rr   r    r   zPdfWriter.getOutlineRootc                 C   s(  t j| jv rit| jt j tritt| jt j }|j}t j|v rNt|t j trNtt|t j }|j}t j|v rBtt|t j }|S t }||t	t j< |S t }| 
|}||t	t j< t }||t	t j< |S t }| 
|}|| jt	t j< t }| 
|}||t	t j< t }||t	t j< |S r~   )r   r   rh   r   r=   r   r   DESTSr7   rA   rb   )rn   r   	names_refdests	dests_refndrq   rq   rr   get_named_dest_root  s:   



zPdfWriter.get_named_dest_rootc                 C   r   )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        getNamedDestRootr  r   )r#   r  rt   rq   rq   rr   r    r   zPdfWriter.getNamedDestRootpage_destinationrv  beforec                 C   s   |d ur|d urt d|d ur#d}d}tj| d| dtd |}|d u r+t d|d u r3|  }tt| }| |}|d urF|j	}|
|||  |S )Nz[The argument dest of add_outline_item_destination is deprecated. Use page_destination only.r   r  r$  r%  r&   page_destination may not be None)r   r   r   r   r  r   rH   r   rb   r   insert_child)rn   r  rv  r  r   r;  r<  page_destination_refrq   rq   rr   add_outline_item_destination  s0   
z&PdfWriter.add_outline_item_destinationc                 C   r   )zf
        .. deprecated:: 2.9.0

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

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

            Use :meth:`add_outline_item_dict` instead.
        add_bookmark_dictr  r   r#   r  rn   r  rv  rq   rq   rr   r  b     	zPdfWriter.add_bookmark_dictc                 C   r   )z`
        .. deprecated:: 1.28.0

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

        :param str title: Title to use for this outline item.
        :param int page_number: Page number this outline item will point to.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param parent: A reference to a parent outline item to create nested
            outline items.
        :param tuple color: Color of the outline item's font as a red, green, blue tuple
            from 0.0 to 1.0 or as a Hex String (#RRGGBB)
        :param bool bold: Outline item font is bold
        :param bool italic: Outline item font is italic
        :param Fit fit: The fit of the destination page.
        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   r@   r   r   r   ro   
IndexErrorrC   r$   r  rB   r<   rA   rb   r=   r-   Dr   S_create_outline_itemr  r  )rn   r  r   rv  r  r  r  r  r   r  r  page_refr   r  rq   rq   rr   r  ~  sX   



zPdfWriter.add_outline_item/Fitrg  c           	      G   s*   t ddd | ||||||t||dS )zZ
        .. deprecated:: 2.9.0

            Use :meth:`add_outline_item` instead.
        add_bookmarkr  r   fit_typefit_argsr#   r  r>   	rn   r  r  rv  r  r  r  r   rg  rq   rq   rr   r    s   
zPdfWriter.add_bookmarkc           	      G   s,   t ddd | |||d|||t||dS )z[
        .. deprecated:: 1.28.0

            Use :meth:`add_outline_item` instead.
        addBookmarkr  r   Nr  r  r  rq   rq   rr   r    s   
zPdfWriter.addBookmarkc                 C   s   t d)NzIThis method is not yet implemented. Use :meth:`add_outline_item` instead.)NotImplementedErrorrt   rq   rq   rr   add_outline  s   zPdfWriter.add_outlinedestinationc                 C   sn   |   }d}|t|k r,||| k r"||| ||t| d S |d7 }|t|k s|t||g d S )Nr   r   )r  r   r   rG   extend)rn   r  r  r  rZ  rq   rq   rr   add_named_destination_array  s   z%PdfWriter.add_named_destination_arrayc                 C   s|   |d ur|d urt d|d ur#d}d}tj| d| dtd |}|d u r+t d| |j}| td|d	 | |S )
Nz[The argument dest of add_named_destination_object is deprecated. Use page_destination only.r   r  r$  r%  r&  r  rG   /Title)r   r   r   r   rb   r   r  r   )rn   r  r   r;  r<  r  rq   rq   rr   add_named_destination_object  s*   z&PdfWriter.add_named_destination_objectc                 C   r   )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        addNamedDestinationObjectr  r   )r#   r  r   rq   rq   rr   r  3  s   
z#PdfWriter.addNamedDestinationObjectc           
      C   s   |d ur|d urt d|d ur#d}d}tj| d| dtd |}|d u r+t d| | jtj | }t }|	t
tjt|t
tjtdgt
tjt
d	i | |}|  }	t|tshtt|}|	||g |S )
Nr  r  r   r$  r%  r&  zpage_number may not be Nonei:  r  )r   r   r   r   r   rc   r^   ra   r=   r]   rA   r-   r  r7   r3   FIT_HrC   r  rb   r  r   rG   r   r  )
rn   r  r   r  r;  r<  r  r   dest_refr  rq   rq   rr   add_named_destination@  s>   

	
zPdfWriter.add_named_destinationc                 C   r   )z`
        .. deprecated:: 1.28.0

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

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

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

            Use :meth:`remove_images` instead.
        removeImagesr  r   )r#   r  rn   r  rq   rq   rr   r    r   zPdfWriter.removeImagesc                 C   st  t t| | j}t tt |tj }|D ]}t t| |}|d  }t	|t
s/t
||}|jD ]|\}}|dv rX|d }	|sKt	|	trJt |d< q2t	|	ttfrWt |d< q2|dkrz|d }	|smt	|	trlt |d< q2t	|	ttfryt |d< q2|dkrtt|d D ]'}
|st	|d |
 trt |d |
< qt	|d |
 ttfrt |d |
< qq2|td| qdS )z
        Remove text from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        r  r  r   r  r   r  N)r   r=   r   rc   r   r@   r^   ra   r   r   r:   r  rG   r9   r   r   r  rA   )rn   r  r  ro   r   r  r  r  r  r  rZ  rq   rq   rr   remove_text  sN   







zPdfWriter.remove_textc                 C   r   )zV
        .. deprecated:: 1.28.0

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

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

            Use :meth:`add_uri` instead.
        addURIr  r   )r#   r  )rn   r  r  r  r  rq   rq   rr   r  b  s   zPdfWriter.addURIc                 G   sz   t dd t|tr| dd }tdd |dD }n
t|tr%nt|}tj|||t||dd	}| j	||d
S )Nadd_link+add_annotation(AnnotationBuilder.link(...))r   c                 S   s    g | ]}t |d krt|qS )r   )r   float)rm  numrq   rq   rr   ro         z&PdfWriter.add_link.<locals>.<listcomp>r_  r  )r  r  target_page_indexr   )r   
annotation)
r#   r   r   striprE   splitr6   linkr>   add_annotation)rn   r  r  r  r  r   rg  r  rq   rq   rr   r  q  s$   	


zPdfWriter.add_linkc                 G   s&   t ddd | j|||||g|R  S )zS
        .. deprecated:: 1.28.0

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

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

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

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

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

        :param str layout: The page layout to be used

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

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

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

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

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

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

           * - /UseNone
             - Do not show outline or thumbnails panels
           * - /UseOutlines
             - Show outline (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        )r7  rt   rq   rq   rr   r:  f  s   zPdfWriter.page_modec                 C   r.  r~   )r=  r>  rq   rq   rr   r:  }  r/  c                 C   r0  )r8  pageModer:  r   r#   r:  rt   rq   rq   rr   r@    r3  zPdfWriter.pageModec                 C   r4  )r8  r@  r:  r   NrA  r>  rq   rq   rr   r@    r5  r  c                 C   s   t tt|}| | jd | |td< | j| }|jd u r&t |td< |jd us-J |	ddkr^td|v r^t t
|td }ttd|d t|d	 t
|d
 d}|j|td< | |}|j| d S )Nz/Kids/P/Annots/Subtyper  /Destz	/LinkNamer  r   r  r  )r   r=   _pdf_objectifyr   rc   rA   ro   annotationsr7   r  dictr<   r>   r   rb   r   )rn   r   r  to_addr   tmpr   ind_objrq   rq   rr   r    s$   


zPdfWriter.add_annotationc                 C   s   t d| }|dg D ];}| }|dd}|dd}t|tr-t||td< q|durH| }|dd}t|trHt||td< q|S )z
        Perform some clean up in the page.
        Currently: convert NameObject nameddestination to TextStringObject (required for names/dests list)
        r   rC  rE  Nr  /D)r   r   r  r   rA   rG   )rn   r   aa_objdactrq   rq   rr   
clean_page  s   

zPdfWriter.clean_pagec                 C   s   d }t |ttfr+t|d}t| }W d    ||fS 1 s"w   Y  ||fS t |trR|jr6|j}|j	 }|j
d t|j }|j
| ||fS t|drmt|drm|
d | }t|}||fS td)Nrbr   seek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   rT  r   _encryptionrC  rU  rS  r   r  )rn   rV   encryption_objfrC  	orig_tellfilecontentrq   rq   rr   _create_stream  s0   	



zPdfWriter._create_streamro   import_outlineexcluded_fields.c                 C   sl   |du rd}t |tttfr*t |trt |ts|}|}|}| d|d||| dS | d||||| dS )a0  
        Identical to the :meth:`merge()<merge>` method, but assumes you want to
        concatenate all pages onto the end of the file instead of specifying a
        position.

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

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

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

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

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

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

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

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

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

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

        :param List excluded_fields: provide the list of fields/keys to be ignored
            if "/Annots" is part of the list, the annotation will be ignored
            if "/B" is part of the list, the articles will be ignored
        F)strictNrq   r   r)  z:"pages" must be a tuple of (start, stop[, step]) or a list/BrC  r   /Pager  rH   )r   r=   rU   ))r   r   rZ  r   r   r   ro   rK   indicesr   	TypeErrorr   r   r   r   original_pagenamed_destinations_namedDestsvaluesr   rB   rC   r  r   r  rG   r5   r   r  r  r  r  ri   r  _get_filtered_outliner  _insert_filtered_outline_insert_filtered_annotationsrA   rQ  add_filtered_articles)rn   r`  rV   r  ro   r[  r\  r   rC  rV  srcpagesrZ  pgr   arroutline_item_typ_ror  paglstrq   rq   rr   r^  	  s   
'





	

zPdfWriter.mergethreadc                 C   sx  |j | ddd}| j|j td|d }|}d}|dur| td|d ||}|dur|du rGtd| t  }|}	|j|t	d< ntd| tt	d	|ji }
|
j|t	d
< |
}||t	d< |j|t	d< |d |t	d< td| }d|vrt
 |t	d< td|d |j td|d
 }||kr|	j|t	d
< |j|	t	d	< d}|dus|jdusJ |jS )zE
        clone the thread with only the applicable articles

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

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



zPdfWriter.reset_translation)rU   )rW   rT   )NN)rq   )rW   N)r   rq   )NNr   r~   )NNNN)NNFFr  )F)Nr  )NNTN)NNTrq   )r  
__module____qualname____doc__r   rs   ru   r   r   BaseExceptionr   rz   propertyr   r|   setterrD   r@   rb   r   r   r   r   r   r
   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   ro   r  r   r   decimalDecimalr   r   r<   rG   r9   r   r   r   r   r   r   r   r   OPTIONAL_READ_WRITE_FIELDr   r+   r  r  r  r  r  r  ALL_DOCUMENT_PERMISSIONSr]  r4   rB  r   rM  r   r   r   ry   rH  rI  rJ  ri  rj  r7   r8   r=   r?   rA   rC   rB   rG  rs  r  r  rH   r  r  r  r  r  r  r  r  r  r"   rP   r  r  r  r5   r>   r  rN   rS   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rE   r  r  r  r  r'  rO   r!  r$  r*  r,  r-  r%  r1  r;  rR   r7  r9  r=  r?  r:  r@  r  rQ  r   r   rZ  rK   r   rL   r^  r  r   rm  ry  rl  rj  r  rk  rO  rQ   r  r  r  rq   rq   rq   rr   rT      s>   (



	



"




		



 "	R





E




^"		
Q&		#
(


	

P	

	






)
		N
-

P

$

	!					$	)$"	
5 
9



3
 




rT   r   rW   c                 C   s   t | tr| S t | tr&t }|  D ]\}}t|}t|}|||< q|S t | tr<t }| D ]	}|	t| q0|S t | t
rN| drJt| S t| S t | ttfrYt| S tdt|  d)Nr  z
type(obj)=z! could not be casted to PdfObject)r   rD   rH  r=   rf  rA   rF  r   r7   r   r   
startswithrG   r   r  r?   r  type)r   rI  rA  rh  name_keycasted_valuerp  elrq   rq   rr   rF  
  s.   





rF  r  r  r  r  r  c                    s   t  }| d ur| |td< |tdt|i |r:t|tr#t|}td |tdt	 fdd|D i |s>|rWd}|rF|d7 }|rL|d	7 }|td
t
|i |S )Nr  r  z1.00000r  c                    s    g | ]}t t| qS rq   )r?   r  r  quantize)rm  cprecrq   rr   ro  
  r  z(_create_outline_item.<locals>.<listcomp>r   r   r   r   )rH   rA   r]   rI   r   r   rJ   r  r  r7   rC   )r  r  r  r  r  r  format_flagrq   r  rr   r  
  s2   

r  c                       s*   e Zd Zdededdf fddZ  ZS )PdfFileWriterrg  kwargsrW   Nc                    s"   t ddd t j|i | d S )Nr  rT   r   )r#   superrs   )rn   rg  r  r}  rq   rr   rs     s   zPdfFileWriter.__init__)r  r  r  r	   rs   __classcell__rq   rq   r  rr   r    s    "r  )|rd   rp  r  loggingr/  r  rV  r-  r   r   hashlibr   ior   r   r   pathlibr   typesr   typingr   r	   r
   r   r   r   r   r   r   r   r   r   r   rU  r   _pager   r   _readerr   	_securityr   r   r   _utilsr   r   r   r    r!   r"   r#   r$   	constantsr%   r&   r   r'   r(   ri   r)   r4  r*   r+   r,   r-   r.   r/   r  r0   r^   r1   r1  r2   r  r3   r4   genericr5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   	pagerangerK   rL   rM   rN   rO   rP   rQ   rR   rS   	getLoggerr  r   r  r  rT   r   r   rF  r  r]  r  r  rq   rq   rq   rr   <module>   s   <(
`$

                    *R

$