U
    –BÞb° ã                   @   sH  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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"m#Z#m$Z$ dd
l%m&Z& ddl%m'Z( ddl%m)Z) ddl%m*Z+ ddl%m,Z- ddl%m.Z.m/Z/m0Z0m1Z1m2Z2 ddl%m3Z4 ddl%m5Z6 ddl%m7Z8 ddl%m9Z: ddl%m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZVmWZWmXZX e YeZ¡Z[e/d ƒZ\e<dƒZ]G dd„ dƒZ^eee_ef e_e`ee f eJdœdd„ZaG dd„ de^ƒZbdS )é    N)Úmd5)	ÚAnyÚCallableÚDequeÚDictÚListÚOptionalÚTupleÚUnionÚcast)ÚPdfReadWarningé   )Ú
PageObjectÚ_VirtualList)Ú	PdfReader)Ú_alg33Ú_alg34Ú_alg35)Ú
StreamTypeÚ_get_max_pdf_version_headerÚb_Údeprecate_with_replacement)ÚAnnotationDictionaryAttributes)ÚCatalogAttributes)ÚCatalogDictionary)ÚCore)ÚEncryptionDictAttributes)ÚFieldDictionaryAttributesÚ	FieldFlagÚ"FileSpecificationDictionaryEntriesÚGoToActionArgumentsÚInteractiveFormDictEntries)ÚPageAttributes)ÚPagesAttributes)ÚStreamAttributes)ÚTrailerKeys)ÚTypFitArgumentsÚUserAccessPermissions)ÚArrayObjectÚBooleanObjectÚByteStringObjectÚContentStreamÚDecodedStreamObjectÚDestinationÚDictionaryObjectÚFloatObjectÚIndirectObjectÚ
NameObjectÚ
NullObjectÚNumberObjectÚ	PdfObjectÚRectangleObjectÚStreamObjectÚTextStringObjectÚ
TreeObjectÚ_create_bookmarkÚcreate_string_object)ÚBookmarkTypesÚBorderArrayTypeÚFitTypeÚ
LayoutTypeÚPagemodeTypeÚZoomArgsTypeÚZoomArgTypeiüÿÿc                   @   s�  e Zd ZdZddœdd„Zeedœdd„ƒZejeddœd	d„ƒZe	e
 ed
œdd„Zee
dœdd„Zee
dœdd„Zeeeegdf ddœdd„Zddœdd„Zeddœdd„Zeddœdd„ZdÑeeddœdd„ZdÒeeddœd d!„ZdÓe	e e	e ed"œd#d$„Zeed%œd&d'„Zedœd(d)„Zedœd*d+„Zeee dœd,d-„ƒZdÔe	e e	e ed.œd/d0„Z dÕe	e e	e ed.œd1d2„Z!dÖe	e"j# e	e"j# eed3œd4d5„Z$d×e	e"j# e	e"j# eed3œd6d7„Z%e&dd8œd9d:„Z'e&dd8œd;d<„Z(e&e)e&ef dd=œd>d?„Z*e&e)e&ef dd@œdAdB„Z+dØe,e	eegdf  ddCœdDdE„Z-dÙe,e	eegdf  ddCœdFdG„Z.e/fee0e&ef e1ddHœdIdJ„Z2e/fee0e&ef e1ddHœdKdL„Z3e,ddMœdNdO„Z4e,ddMœdPdQ„Z5dÚe,e	eegdf  ddCœdRdS„Z6dÛe,e	eegdf  ddCœdTdU„Z7ddVe8fe&e	e& e9e:ddWœdXdY„Z;e<ddZœd[d\„Z=e<ee dZœd]d^„Z>e<ee ed_œd`da„Z?e<ddZœdbdc„Z@e0e&ef dddœdedf„ZAe0e&ef dddœdgdh„ZBe)eCeDeEeFeeGe
eHeIeJf
 ddiœdjdk„ZKeedlœdmdn„ZLe
ed
œdodp„ZMe
ed
œdqdr„ZNeOdœdsdt„ZPeOdœdudv„ZQeCdœdwdx„ZReCdœdydz„ZSdÜe)eeOf e)deOef ed{œd|d}„ZTdÝee	eO ed{œd~d„ZUdÞeVe	eO ed€œd�d‚„ZWdßeVe	eO ed€œdƒd„„ZXdàe&ee)deOef e	eYeeef  e9e9eZe[ed‡œ	dˆd‰„Z\dáe&ee)deOef e	eYeeef  e9e9eZe[ed‡œ	dŠd‹„Z]e
edŒœd�dŽ„Z^e
edŒœd�d�„Z_e&eed‘œd’d“„Z`e&eed‘œd”d•„Zaddœd–d—„Zbddœd˜d™„Zcdâe9ddšœd›dœ„Zddãe9dd�œdždŸ„Zedäe9ddšœd d¡„Zfdåe9dd�œd¢d£„Zgdæee&ehe	eC dd¤œd¥d¦„Zidçee&ehe	eC dd¤œd§d¨„Zjdèeeehe	eC eZe[dd©œdªd«„Zkdéeeehe	eC eZe[dd©œd¬d­„Zld®Zme	en dœd¯d°„Zoe	en dœd±d²„Zpe)eGenf dd³œd´dµ„Zqendd³œd¶d·„Zree	en dœd¸d¹„ƒZsesjendd³œdºd¹„ƒZsee	en dœd»d¼„ƒZtetjendd³œd½d¼„ƒZtd¾Zue	ev dœd¿dÀ„Zwe	ev dœdÁdÂ„ZxevddÃœdÄdÅ„ZyevddÃœdÆdÇ„Zzee	ev dœdÈdÉ„ƒZ{e{jevddÃœdÊdÉ„ƒZ{ee	ev dœdËdÌ„ƒZ|e|jevddÃœdÍdÌ„ƒZ|ee0e&ef ddÎœdÏdÐ„Z}dS )êÚ	PdfWriterz�
    This class supports writing PDF files out, given pages produced by another
    class (typically :class:`PdfReader<PyPDF2.PdfReader>`).
    N)Úreturnc                 C   sÆ   d| _ g | _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ƒ }| ttjƒttjƒttjƒ| ji¡ d | _|| _d S )Ns   %PDF-1.3z/Pagesr   z	/ProducerZPyPDF2zutf-16be)Ú_headerÚ_objectsÚ_idnum_hashr.   Úupdater1   ÚPAÚTYPEÚCOUNTr3   ÚKIDSr(   Ú_add_objectÚ_pagesr:   ÚcodecsÚBOM_UTF16_BEÚencodeÚ_infoÚCOZCATALOGZPAGESÚ_rootÚ_root_object)ÚselfÚpagesÚinfoÚroot© rY   ú2/tmp/pip-unpacked-wheel-weujb6sz/PyPDF2/_writer.pyÚ__init__|   sB       ýÿ ÿÿÿ  þÿzPdfWriter.__init__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.
        ©rD   ©rU   rY   rY   rZ   Ú
pdf_header¢   s    	zPdfWriter.pdf_header)Ú
new_headerrC   c                 C   s
   || _ d S ©Nr\   )rU   r_   rY   rY   rZ   r^   ­   s    ©ÚobjrC   c                 C   s   | j  |¡ tt| j ƒd| ƒS )Nr   )rE   Úappendr0   Úlen©rU   rb   rY   rY   rZ   rL   ±   s    zPdfWriter._add_object)ÚidorC   c                 C   s"   |j | krtdƒ‚| j|jd  S )Nzpdf must be selfr   )ÚpdfÚ
ValueErrorrE   Úidnum©rU   rf   rY   rY   rZ   Ú
get_objectµ   s    
zPdfWriter.get_objectc                 C   s   t ddƒ |  |¡S )zU
        .. deprecated:: 1.28.0

            Use :meth:`get_object` instead.
        Ú	getObjectrk   )r   rk   rj   rY   rY   rZ   rl   º   s    
zPdfWriter.getObject)ÚpageÚactionrC   c                 C   s¬   |t j tjkst‚|jd k	rF|jj}t|tƒr8| 	¡ }t
| j|ƒ| _| j|tt jƒ< |  |¡}tt|  | j¡ƒ}||t j |ƒ tt|t j ƒ}t|d ƒ|tt jƒ< d S )Nr   )rH   rI   rR   ZPAGEÚAssertionErrorrg   r^   Ú
isinstanceÚstrrP   r   rM   r1   ÚPARENTrL   r   r.   rk   rK   ÚintrJ   r3   )rU   rm   rn   ÚotherZpage_indrV   Z
page_countrY   rY   rZ   Ú	_add_pageÃ   s    


zPdfWriter._add_pagec              
   C   sŽ   zV| j }tj|kr6| j  ttjƒtt| jƒd| ƒi¡ ttj	ƒ}t
dƒ| j tj |< W n2 tk
rˆ } zt dt|ƒ¡ W 5 d }~X Y nX d S )Nr   Tz&set_need_appearances_writer() catch : )rT   r   Z	ACRO_FORMrG   r1   r0   rd   rE   r!   ZNeedAppearancesr)   Ú	ExceptionÚloggerÚerrorÚrepr)rU   ÚcatalogZneed_appearancesÚexcrY   rY   rZ   Úset_need_appearances_writerÓ   s     
   ÿÿÿ
z%PdfWriter.set_need_appearances_writer)rm   rC   c                 C   s   |   |tj¡ dS )a&  
        Add a page to 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. Should be
            an instance of :class:`PageObject<PyPDF2._page.PageObject>`
        N)ru   Úlistrc   ©rU   rm   rY   rY   rZ   Úadd_pageè   s    
zPdfWriter.add_pagec                 C   s   t ddƒ |  |¡ dS )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_page` instead.
        ÚaddPager   N)r   r   r~   rY   rY   rZ   r€   ô   s    
zPdfWriter.addPager   )rm   ÚindexrC   c                    s   |   |‡ fdd„¡ dS )aw  
        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.  This
            argument should be an instance of :class:`PageObject<PyPDF2._page.PageObject>`.
        :param int index: Position at which the page will be inserted.
        c                    s   |   ˆ |¡S r`   )Úinsert)ÚlÚp©r�   rY   rZ   Ú<lambda>  ó    z'PdfWriter.insert_page.<locals>.<lambda>N)ru   ©rU   rm   r�   rY   r…   rZ   Úinsert_pageý   s    	zPdfWriter.insert_pagec                 C   s   t ddƒ |  ||¡ dS )zV
        .. deprecated:: 1.28.0

            Use :meth:`insert_page` instead.
        Ú
insertPager‰   N)r   r‰   rˆ   rY   rY   rZ   rŠ     s    
zPdfWriter.insertPage)Úpage_numberÚ
pageNumberrC   c                 C   sn   |dk	r*|dk	rt dƒ‚ntdddƒ |}|dkrB|dkrBt dƒ‚ttttf |  | j¡ƒ}|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)z4.0.0zPlease specify the page_number)
rh   r   r   r   rq   r   rk   rM   rH   rK   )rU   r‹   rŒ   rV   rY   rY   rZ   Úget_page  s    

  ÿzPdfWriter.get_page)rŒ   rC   c                 C   s   t ddƒ |  |¡S )zd
        .. deprecated:: 1.28.0

            Use :code:`writer.pages[page_number]` instead.
        ÚgetPagezwriter.pages[page_number])r   r�   )rU   rŒ   rY   rY   rZ   rŽ   )  s    
zPdfWriter.getPagec                 C   s*   t tttf |  | j¡ƒ}t|tdƒ ƒS )Nz/Count)r   r   rq   r   rk   rM   rs   r1   )rU   rV   rY   rY   rZ   Ú_get_num_pages2  s    zPdfWriter._get_num_pagesc                 C   s   t ddƒ |  ¡ S )z\
        .. deprecated:: 1.28.0

            Use :code:`len(writer.pages)` instead.
        ÚgetNumPageszlen(writer.pages))r   r�   r]   rY   rY   rZ   r�   6  s    
zPdfWriter.getNumPagesc                 C   s   t | j| jƒS )zNProperty that emulates a list of :class:`PageObject<PyPDF2._page.PageObject>`.)r   r�   r�   r]   rY   rY   rZ   rV   ?  s    zPdfWriter.pages)ÚwidthÚheightrC   c                 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   )rU   r‘   r’   rm   rY   rY   rZ   Úadd_blank_pageD  s    
zPdfWriter.add_blank_pagec                 C   s   t ddƒ |  ||¡S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_blank_page` instead.
        ÚaddBlankPager”   )r   r”   )rU   r‘   r’   rY   rY   rZ   r•   W  s    
zPdfWriter.addBlankPage)r‘   r’   r�   rC   c                 C   sX   |dks |dk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�   rV   Zmediaboxr‘   r’   r   r“   r‰   )rU   r‘   r’   r�   Zoldpagerm   rY   rY   rZ   Úinsert_blank_pageb  s     
zPdfWriter.insert_blank_pagec                 C   s   t ddƒ |  |||¡S )zZ
        .. deprecated:: 1.28.0

            Use :meth:`insertBlankPage` instead.
        ÚinsertBlankPager–   )r   r–   )rU   r‘   r’   r�   rY   rY   rZ   r—   }  s    
zPdfWriter.insertBlankPage)Ú
javascriptrC   c                 C   s²   t ƒ }| ttjƒtdƒtdƒtdƒtdƒtd|› d�ƒi¡ |  |¡}tt ¡ ƒ}t ƒ }| tdƒt tt	j
ƒtt|ƒ|gƒiƒi¡ |  |¡ | j tdƒ|tt	j
ƒ|i¡ 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/Actionú/Sz/JavaScriptz/JSú(ú)z/OpenActionN)r.   rG   r1   rH   rI   rL   rq   ÚuuidZuuid4ÚCAÚNAMESr(   r:   rT   )rU   r˜   ZjsZjs_indirect_objectZjs_string_nameZjs_name_treerY   rY   rZ   Úadd_js‹  s@    	   ýÿ
  
ÿÿÿÿÿ
  þÿzPdfWriter.add_jsc                 C   s   t ddƒ |  |¡S )zQ
        .. deprecated:: 1.28.0

            Use :meth:`add_js` instead.
        ÚaddJSrŸ   )r   rŸ   )rU   r˜   rY   rY   rZ   r    ¶  s    
zPdfWriter.addJS)ÚfilenameÚdatarC   c                 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/EmbeddedFilez/Fz	/Filespecz/EmbeddedFilesN)r,   Úset_datarG   r1   rH   rI   r.   r   ÚFr:   ZEFr�   rž   r(   rT   )rU   r¡   r¢   Z
file_entryZef_entryZfilespecZembedded_files_names_dictionaryZembedded_files_dictionaryrY   rY   rZ   Úadd_attachment¿  s<    
  ÿ ûÿ 
ÿÿÿ
ÿzPdfWriter.add_attachment)ÚfnameÚfdatarC   c                 C   s   t ddƒ |  ||¡S )zY
        .. deprecated:: 1.28.0

            Use :meth:`add_attachment` instead.
        ÚaddAttachmentr¥   )r   r¥   )rU   r¦   r§   rY   rY   rZ   r¨     s    
zPdfWriter.addAttachment)ÚreaderÚafter_page_appendrC   c                 C   sX   t |jƒ}t | jƒ}t|ƒD ]6}|j| }|  |¡ | j||  }t|ƒr||ƒ qdS )aO  
        Copy pages from reader to writer. Includes an optional callback parameter
        which is invoked after pages are appended to the writer.

        :param reader: a PdfReader object from which to copy page
            annotations to this writer object.  The writer's annots
            will then be updated
        :callback after_page_append (function): Callback function that is invoked after
            each page is appended to the writer. Callback signature:
        :param writer_pageref (PDF page reference): Reference to the page
            appended to the writer.
        N)rd   rV   Úranger   Úcallable)rU   r©   rª   Zreader_num_pagesZwriter_num_pagesZrpagenumZreader_pageZwriter_pagerY   rY   rZ   Úappend_pages_from_reader  s    



z"PdfWriter.append_pages_from_readerc                 C   s   t ddƒ |  ||¡ dS )zc
        .. deprecated:: 1.28.0

            Use :meth:`append_pages_from_reader` instead.
        ÚappendPagesFromReaderr­   N)r   r­   ©rU   r©   rª   rY   rY   rZ   r®   :  s    

zPdfWriter.appendPagesFromReader)rm   ÚfieldsÚflagsrC   c                 C   sú   |   ¡  tt|tj ƒƒD ]Ú}|tj |  ¡ }i }tj|krH|tj }|D ]¦}| tj	¡|krÆ| tj
¡dkrŒ| ttjƒt|| ƒi¡ | ttjƒt|| ƒi¡ |rò| ttjƒt|ƒi¡ qL| tj	¡|krL| ttjƒt|| ƒi¡ qLq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 page: Page reference from PDF writer where the annotations
            and field data will be updated.
        :param fields: a Python dictionary of field names (/T) and text
            values (/V)
        :param 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/BtnN)r|   r«   rd   ÚPGÚANNOTSrk   rr   Úgetr   ÚTZFTrG   r1   r   ZASÚVr7   ZFfr3   )rU   rm   r°   r±   ÚjZwriter_annotZwriter_parent_annotÚfieldrY   rY   rZ   Úupdate_page_form_field_valuesG  sN    

ÿ
ýÿ ÿÿÿ ÿÿÿ ÿÿÿz'PdfWriter.update_page_form_field_valuesc                 C   s   t ddƒ |  |||¡S )zh
        .. deprecated:: 1.28.0

            Use :meth:`update_page_form_field_values` instead.
        ÚupdatePageFormFieldValuesr¹   )r   r¹   )rU   rm   r°   r±   rY   rY   rZ   rº   …  s
     ÿz#PdfWriter.updatePageFormFieldValues)r©   rC   c                 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.
        :callback after_page_append:
        N)r   r.   ÚtrailerÚTKÚROOTrT   ©rU   r©   rY   rY   rZ   Úclone_reader_document_root•  s    z$PdfWriter.clone_reader_document_rootc                 C   s   t ddƒ |  |¡ dS )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_reader_document_root` instead.
        ÚcloneReaderDocumentRootr¿   N)r   r¿   r¾   rY   rY   rZ   rÀ   ž  s
     ÿz!PdfWriter.cloneReaderDocumentRootc                 C   s   |   |¡ |  ||¡ dS )a2  
        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.
        :callback after_page_append (function): Callback function that is invoked after
            each page is appended to the writer. Signature includes a reference to the
            appended page (delegates to appendPagesFromReader). Callback signature:

            :param writer_pageref (PDF page reference): Reference to the page just
                appended to the document.
        N)r¿   r­   r¯   rY   rY   rZ   Úclone_document_from_reader©  s    
z$PdfWriter.clone_document_from_readerc                 C   s   t ddƒ |  ||¡ dS )ze
        .. deprecated:: 1.28.0

            Use :meth:`clone_document_from_reader` instead.
        ÚcloneDocumentFromReaderrÁ   N)r   rÁ   r¯   rY   rY   rZ   rÂ   ½  s
    
 ÿz!PdfWriter.cloneDocumentFromReaderT)Úuser_pwdÚ	owner_pwdÚ
use_128bitÚpermissions_flagrC   c                 C   sx  |dkr|}|r"d}d}t dƒ}nd}d}t dƒ}|}tt||||ƒƒ}	tttt ¡ ƒ d¡ƒ ¡ ƒ}
tttt ¡ ƒ d¡ƒ ¡ ƒ}t	|
|fƒ| _
|dkr®t||	||
ƒ\}}n$|dksºt‚t||||	||
dƒ\}}tƒ }td	ƒ|ttjƒ< t|ƒ|td
ƒ< |dk�rt|d ƒ|ttjƒ< t|ƒ|ttjƒ< t|	ƒ|ttjƒ< t|ƒ|ttjƒ< t|ƒ|ttjƒ< |  |¡| _|| _dS )a  
        Encrypt this PDF file with the PDF Standard encryption handler.

        :param str user_pwd: The "user password", which allows for opening
            and reading the PDF file with the restrictions provided.
        :param str owner_pwd: 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.
        Né   é   g      0@r   g      @Úutf8Fz	/Standardz/Vé   )rs   r*   r   r   ry   ÚtimerP   ÚdigestÚrandomr(   Ú_IDr   ro   r   r.   r1   ÚSAZFILTERr3   ZLENGTHÚEDÚRÚOÚUÚPrL   Ú_encryptÚ_encrypt_key)rU   rÃ   rÄ   rÅ   rÆ   r¶   ÚrevZkeylenrÔ   rÒ   ZID_1ZID_2rÓ   ÚkeyÚencryptrY   rY   rZ   rÙ   Ì  s:    

zPdfWriter.encrypt)ÚstreamrC   c                 C   s‚   t |dƒr(d|jkr(t d|j› d�¡ | js<|  | j¡| _|  | j¡ |  	|¡}|  
||¡}|  |¡ | td|› d�ƒ¡ dS )zô
        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 must support
            the write method and the tell method, similar to a file object.
        ÚmodeÚbzFile <zH> to write to is not in binary mode. It may not be written to correctly.z
startxref
z
%%EOF
N)ÚhasattrrÛ   ÚwarningsÚwarnÚnamerS   rL   rT   Ú_sweep_indirect_referencesÚ_write_headerÚ_write_xref_tableÚ_write_trailerÚwriter   )rU   rÚ   Úobject_positionsÚxref_locationrY   rY   rZ   rå     s    ÿ


zPdfWriter.writec           
      C   s$  g }|  | jd ¡ |  d¡ t| jƒD ]ö\}}| j| }|d k	r(|d }| | ¡ ¡ |  tt|ƒƒd ¡ d }t| dƒ�r|| j	j
k�rt d|d ¡d d… }t dd¡d d	… }| j| | }t|ƒt| jƒd
 ksàt‚t|ƒ ¡ }	|	d tdt| jƒd
 ƒ… }| ||¡ |  d¡ q(|S )Nó   
s   %âãÏÓ
r   s    0 obj
rÕ   z<irÈ   r   rÇ   é   é   s   
endobj
)rå   r^   Ú	enumeraterE   rc   Útellr   rq   rÝ   rÕ   ri   ÚstructÚpackrÖ   rd   ro   r   rÌ   ÚminÚwrite_to_stream)
rU   rÚ   ræ   Úirb   ri   rØ   Zpack1Zpack2Zmd5_hashrY   rY   rZ   râ   %  s(    

zPdfWriter._write_header)rÚ   ræ   rC   c                 C   s|   |  ¡ }| d¡ | tdt| jƒd › d�ƒ¡ | tdd›ddd	›d
�ƒ¡ |D ]"}| t|d›ddd	›d�ƒ¡ qT|S )Ns   xref
z0 r   Ú
r   z0>10ú iÿÿ  z0>5z f 
z n 
)rì   rå   r   rd   rE   )rU   rÚ   ræ   rç   ÚoffsetrY   rY   rZ   rã   <  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ƒrd| j|ttjƒ< t| dƒr~| j|ttjƒ< | |d ¡ d S )Ns   trailer
r   rÎ   rÕ   )rå   r.   rG   r1   r¼   ZSIZEr3   rd   rE   r½   rS   ÚINFOrQ   rÝ   rÎ   ZIDrÕ   ZENCRYPTrð   )rU   rÚ   r»   rY   rY   rZ   rä   E  s     
   ýÿ

zPdfWriter._write_trailer)ÚinfosrC   c                 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}   Úitemsr:   r1   rk   rQ   rG   )rU   rö   ÚargsrØ   ÚvaluerY   rY   rZ   Úadd_metadataU  s    zPdfWriter.add_metadatac                 C   s   t ddƒ |  |¡ dS )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_metadata` instead.
        ÚaddMetadatarú   N)r   rú   )rU   rö   rY   rY   rZ   rû   a  s    
zPdfWriter.addMetadata)rX   rC   c                 C   sr  t  ¡ }g }d }g }d }| ||||f¡ t|ƒ�rn| ¡ \}}}}t|ttfƒrŠ| ¡ D ],\}}	| |	|||d k	r~||g ng f¡ qZnDt|t	ƒrÎ|  
|¡}t|ƒ|krÎ| t|ƒ¡ | | ¡ d d g f¡ t|ttfƒr*t|tƒrö|  
|  |¡¡}g }
|| |k�r(| ¡ gdd„ |D ƒ }
|||< |
D ]>}| j |d ¡}|d k	�r,| ¡ }|d k	�r,|| j| ¡ < �q,q*d S )Nc                 S   s   g | ]}|  ¡ ‘qS rY   )Ú
hash_value)Ú.0Zgrant_parentrY   rY   rZ   Ú
<listcomp>©  s    z8PdfWriter._sweep_indirect_references.<locals>.<listcomp>)ÚcollectionsÚdequerc   rd   Úpoprp   r(   r.   r÷   r0   Ú_resolve_indirect_objectrq   rk   r6   rL   rü   rF   )rU   rX   ÚstackZ
discoveredÚparentZgrant_parentsZ	key_or_idr¢   rØ   rù   Zupdate_hashesZold_hashZindirect_refZindirect_ref_objrY   rY   rZ   rá   j  sR    ù
üÿ


ÿ

þÿz$PdfWriter._sweep_indirect_references)r¢   rC   c                 C   s¸   t |jdƒr*|jjjr*td|jjj› �ƒ‚|j |¡}|dkrbt d|j	j
› d|› d�t¡ tƒ }| ¡ }|| jk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 [z: z], returning NullObject insteadr   )rÝ   rg   rÚ   Úclosedrh   rà   rk   rÞ   rß   Ú	__class__Ú__name__r   r2   rü   rF   r0   ri   rL   )rU   r¢   Zreal_objrü   rY   rY   rZ   r  º  s     ý


z"PdfWriter._resolve_indirect_objectc                 C   s0   | j  |¡d }t|d| ƒ}| ¡ |ks,t‚|S ©Nr   r   )rE   r�   r0   rk   ro   )rU   rb   ri   ÚrefrY   rY   rZ   Úget_referenceÝ  s    zPdfWriter.get_referencec                 C   s   t ddƒ |  |¡S )zX
        .. deprecated:: 1.28.0

            Use :meth:`get_reference` instead.
        ÚgetReferencer
  )r   r
  re   rY   rY   rZ   r  ã  s    
zPdfWriter.getReferencec                 C   sz   t j| jkrLtt| jt j ƒ}| j |¡d }t|d| ƒ}| ¡ |ksvt	‚n*tƒ }| 
i ¡ |  |¡}|| jtt jƒ< |S r  )rR   ZOUTLINESrT   r   r8   rE   r�   r0   rk   ro   rG   rL   r1   )rU   Úoutlineri   Zoutline_refrY   rY   rZ   Úget_outline_rootì  s    

zPdfWriter.get_outline_rootc                 C   s   t ddƒ |  ¡ S )z[
        .. deprecated:: 1.28.0

            Use :meth:`get_outline_root` instead.
        ÚgetOutlineRootr  )r   r  r]   rY   rY   rZ   r  û  s    
zPdfWriter.getOutlineRootc                 C   sr  t j| jk�rt| jt j tƒ�rtt| jt j ƒ}| j |¡d }t|d| ƒ}| 	¡ |ks`t
‚t j|krèt|t j tƒrètt|t j ƒ}| j |¡d }t|d| ƒ}| 	¡ |ks¶t
‚t j|krÒtt|t j ƒ}ntƒ }||tt jƒ< n2tƒ }|  |¡}||tt jƒ< tƒ }||tt jƒ< nRtƒ }|  |¡}|| jtt jƒ< tƒ }|  |¡}||tt jƒ< tƒ }||tt jƒ< |S r  )r�   rž   rT   rp   r.   r   rE   r�   r0   rk   ro   ZDESTSr(   r1   rL   )rU   Únamesri   Z	names_refZdestsZ	dests_refÚndrY   rY   rZ   Úget_named_dest_root  s>    
 ÿ



zPdfWriter.get_named_dest_rootc                 C   s   t ddƒ |  ¡ S )z^
        .. deprecated:: 1.28.0

            Use :meth:`get_named_dest_root` instead.
        ÚgetNamedDestRootr  )r   r  r]   rY   rY   rZ   r  +  s    
zPdfWriter.getNamedDestRoot)Údestr  rC   c                 C   s8   |d kr|   ¡ }tt| ¡ ƒ}|  |¡}| || ¡ |S r`   )r  r   r8   rk   rL   Z	add_child)rU   r  r  Údest_refrY   rY   rZ   Úadd_bookmark_destination4  s    
z"PdfWriter.add_bookmark_destinationc                 C   s   t ddƒ |  ||¡S )zc
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark_destination` instead.
        ÚaddBookmarkDestinationr  )r   r  )rU   r  r  rY   rY   rZ   r  B  s    
z PdfWriter.addBookmarkDestination)Úbookmarkr  rC   c           	      C   sš   t ƒ }t| ¡ ƒD ]\}}||tt|ƒƒ< q| |¡ d|krŽtƒ }tt|d ƒ}t| ¡ ƒD ]\}}||tt|ƒƒ< q^|  |¡}||tdƒ< |  	||¡S )Nú/A)
r8   r}   r÷   r1   rq   rG   r.   r   rL   r  )	rU   r  r  Zbookmark_objÚkÚvrn   Za_dictÚ
action_refrY   rY   rZ   Úadd_bookmark_dictM  s    

zPdfWriter.add_bookmark_dictc                 C   s   t ddƒ |  ||¡S )z\
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark_dict` instead.
        ÚaddBookmarkDictr  )r   r  )rU   r  r  rY   rY   rZ   r  _  s    
zPdfWriter.addBookmarkDictFú/Fit)	ÚtitleÚpagenumr  ÚcolorÚboldÚitalicÚfitrø   rC   c                 G   sŒ   t |ƒ}	dd„ |D ƒ}
ttd| d ƒ|	t|ƒf|
žŽ }|  tttjƒ|jttjƒtdƒiƒ¡}t	|||||ƒ}|dkr€|  
¡ }|  ||¡S )aG  
        Add a bookmark to this PDF file.

        :param str title: Title to use for this bookmark.
        :param int pagenum: Page number this bookmark will point to.
        :param parent: A reference to a parent bookmark to create nested
            bookmarks.
        :param tuple color: Color of the bookmark as a red, green, blue tuple
            from 0.0 to 1.0
        :param bool bold: Bookmark is bold
        :param bool italic: Bookmark is italic
        :param str fit: The fit of the destination page. See
            :meth:`addLink()<addLink>` for details.
        c                 S   s"   g | ]}|d krt ƒ nt|ƒ‘qS r`   ©r2   r3   ©rý   ÚarY   rY   rZ   rþ   „  s    z*PdfWriter.add_bookmark.<locals>.<listcomp>ú/z	 bookmarkú/GoToN)r3   r-   r1   rL   r.   r    ÚDÚ
dest_arrayÚSr9   r  r  )rU   r  r   r  r!  r"  r#  r$  rø   Úpage_refÚ	zoom_argsr  r  r  rY   rY   rZ   Úadd_bookmarkj  s0    ÿ  ÿÿ  þÿÿzPdfWriter.add_bookmarkc           	      G   s&   t ddƒ | j|||||||f|žŽ S )zW
        .. deprecated:: 1.28.0

            Use :meth:`add_bookmark` instead.
        ÚaddBookmarkr/  )r   r/  )	rU   r  r   r  r!  r"  r#  r$  rø   rY   rY   rZ   r0  ™  s    
      ÿÿzPdfWriter.addBookmark)r  rC   c                 C   s(   |   |¡}|  ¡ }| |d |g¡ |S )Nz/Title)rL   r  Úextend)rU   r  r  r  rY   rY   rZ   Úadd_named_destination_object®  s    
z&PdfWriter.add_named_destination_objectc                 C   s   t ddƒ |  |¡S )zg
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination_object` instead.
        ÚaddNamedDestinationObjectr2  )r   r2  )rU   r  rY   rY   rZ   r3  µ  s
     ÿz#PdfWriter.addNamedDestinationObject)r  r   rC   c                 C   sv   |   | j¡tj | }tƒ }| ttjƒt	|tt
jƒtdƒgƒttjƒtdƒi¡ |  |¡}|  ¡ }| ||g¡ |S )Ni:  r)  )rk   rM   rH   rK   r.   rG   r1   r    r*  r(   r&   ZFIT_Hr3   r,  rL   r  r1  )rU   r  r   r-  r  r  r  rY   rY   rZ   Úadd_named_destinationÂ  s     ÿ üÿ	
zPdfWriter.add_named_destinationc                 C   s   t ddƒ |  ||¡S )z`
        .. deprecated:: 1.28.0

            Use :meth:`add_named_destination` instead.
        ÚaddNamedDestinationr4  )r   r4  )rU   r  r   rY   rY   rZ   r5  Ó  s    
zPdfWriter.addNamedDestinationc                 C   sR   t t|  | j¡ƒ}t t|tj ƒ}|D ]&}t t|  |¡ƒ}tj|kr&|tj= q&dS )z.Remove links and annotations from this output.N)	r   r.   rk   rM   r(   rH   rK   r²   r³   )rU   Úpg_dictrV   rm   r-  rY   rY   rZ   Úremove_linksÞ  s    
zPdfWriter.remove_linksc                 C   s   t ddƒ |  ¡ S )zW
        .. deprecated:: 1.28.0

            Use :meth:`remove_links` instead.
        ÚremoveLinksr7  )r   r7  r]   rY   rY   rZ   r8  ç  s    
zPdfWriter.removeLinks)Úignore_byte_string_objectrC   c                 C   st  t t|  | j¡ƒ}t t|tj ƒ}d}|D �]B}t t|  |¡ƒ}|d  ¡ }t|tƒs`t||ƒ}g }d}	|j	D ]è\}
}|dkr |
d }|ržt|t
ƒsžt
ƒ |
d< nn|dkrÊ|
d }|rÈt|t
ƒsÈt
ƒ |
d< nD|dk�rtt|
d ƒƒD ](}|rät|
d | t
ƒsät
ƒ |
d |< qä|d	k�rd
}	|dk�r*d}	|	�r<||k�r<qn|dk�rHqn| |
|f¡ qn||_	| 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.   rk   rM   r(   rH   rK   rp   r+   Ú
operationsr7   r«   rd   rc   Ú__setitem__r1   )rU   r9  r6  rV   Zjump_operatorsrm   r-  ÚcontentZ_operationsZseq_graphicsÚoperandsÚoperatorÚtextrñ   rY   rY   rZ   Úremove_imagesð  sV    


 ÿ ÿ

 ÿ


zPdfWriter.remove_images)ÚignoreByteStringObjectrC   c                 C   s   t ddƒ |  |¡S )zX
        .. deprecated:: 1.28.0

            Use :meth:`remove_images` instead.
        ÚremoveImagesr[  )r   r[  ©rU   r\  rY   rY   rZ   r]  =  s    
zPdfWriter.removeImagesc                 C   sŒ  t t|  | j¡ƒ}t tt |tj ƒ}|D �]Z}t tt	t
f |  |¡ƒ}|d  ¡ }t|tƒsht||ƒ}|jD �]\}}|dkr¼|d }	|s¢t|	tƒrºtƒ |d< nt|	ttfƒrºtƒ |d< qn|dk�r|d }	|sèt|	tƒrætƒ |d< nt|	ttfƒ�rttƒ |d< qn|dkrntt|d ƒƒD ]V}
|�sJt|d |
 tƒ�rptƒ |d |
< n&t|d |
 ttfƒ�rtƒ |d |
< �qqn| tdƒ|¡ q*dS )zœ
        Remove text from this output.

        :param bool ignore_byte_string_object: optional parameter
            to ignore ByteString Objects.
        rN  rO  r   rQ  rÇ   rR  N)r   r.   rk   rM   r   r0   rH   rK   r   rq   r   rp   r+   rU  r7   r*   r«   rd   rV  r1   )rU   r9  r6  rV   rm   r-  rW  rX  rY  rZ  rñ   rY   rY   rZ   Úremove_textH  sB    






 ÿzPdfWriter.remove_textc                 C   s   t ddƒ |  |¡S )zV
        .. deprecated:: 1.28.0

            Use :meth:`remove_text` instead.
        Ú
removeTextr_  )r   r_  r^  rY   rY   rZ   r`  t  s    
zPdfWriter.removeText)r   ÚuriÚrectÚborderrC   c                 C   s|  |   | j¡tj | }ttttf |   |¡ƒ}|dk	rzdd„ |dd… D ƒ}t|ƒdkrˆt	dd„ |d D ƒƒ}| 
|¡ ntdƒgd }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|k�rd|tj  
|¡ n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 pagenum: index of the page on which to place the URI action.
        :param str uri: URI of resource to link to.
        :param 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 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.
        Nc                 S   s   g | ]}t |ƒ‘qS rY   ©r1   ©rý   ÚnrY   rY   rZ   rþ   ˜  s     z%PdfWriter.add_uri.<locals>.<listcomp>rÈ   é   c                 S   s   g | ]}t |ƒ‘qS rY   rd  re  rY   rY   rZ   rþ   š  s     rÇ   r™   z/URIú/Linkz/Hz/Ir  )rk   rM   rH   rK   r   r   rq   r   rd   r(   rc   r3   rp   r1   r5   r.   rG   r7   r   ÚTyper²   r³   ZSubtyperÔ   ZRectZBorderrL   )rU   r   ra  rb  rc  Ú	page_linkr-  Ú
border_arrÚdash_patternZlnk2ÚlnkÚlnk_refrY   rY   rZ   Úadd_uri  sZ    


  þÿ      ÿ ÷ÿ
zPdfWriter.add_uric                 C   s   t ddƒ |  ||||¡S )zR
        .. deprecated:: 1.28.0

            Use :meth:`add_uri` instead.
        ÚaddURIro  )r   ro  )rU   r   ra  rb  rc  rY   rY   rZ   rp  Â  s    
zPdfWriter.addURI)r   Úpagedestrb  rc  r$  rø   rC   c                 G   s€  t tttf |  | j¡ƒ}|tj | }|tj | }	t tttf |  |¡ƒ}
|dk	ršdd„ |dd… D ƒ}t|ƒdkr¨t	dd„ |d D ƒƒ}| 
|¡ ntdƒgd }t|tƒr¼t|ƒ}nt|tƒrÈnt|ƒ}dd„ |D ƒ}ttd	ƒ|	t|ƒf|žŽ }ttd
ƒttjƒtdƒtdƒtdƒ|tdƒ|tdƒt	|ƒtdƒ|jiƒ}|  |¡}tj|
k�rh|
tj  
|¡ nt	|gƒ|
ttjƒ< dS )a€  
        Add an internal link from a rectangular area to the specified page.

        :param int pagenum: index of the page on which to place the link.
        :param int pagedest: index of the page to which the link should go.
        :param 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 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.
        :param str fit: Page fit or 'zoom' option (see below). Additional arguments may need
            to be supplied. Passing ``None`` will be read as a null value for that coordinate.

        .. list-table:: Valid ``zoom`` arguments (see Table 8.2 of the PDF 1.7 reference for details)
           :widths: 50 200

           * - /Fit
             - No additional arguments
           * - /XYZ
             - [left] [top] [zoomFactor]
           * - /FitH
             - [top]
           * - /FitV
             - [left]
           * - /FitR
             - [left] [bottom] [right] [top]
           * - /FitB
             - No additional arguments
           * - /FitBH
             - [top]
           * - /FitBV
             - [left]
        Nc                 S   s   g | ]}t |ƒ‘qS rY   rd  re  rY   rY   rZ   rþ     s     z&PdfWriter.add_link.<locals>.<listcomp>rÈ   rg  c                 S   s   g | ]}t |ƒ‘qS rY   rd  re  rY   rY   rZ   rþ     s     r   c                 S   s"   g | ]}|d krt ƒ nt|ƒ‘qS r`   r%  r&  rY   rY   rZ   rþ     s    z	/LinkNamez/Typez/Subtyperh  ú/Pz/Rectz/Borderz/Dest)r   r   rq   r   rk   rM   rH   rK   rd   r(   rc   r3   rp   r1   r5   r-   r.   r²   r³   r+  rL   )rU   r   rq  rb  rc  r$  rø   Z	pages_objrj  Z	page_destr-  rk  rl  r.  r  rm  rn  rY   rY   rZ   Úadd_linkÑ  sX    +


ÿ  ÿÿ      úÿ

zPdfWriter.add_linkc                 G   s"   t ddƒ | j|||||f|žŽ S )zS
        .. deprecated:: 1.28.0

            Use :meth:`add_link` instead.
        ÚaddLinkrs  )r   rs  )rU   r   rq  rb  rc  r$  rø   rY   rY   rZ   rt  )  s    
zPdfWriter.addLink)z	/NoLayoutz/SinglePagez
/OneColumnz/TwoColumnLeftz/TwoColumnRightz/TwoPageLeftz/TwoPageRightc                 C   s.   zt t| jd ƒW S  tk
r(   Y d S X d S )Nú/PageLayout)r   r>   rT   ÚKeyErrorr]   rY   rY   rZ   Ú_get_page_layoutD  s    zPdfWriter._get_page_layoutc                 C   s   t ddƒ |  ¡ S )úY
        .. deprecated:: 1.28.0

            Use :py:attr:`page_layout` instead.
        ÚgetPageLayoutÚpage_layout)r   rw  r]   rY   rY   rZ   ry  J  s    
zPdfWriter.getPageLayout)ÚlayoutrC   c                 C   sP   t |tƒs8|| jkr0t ddd | j¡f› �¡ 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  N)rp   r1   Ú_valid_layoutsrÞ   rß   ÚjoinrT   rG   ©rU   r{  rY   rY   rZ   Ú_set_page_layoutS  s    

ÿzPdfWriter._set_page_layoutc                 C   s   t ddƒ |  |¡S )rx  zwriter.setPageLayout(val)zwriter.page_layout = val)r   r€  r  rY   rY   rZ   ÚsetPageLayouts  s
     ÿzPdfWriter.setPageLayoutc                 C   s   |   ¡ 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
        )rw  r]   rY   rY   rZ   rz  ~  s    zPdfWriter.page_layoutc                 C   s   |   |¡ d S r`   )r€  r  rY   rY   rZ   rz  —  s    c                 C   s   t ddƒ | jS )rx  Ú
pageLayoutrz  ©r   rz  r]   rY   rY   rZ   r‚  ›  s    
zPdfWriter.pageLayoutc                 C   s   t ddƒ || _dS )rx  r‚  rz  Nrƒ  r  rY   rY   rZ   r‚  ¥  s    
)z/UseNonez/UseOutlinesz
/UseThumbsz/FullScreenz/UseOCz/UseAttachmentsc                 C   s.   zt t| jd ƒW S  tk
r(   Y d S X d S )Nú	/PageMode)r   r?   rT   rv  r]   rY   rY   rZ   Ú_get_page_mode¸  s    zPdfWriter._get_page_modec                 C   s   t ddƒ |  ¡ S )úW
        .. deprecated:: 1.28.0

            Use :py:attr:`page_mode` instead.
        ÚgetPageModeÚ	page_mode)r   r…  r]   rY   rY   rZ   r‡  ¾  s    
zPdfWriter.getPageMode)rÛ   rC   c                 C   sR   t |tƒr|}n*|| jkr2t dd | j¡› �¡ t|ƒ}| j tdƒ|i¡ dS )r†  zMode should be one of: z, r„  N)rp   r1   Ú_valid_modesrÞ   rß   r~  rT   rG   )rU   rÛ   Z	mode_namerY   rY   rZ   Úset_page_modeÇ  s    

zPdfWriter.set_page_modec                 C   s   t ddƒ |  |¡ dS )r†  zwriter.setPageMode(val)zwriter.page_mode = valN)r   rŠ  ©rU   rÛ   rY   rY   rZ   ÚsetPageModeÕ  s    
zPdfWriter.setPageModec                 C   s   |   ¡ S )a   
        Page mode property.

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

           * - /UseNone
             - Do not show outlines or thumbnails panels
           * - /UseOutlines
             - Show outlines (aka bookmarks) panel
           * - /UseThumbs
             - Show page thumbnails panel
           * - /FullScreen
             - Fullscreen view
           * - /UseOC
             - Show Optional Content Group (OCG) panel
           * - /UseAttachments
             - Show attachments panel
        )r…  r]   rY   rY   rZ   rˆ  Þ  s    zPdfWriter.page_modec                 C   s   |   |¡ d S r`   )rŠ  r‹  rY   rY   rZ   rˆ  õ  s    c                 C   s   t ddƒ | jS )r†  ÚpageModerˆ  ©r   rˆ  r]   rY   rY   rZ   r�  ù  s    
zPdfWriter.pageModec                 C   s   t ddƒ || _dS )r†  r�  rˆ  NrŽ  r‹  rY   rY   rZ   r�    s    
)r‹   Ú
annotationrC   c                 C   st   t tt|ƒƒ}|  | j¡d | |tdƒ< | j| }|jd krLtƒ |tdƒ< |jd k	sZt	‚|  
|¡}|j |¡ d S )Nz/Kidsrr  z/Annots)r   r.   Ú_pdf_objectifyrk   rM   r1   rV   Úannotationsr(   ro   rL   rc   )rU   r‹   r�  Úto_addrm   Zind_objrY   rY   rZ   Úadd_annotation  s    


zPdfWriter.add_annotation)r   )r   )NN)NN)NN)NNr   )NNr   )N)N)N)N)N)N)N)N)NNFFr  )NNFFr  )F)F)F)F)N)N)Nr  )Nr  )~r  Ú
__module__Ú__qualname__Ú__doc__r[   ÚpropertyÚbytesr^   Úsetterr   r4   r0   rL   rk   rl   r   r   r   ru   r|   r   r€   rs   r‰   rŠ   r�   rŽ   r�   r�   r   rV   Úfloatr”   r•   ÚdecimalÚDecimalr–   r—   rq   rŸ   r    r
   r¥   r¨   r   r­   r®   ÚOPTIONAL_READ_WRITE_FIELDr   r   r¹   rº   r¿   rÀ   rÁ   rÂ   ÚALL_DOCUMENT_PERMISSIONSÚboolr'   rÙ   r   rå   râ   rã   rä   rú   rû   r(   r)   r.   r/   r1   r3   r7   r2   rá   r  r
  r  r8   r  r  r  r  r  r  r;   r  r  r	   r=   rA   r/  r0  r2  r3  r4  r5  r7  r8  r[  r]  r_  r`  r5   ro  rp  rs  rt  r}  r>   rw  ry  r€  r�  rz  r‚  r‰  r?   r…  r‡  rŠ  rŒ  rˆ  r�  r“  rY   rY   rY   rZ   rB   v   sF  &

 þ	
   ÿ þ		   ÿ þ   ÿ þ   üû   üû+	S 
þ ýü! ýüü
ûBü
û	 ýü ýüûú:	÷ÿòP#		' ý
ü ÿ þ ÿ þ ÿ þ     øö3     øöþ þ		N ÿþ- ÿþ ûúH ûú  úø]  úø
	 							rB   ra   c                 C   sÌ   t | tƒr| S t | tƒrLtƒ }|  ¡ D ] \}}t|ƒ}t|ƒ}|||< q&|S t | tƒrxtƒ }| D ]}| 	t|ƒ¡ q`|S t | t
ƒrž|  d¡r”t| ƒS t| ƒS n*t | ttfƒr´t| ƒS tdt| ƒ› d�ƒ‚d S )Nr(  z
type(obj)=z! could not be casted to PdfObject)rp   r4   Údictr.   r÷   r1   r�  r}   r(   rc   rq   Ú
startswithr7   rs   rš  r/   ÚNotImplementedErrorÚtype)rb   r’  rØ   rù   Zname_keyZcasted_valueZarrÚelrY   rY   rZ   r�    s.    






ÿr�  c                       s&   e Zd Zeeddœ‡ fdd„Z‡  ZS )ÚPdfFileWriterN)rø   ÚkwargsrC   c                    s   t ddƒ tƒ j||Ž d S )Nr¥  rB   )r   Úsuperr[   )rU   rø   r¦  ©r  rY   rZ   r[   7  s    
zPdfFileWriter.__init__)r  r”  r•  r   r[   Ú__classcell__rY   rY   r¨  rZ   r¥  6  s   r¥  )crN   rÿ   r›  ÚloggingrÍ   rí   rË   rœ   rÞ   Úhashlibr   Útypingr   r   r   r   r   r   r	   r
   r   ZPyPDF2.errorsr   Z_pager   r   Z_readerr   Z	_securityr   r   r   Ú_utilsr   r   r   r   Ú	constantsr   r   r�   r   r   rR   r   rÐ   r   r   r   r    r!   r"   r²   r#   rH   r$   rÏ   r%   r¼   r&   r'   Zgenericr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   Útypesr;   r<   r=   r>   r?   r@   rA   Ú	getLoggerr  rw   r�  rž  rB   rq   rs   r�  r¥  rY   rY   rY   rZ   Ú<module>   s^   ,T$

             1(