Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 ©«jÌ+ã@s*ddlZddlZddlZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZmZmZmZmZddlmZmZddlmZmZdd lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$dd l%m&Z'dd l%m(Z)dd l%m*Z*dd l%m+Z,ddl%m-Z.ddl%m/Z/m0Z0ddl%m1Z2ddl%m3Z4ddl%m5Z6ddl7m8Z8m9Z9m:Z:m;Z;mZ>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMddlNmOZOmPZPddlQmRZReSeTeeTee dffdœdd„ZUeSeTeeTee dffdœdd„ZVGdd„deBƒZWGdd „d ƒZXGd!d"„d"eXƒZYdS)#éN)Údatetime)ÚBytesIO)ÚPath) ÚAnyÚCallableÚDictÚIterableÚListÚOptionalÚTupleÚUnionÚcasté)Ú EncryptionÚ PasswordType)Ú PageObjectÚ _VirtualList) Ú StrByteTypeÚ StreamTypeÚb_Údeprecate_no_replacementÚdeprecate_with_replacementÚlogger_warningÚread_non_whitespaceÚread_previous_lineÚread_until_whitespaceÚskip_over_commentÚskip_over_whitespace)ÚCatalogAttributes)ÚCatalogDictionary)ÚCheckboxRadioButtonAttributes)ÚCore)ÚDocumentInformationAttributes)ÚFieldDictionaryAttributesÚGoToActionArguments)ÚPageAttributes)ÚPagesAttributes)Ú TrailerKeys)ÚEmptyFileErrorÚFileNotDecryptedErrorÚ PdfReadErrorÚPdfStreamErrorÚWrongPasswordError)Ú ArrayObjectÚ ContentStreamÚDecodedStreamObjectÚ DestinationÚDictionaryObjectÚEncodedStreamObjectÚFieldÚ FloatObjectÚIndirectObjectÚ NameObjectÚ NullObjectÚ NumberObjectÚ PdfObjectÚTextStringObjectÚ TreeObjectÚ read_object)Ú OutlineTypeÚ PagemodeType)ÚXmpInformation.)ÚdÚsizeÚreturncCs4|dkrtdƒ‚d|}|dd…}tjd|ƒdS)Nézinvalid size in convert_to_intsz>qriøÿÿÿ)r*ÚstructÚunpack)r@rA©rFú0/tmp/pip-build-vnmlutbd/PyPDF2/PyPDF2/_reader.pyÚconvert_to_intfs  rHcCstddƒt||ƒS)NÚ convertToIntrH)rrH)r@rArFrFrGrIns rIc@szeZdZdZddœdd„Zeeedœdd„Zeeedœd d „Ze eedœd d „ƒZ e eedœd d„ƒZ e eedœdd„ƒZ e eedœdd„ƒZ e eedœdd„ƒZe eedœdd„ƒZe eedœdd„ƒZe eedœdd„ƒZe eedœdd„ƒZe eedœdd„ƒZe eedœdd „ƒZe eedœd!d"„ƒZe eedœd#d$„ƒZe eedœd%d&„ƒZdS)'ÚDocumentInformationa‚ A class representing the basic document metadata provided in a PDF File. This class is accessible through :py:class:`PdfReader.metadata`. All text properties of the document metadata have *two* properties, eg. author and author_raw. The non-raw property will always return a ``TextStringObject``, making it ideal for a case where the metadata is being displayed. The raw property can sometimes return a ``ByteStringObject``, if PyPDF2 was unable to decode the string's text encoding; this requires additional safety in the caller and therefore is not as commonly accessed. N)rBcCstj|ƒdS)N)r1Ú__init__)ÚselfrFrFrGrKƒszDocumentInformation.__init__)ÚkeyrBcCs|j|dƒ}t|tƒr|SdS)N)ÚgetÚ isinstancer:)rLrMÚretvalrFrFrGÚ _get_text†s  zDocumentInformation._get_textcCstdƒ|j|ƒS)z« The text value of the specified key or None. .. deprecated:: 1.28.0 Use the attributes (e.g. :py:attr:`title` / :py:attr:`author`). ÚgetText)rrQ)rLrMrFrFrGrRŒszDocumentInformation.getTextcCs,|jtjƒr(|jtjƒp*|jtjƒjƒSdS)z´ Read-only property accessing the document's **title**. Returns a unicode string (``TextStringObject``) or ``None`` if the title is not specified. N)rNÚDIÚTITLErQÚ get_object)rLrFrFrGÚtitle—s (zDocumentInformation.titlecCs |jtjƒS)z>The "raw" version of title; can return a ``ByteStringObject``.)rNrSrT)rLrFrFrGÚ title_raw¥szDocumentInformation.title_rawcCs |jtjƒS)z¶ Read-only property accessing the document's **author**. Returns a unicode string (``TextStringObject``) or ``None`` if the author is not specified. )rQrSÚAUTHOR)rLrFrFrGÚauthorªszDocumentInformation.authorcCs |jtjƒS)z?The "raw" version of author; can return a ``ByteStringObject``.)rNrSrX)rLrFrFrGÚ author_raw´szDocumentInformation.author_rawcCs |jtjƒS)z¸ Read-only property accessing the document's **subject**. Returns a unicode string (``TextStringObject``) or ``None`` if the subject is not specified. )rQrSÚSUBJECT)rLrFrFrGÚsubject¹szDocumentInformation.subjectcCs |jtjƒS)z@The "raw" version of subject; can return a ``ByteStringObject``.)rNrSr[)rLrFrFrGÚ subject_rawÃszDocumentInformation.subject_rawcCs |jtjƒS)ax Read-only property accessing the document's **creator**. If the document was converted to PDF from another format, this is the name of the application (e.g. OpenOffice) that created the original document from which it was converted. Returns a unicode string (``TextStringObject``) or ``None`` if the creator is not specified. )rQrSÚCREATOR)rLrFrFrGÚcreatorÈs zDocumentInformation.creatorcCs |jtjƒS)z@The "raw" version of creator; can return a ``ByteStringObject``.)rNrSr^)rLrFrFrGÚ creator_rawÔszDocumentInformation.creator_rawcCs |jtjƒS)a\ Read-only property accessing the document's **producer**. If the document was converted to PDF from another format, this is the name of the application (for example, OSX Quartz) that converted it to PDF. Returns a unicode string (``TextStringObject``) or ``None`` if the producer is not specified. )rQrSÚPRODUCER)rLrFrFrGÚproducerÙs zDocumentInformation.producercCs |jtjƒS)zAThe "raw" version of producer; can return a ``ByteStringObject``.)rNrSra)rLrFrFrGÚ producer_rawåsz DocumentInformation.producer_rawcCs,|jtjƒ}|dkrdStj|jddƒdƒS)zP Read-only property accessing the document's **creation date**. Nú'ÚzD:%Y%m%d%H%M%S%z)rQrSÚ CREATION_DATErÚstrptimeÚreplace)rLÚtextrFrFrGÚ creation_dateês z!DocumentInformation.creation_datecCs |jtjƒS)zÄ The "raw" version of creation date; can return a ``ByteStringObject``. Typically in the format D:YYYYMMDDhhmmss[+-]hh'mm where the suffix is the offset from UTC. )rNrSrf)rLrFrFrGÚcreation_date_rawôsz%DocumentInformation.creation_date_rawcCs,|jtjƒ}|dkrdStj|jddƒdƒS)z˜ Read-only property accessing the document's **modification date**. The date and time the document was most recently modified. NrdrezD:%Y%m%d%H%M%S%z)rQrSÚMOD_DATErrgrh)rLrirFrFrGÚmodification_dateþs z%DocumentInformation.modification_datecCs |jtjƒS)zÈ The "raw" version of modification date; can return a ``ByteStringObject``. Typically in the format D:YYYYMMDDhhmmss[+-]hh'mm where the suffix is the offset from UTC. )rNrSrl)rLrFrFrGÚmodification_date_raw sz)DocumentInformation.modification_date_raw)Ú__name__Ú __module__Ú __qualname__Ú__doc__rKÚstrr rQrRÚpropertyrVrWrYrZr\r]r_r`rbrcrrjrkrmrnrFrFrFrGrJus@          rJc @s.eZdZdZd·eeefeedee fddœdd„Z e edœdd „ƒZ e e edœd d „ƒZe edœd d „Ze e edœdd„ƒZe e edœdd„ƒZe edœdd„Ze e edœdd„ƒZedœdd„Zedœdd„Ze edœdd„ƒZeedœdd„Zeedœd d!„Ze eeefdœd"d#„ƒZe eeefdœd$d%„ƒZ d¸e e!e eeefe ee eeefd&œd'd(„Z"d¹e e!e eeefe ee eeefd&œd)d*„Z#ee!e$feeefeedd+œd,d-„Z%ee!e$feedd&œd.d/„Z&eeedd0œd1d2„Z'eeefdœd3d4„Z(eeefdœd5d6„Z)dºee!dfe eeeefd7œd8d9„Z*d»ee!dfe eeeefd7œd:d;„Z+e e,dœdd?„ƒZ.d¼e e$e ee,d@œdAdB„Z/d½e e$e ee,d@œdCdD„Z0e e e1dœdEdF„ƒZ2edee3e4fedGœdHdI„Z5eedJœdKdL„Z6eedJœdMdN„Z7e8edOœdPdQ„Z9e8edOœdRdS„Z:ee e;eee e;edœdZd[„ƒZ?e e edœd\d]„ƒZ@e edœd^d_„ZAe e edœd`da„ƒZBe e eCdœdbdc„ƒZDe eCdœddde„ZEe e eCdœdfdg„ƒZFd¾ede$efe eeefe e4ddhœdidj„ZGe4eeeHefdGœdkdl„ZIeee eHdmœdndo„ZJeee4fe eHdGœdpdq„ZKe4e eHdrœdsdt„ZLeMeNeefduœdvdw„ZOeMeNeefduœdxdy„ZPeee eHdzœd{d|„ZQeee eHdzœd}d~„ZReee eHe eHdœd€d�„ZSeee eHe eHdœd‚dƒ„ZTeMdduœd„d…„ZUeMdduœd†d‡„ZVeMdduœdˆd‰„ZWeMeduœdŠd‹„ZXeMdduœdŒd�„ZYeMe eeddŽœd�d�„ZZeMe eduœd‘d’„Z[eMee ed“œd”d•„Z\eMee]e^e_fduœd–d—„Z`eaeMeed“œd˜d™„ƒZbeMdduœdšd›„Zce;eedegeeeNedœfffedeeeeNedœffgefdd�œdždŸ„Zee;eefeNeefd œd¡d¢„Zgd¿eMee d¤œd¥d¦„ZhdÀeMee d¤œd§d¨„Zieee fejd©œdªd«„Zkeeeefd¬œd­d®„Zle edœd¯d°„ƒZmedœd±d²„Zne edœd³d´„ƒZoe e eeefdœdµd¶„ƒZpdS)ÁÚ PdfReadera® Initialize a PdfReader object. This operation can take some time, as the PDF stream's cross-reference tables are read into memory. :param stream: 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 bool strict: Determines whether user should be warned of all problems and also causes some correctable problems to be fatal. Defaults to ``False``. :param None/str/bytes password: Decrypt PDF file at initialization. If the password is None, the file will not be decrypted. Defaults to ``None`` FN)ÚstreamÚstrictÚpasswordrBc Cs2||_d|_i|_d|_d|_t|dƒr` instance that can be used to access XMP metadata from the document. or ``None`` if no metadata was found on the document root. TNF)r„r‡rˆÚROOTÚ xmp_metadata)rLrFrFrGrœ�s zPdfReader.xmp_metadatacCstddƒ|jS)zh .. deprecated:: 1.28.0 Use the attribute :py:attr:`xmp_metadata` instead. ÚgetXmpMetadatarœ)rrœ)rLrFrFrGr�œs zPdfReader.getXmpMetadatacCstddƒ|jS)zh .. deprecated:: 1.28.0 Use the attribute :py:attr:`xmp_metadata` instead. Ú xmpMetadatarœ)rrœ)rLrFrFrGrž¥s zPdfReader.xmpMetadatacCs:|jr|jtjddS|jdkr,|jƒt|jƒSdS)zÈ Calculate the number of pages in this PDF file. :return: number of pages :raises PdfReadError: if file is encrypted and restrictions prevent this action. z/Pagesz/CountN)r†r‡rˆr›r}Ú_flattenÚlen)rLrFrFrGÚ_get_num_pages¯s  zPdfReader._get_num_pagescCstddƒ|jƒS)z\ .. deprecated:: 1.28.0 Use :code:`len(reader.pages)` instead. zreader.getNumPageszlen(reader.pages))rr¡)rLrFrFrGÚ getNumPagesÁs zPdfReader.getNumPagescCstddƒ|jƒS)z\ .. deprecated:: 1.28.0 Use :code:`len(reader.pages)` instead. zreader.numPageszlen(reader.pages))rr¡)rLrFrFrGÚnumPagesÊs zPdfReader.numPages)Ú pageNumberrBcCstddƒ|j|ƒS)zd .. deprecated:: 1.28.0 Use :code:`reader.pages[page_number]` instead. zreader.getPage(pageNumber)zreader.pages[page_number])rÚ _get_page)rLr¤rFrFrGÚgetPageÔszPdfReader.getPage)Ú page_numberrBcCs.|jdkr|jƒ|jdk s$tdƒ‚|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: a :class:`PageObject` instance. Nz hint for mypy)r}rŸÚAssertionError)rLr§rFrFrGr¥ßs zPdfReader._get_pagecCstddƒ|jS)z` .. deprecated:: 1.28.0 Use :py:attr:`named_destinations` instead. ÚnamedDestinationsÚnamed_destinations)rrª)rLrFrFrGr©îs zPdfReader.namedDestinationscCs|jƒS)zv A read-only dictionary which maps names to :class:`Destinations` )Ú_get_named_destinations)rLrFrFrGrªøszPdfReader.named_destinations)ÚtreerPÚfileobjrBc CsÚtjƒ}|jtjƒƒ|dkrXi}tt|jtjƒ}t j |krTtt t |t j ƒ}ndS|dkrd|S|j |||ƒx&|D]}||krx|j||||ƒPqxWd|krÖtt|dƒ}x$|D]}|jƒ} |j| |||ƒq¶W|S)a Extract field data if this PDF contains interactive form fields. The *tree* and *retval* parameters are for recursive use. :param fileobj: A file object (usually a text file) to write a report to on all interactive form fields found. :return: A dictionary where each key is a field name, and each value is a :class:`Field` object. By default, the mapping name is used for keys. ``None`` if form data could not be located. Nz/Fields)r#Zattributes_dictr–r r r1r‡rˆr›ÚCDZ ACRO_FORMr r;Ú _check_kidsÚ _build_fieldr-rU) rLr¬rPr­Úfield_attributesÚcatalogÚattrÚfieldsÚfÚfieldrFrFrGÚ get_fieldss*   zPdfReader.get_fieldscCstddƒ|j|||ƒS)zU .. deprecated:: 1.28.0 Use :meth:`get_fields` instead. Ú getFieldsr·)rr·)rLr¬rPr­rFrFrGr¸0s zPdfReader.getFields)r¶rPr­r±rBcCs~|j|||ƒy |d}Wn6tk rPy |d}Wntk rJdSXYnX|rn|j|||ƒ|jdƒt|ƒ||<dS)Nz/TMz/TÚ )r¯ÚKeyErrorÚ _write_fieldÚwriter3)rLr¶rPr­r±rMrFrFrGr°>s    zPdfReader._build_fieldcCs4tj|kr0x$|tjD]}|j|jƒ||ƒqWdS)N)ÚPAÚKIDSr·rU)rLr¬rPr­ÚkidrFrFrGr¯Ss zPdfReader._check_kids)r­r¶r±rBc Cstjƒ}|tjƒ}xü|D]ô}|tjtjfkr0q||}y¾|tjkr~dddddœ}|||krô|j|d|||dƒnv|tjkrÖy||tj}Wn"t k r¼||tj }YnX|j|d|dƒn|j|dt ||ƒdƒWqt k �r YqXqWdS)NZButtonZTextZChoiceÚ Signature)z/Btnz/Txz/Chz/Sigz: r¹) r#Ú attributesr ZKidsZAAZFTr¼ZParentZTMrºÚTrs) rLr­r¶r±Zfield_attributes_tupler³Ú attr_nameÚtypesÚnamerFrFrGr»[s2       "zPdfReader._write_fieldcs&|jƒ‰ˆdkriS‡fdd„ˆDƒS)a6 Retrieve form fields from the document with textual data. The key is the name of the form field, the value is the content of the field. If the document contains multiple form fields with the same name, the second and following will get the suffix _2, _3, ... Ncs6i|].}ˆ|jdƒdkrˆ|jdƒˆ|d“qS)z/FTz/Txz/Vz/T)rN)Ú.0r¶)Ú formfieldsrFrGú Žsz2PdfReader.get_form_text_fields..)r·)rLrF)rÇrGÚget_form_text_fields€s  zPdfReader.get_form_text_fieldscCstddƒ|jƒS)z_ .. deprecated:: 1.28.0 Use :meth:`get_form_text_fields` instead. ÚgetFormTextFieldsrÉ)rrÉ)rLrFrFrGrÊ”s zPdfReader.getFormTextFields)r¬rPrBc Cs†|dkrni}tt|jtjƒ}tj|kr:tt|tjƒ}n4tj|krntt|tjƒ}tj|krntt|tjƒ}|dkrz|St j |kr°xütt |t j ƒD]}|j |j ƒ|ƒq–WnÒtj|k�rDtt|tjƒ}x´tdt|ƒdƒD]`}tt||j ƒƒ}||dj ƒ}t|tƒ�r"d|k�r"|d}|j||ƒ} | dk rÞ| ||<qÞWn>x<|jƒD]0\} } | j ƒ} |j| | ƒ} | dk �rN| || <�qNW|S)z¼ Retrieve the named destinations present in the document. :return: a dictionary which maps names to :class:`Destinations`. Nrérz/D)r r1r‡rˆr›ÚCAZDESTSr;ZNAMESr½r¾r-r«rUÚranger rsrOÚ_build_destinationÚitems) rLr¬rPr²Únamesr¿ÚirMÚvalueÚdestZk__Zv__ÚvalrFrFrGr«�s<         z!PdfReader._get_named_destinationscCstddƒ|j||ƒS)z` .. deprecated:: 1.28.0 Use :py:attr:`named_destinations` instead. ÚgetNamedDestinationsrª)rr«)rLr¬rPrFrFrGrÕÎs zPdfReader.getNamedDestinationscCs|jƒS)z÷ Read-only property for the outline (i.e., a collection of 'outline items' which are also known as 'bookmarks') present in the document. :return: a nested list of :class:`Destinations`. )Ú _get_outline)rLrFrFrGÚoutlineÛszPdfReader.outlinecCstddƒ|jS)zT .. deprecated:: 2.9.0 Use :py:attr:`outline` instead. Úoutlinesr×)rr×)rLrFrFrGrØås zPdfReader.outlines)Únoder×rBcCsä|dkrng}tt|jtjƒ}tj|krdtt|tjƒ}t|tƒrF|S|dk rdd|krdtt|dƒ}|j ƒ|_ |dkrz|Sxd|j |ƒ}|r”|j |ƒd|krÄg}|j tt|dƒ|ƒ|rÄ|j |ƒd|krÎPtt|dƒ}q|W|S)Nz/Firstz/Next)r r1r‡rˆr›ÚCOZOUTLINESrOr7r«Ú _namedDestsÚ_build_outline_itemÚappendrÖ)rLrÙr×r²ÚlinesZ outline_objZ sub_outlinerFrFrGrÖïs2      zPdfReader._get_outlinecCstddƒ|j||ƒS)zU .. deprecated:: 1.28.0 Use :py:attr:`outline` instead. Ú getOutlinesr×)rrÖ)rLrÙr×rFrFrGrßs zPdfReader.getOutlinescCs4tt|jtjƒ}tj|kr,td|tjƒSdSdS)uÍ Read-only property for the list of threads see §8.3.2 from PDF 1.7 spec :return: an Array of Dictionnaries with "/F" and "/I" properties or None if no articles. r-N)r r1r‡rˆr›rÚZTHREADS)rLr²rFrFrGÚthreads#s zPdfReader.threads)Úindirect_referencerBcCsp|jdkr dd„t|jƒDƒ|_|dks2t|tƒr6dSt|tƒrF|}n|j}|jdk s^tdƒ‚|jj|dƒ}|S)zGenerate _page_id2numNcSsi|]\}}||jj“qSrF)ráÚidnum)rÆrÑÚxrFrFrGrÈ6sz:PdfReader._get_page_number_by_indirect..rz hint for mypyéÿÿÿÿrä) r€Ú enumerateÚpagesrOr7Úintrâr¨rN)rLrárâÚretrFrFrGÚ_get_page_number_by_indirect1s  z&PdfReader._get_page_number_by_indirect)ÚpagerBcCs |j|jƒS)a Retrieve page number of a given PageObject :param PageObject page: The page to get page number. Should be an instance of :class:`PageObject` :return: the page number or -1 if page not found )rérá)rLrêrFrFrGÚget_page_numberDszPdfReader.get_page_numbercCstddƒ|j|ƒS)zZ .. deprecated:: 1.28.0 Use :meth:`get_page_number` instead. Ú getPageNumberrë)rrë)rLrêrFrFrGrìNs zPdfReader.getPageNumber)Ú destinationrBcCs |j|jƒS)zË Retrieve page number of a given Destination object. :param Destination destination: The destination to get page number. :return: the page number or -1 if page not found )rérê)rLrírFrFrGÚget_destination_page_numberWsz%PdfReader.get_destination_page_numbercCstddƒ|j|ƒS)zf .. deprecated:: 1.28.0 Use :meth:`get_destination_page_number` instead. ÚgetDestinationPageNumberrî)rrî)rLrírFrFrGrï`sz"PdfReader.getDestinationPageNumber)rVÚarrayrBc CsÞd\}}t|ttfƒs4t|tƒr,t|ƒdks4|dkrNtƒ}tdƒ}t|||ƒS|dd…\}}|dd…}yt|||f|žŽStk rØtd|›d|›�t ƒ|j rª‚|j dj }|dkrÄtƒn|}t||tdƒƒSXdS)Nrz/FitrËzUnknown destination: ú )NN) rOr7rsr-r r:r0r*rrorwrærá)rLrVrðrêÚtypÚtmprárFrFrGrÎms&    zPdfReader._build_destination)rÙrBcCsÄd\}}}ytd|dƒ}Wn,tk rH|jr@td|›�ƒ‚d}YnXd|kr„tt|dƒ}tt|tjƒ}|dkr®|tj}n*d|kr®|d}t |tƒr®d|kr®|d}t |t ƒrÆ|j ||ƒ}n˜t |t ƒ�ry|j ||j |jƒ}Wn"tk �r |j |dƒ}YnXnN|dk�r(|j ||ƒ}n6|j�r@td |›�ƒ‚ntd |›d �tƒ|j |dƒ}|�rÀd |k�rŒt d d„|d Dƒƒ|td ƒ<d|k�r¦|d|tdƒ<d|k�rÀ|d|tdƒ<|S)Nrsz/Titlez(Outline Entry Missing /Title attribute: rez/Az/GoToz/Destz/DzUnexpected destination zRemoved unexpected destination z from destinationz/Ccss|]}t|ƒVqdS)N)r4)rÆÚcrFrFrGú Èsz0PdfReader._build_outline_item..z/Fz/Count)NNN)r rºrwr*r1r6r$ÚSÚDrOr-rÎrsrÛZ dest_arrayrro)rLrÙrÓrVZ outline_itemÚactionZ action_typerFrFrGrÜ‘sP           zPdfReader._build_outline_itemcCst|j|jƒS)zWRead-only property that emulates a list of :py:class:`Page` objects.)rr¡r¥)rLrFrFrGræÓszPdfReader.pagescCs0tt|jtjƒ}tj|kr,tt|tjƒSdS)a Get the page layout. :return: Page layout currently being used. .. 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 N)r r1r‡rˆr›r®Z PAGE_LAYOUTr6)rLr‡rFrFrGÚ page_layoutØs zPdfReader.page_layoutcCstddƒ|jS)zY .. deprecated:: 1.28.0 Use :py:attr:`page_layout` instead. Ú getPageLayoutrù)rrù)rLrFrFrGrúös zPdfReader.getPageLayoutcCstddƒ|jS)zY .. deprecated:: 1.28.0 Use :py:attr:`page_layout` instead. Ú pageLayoutrù)rrù)rLrFrFrGrûÿs zPdfReader.pageLayoutc Cs*y|jtjdStk r$dSXdS)aO Get the page mode. :return: Page mode currently being used. .. 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 z /PageModeN)r‡rˆr›rº)rLrFrFrGÚ page_mode szPdfReader.page_modecCstddƒ|jS)zW .. deprecated:: 1.28.0 Use :py:attr:`page_mode` instead. Ú getPageModerü)rrü)rLrFrFrGrý%s zPdfReader.getPageModecCstddƒ|jS)zW .. deprecated:: 1.28.0 Use :py:attr:`page_mode` instead. ÚpageModerü)rrü)rLrFrFrGrþ.s zPdfReader.pageMode)ræÚinheritrárBc Cs4ttjƒttjƒttjƒttjƒf}|dkr0i}|dkrZ|jtjj ƒ}|dj ƒ}g|_ d}t j |krr|t j }|dkrÜx |D]}||kr€||||<q€Wx’|t j D].}i} t|tƒrÂ|| d<|j|j ƒ|f| Žq¨WnT|dk�r0x(t|jƒƒD]\} } | |krô| || <qôWt||ƒ} | j|ƒ|j j| ƒdS)Nz/Pagesráz/Page)r6ÚPGZ RESOURCESZMEDIABOXZCROPBOXZROTATEr‡rˆr›rUr}r½ZTYPEr¾rOr5rŸÚlistrÏrr–rÝ) rLrærÿráZinheritable_page_attributesr²Útr³rêZaddtZattr_inrÒZpage_objrFrFrGrŸ8s:          zPdfReader._flattenc Csœ|j|j\}}t|d|ƒjƒ}tt|dƒdks6t‚||dksFt‚tt|j ƒƒƒ}�x,t |dƒD�]}t |ƒ|j ddƒt j|ƒ}t |ƒ|j ddƒt j|ƒ}t |ƒ|j ddƒ||jkrÈqf|jrÞ||krÞtdƒ‚|j t|d|ƒdƒt |ƒ|j ddƒyt||ƒ} Wnftk �r~} zHtd|›d |j›d |j›d | ›�tƒ|j�rhtd | ›�ƒ‚tƒ} WYdd} ~ XnX| SW|j�r–td ƒ‚tƒS)Nrz/Typez/ObjStmz/NrzObject is in wrong index.z/FirstzInvalid stream (index z) within object rñz: zCan't read object stream: z%This is a fatal error in strict mode.rärärärä)Ú xref_objStmrâr5rUr rsr¨rrÚget_datarÍrr�r8Zread_from_streamrwr*rçr<r+rÚ generationror7) rLráZstmnumÚidxZobj_stmÚ stream_datarÑZobjnumÚoffsetr—ÚexcrFrFrGÚ_get_object_from_streamfsD       z!PdfReader._get_object_from_stream)ÚnumÚgenrBcCst|||ƒjƒS)zr used to ease development equivalent to generic.IndirectObject(num,gen,self).get_object() )r5rU)rLr r rFrFrGÚ_get_indirect_objectœszPdfReader._get_indirect_objectc CsBt|tƒrt|d|ƒ}|j|j|jƒ}|dk r2|S|jdkrV|j|jkrV|j|ƒ}�nÖ|j|jkor|j|j|jk�r®|j j |jiƒj |jdƒr–t ƒS|j|j|j}|j j |dƒy|j|j ƒ\}}Wnôtk �r¾t|j dƒrøt|j jƒƒ}n2|j jƒ}|j j ddƒ|j jdƒ}|j j |dƒtjd|j›d|j›d�jƒ|ƒ}|dk �r¶td|j›d |j›d �tƒ|jdƒd|j|j|j<|j j |jdƒdƒ|j|j ƒ\}}nd}YnX||jk�r|j�r|j�r>td |j›d |j›d |›d |›d� ƒ‚n:||jk�r>|j�r>td |j›d |j›d |›d |›d� ƒ‚|j�rV||jk�sVt‚t|j |ƒ}|j �r,|j!dk �r,|j!j"ƒ�sŒt#dƒ‚t$t%|ƒ}|j!j&||j|jƒ}�n~t|j dƒ�rÌt|j jƒƒ}n2|j jƒ}|j j ddƒ|j jdƒ}|j j |dƒtjd|j›d|j›d�jƒ|ƒ}|dk �rtd|j›d |j›d�tƒ|j|jk�r`i|j|j<|jdƒd|j|j|j<|j j |j'dƒdƒt(|j ƒ|j j ddƒt|j |ƒ}|j �r,|j!dk �r,|j!j"ƒ�sàt#dƒ‚t$t%|ƒ}|j!j&||j|jƒ}n,td|j›d |j›d�tƒ|j�r,tdƒ‚|j)|j|j|ƒ|S)NrFÚ getbufferrz\sz\s+z\s+objz Object ID ú,z ref repairedzExpected object ID (rñz) does not match actual (z); xref table not zero-indexed.z).zFile has not been decryptedzObject z foundz not defined.zCould not find object.rärärärä)*rOrçr5Úcache_get_indirect_objectrrârr ÚxrefÚxref_free_entryrNr7rvr�Úread_object_headerÚ Exceptionr�Úbytesrr�rƒÚreÚsearchÚencoderroÚstartrrwr*r¨r<r„r…Z is_decryptedr)r r9Zdecrypt_objectÚendrÚcache_indirect_object) rLrárPrrârÚbufÚpÚmrFrFrGrU£s¬            &$           zPdfReader.get_object)ÚindirectReferencerBcCstddƒ|j|ƒS)zU .. deprecated:: 1.28.0 Use :meth:`get_object` instead. Ú getObjectrU)rrU)rLrrFrFrGr %s zPdfReader.getObject)rvrBcCs²d}t|ƒ|t|ƒO}|jddƒt|ƒ}|t|ƒO}|jddƒt|ƒ}|t|ƒO}|jddƒ|jdƒ}t|ƒ|jd dƒ|r¢|jr¢td|›d|›�tƒt |ƒt |ƒfS) NFréz.Superfluous whitespace found in object header rñrärärärä) rrr�rrƒrrwrrorç)rLrvÚextrarârÚ_objrFrFrGr0s$         zPdfReader.read_object_headercCstddƒ|j|ƒS)z] .. deprecated:: 1.28.0 Use :meth:`read_object_header` instead. ÚreadObjectHeaderr)rr)rLrvrFrFrGr$Ls zPdfReader.readObjectHeader)rrârBcCs|jj||fƒS)N)r~rN)rLrrârFrFrGrWsz#PdfReader.cache_get_indirect_objectcCstddƒ|j||ƒS)zd .. deprecated:: 1.28.0 Use :meth:`cache_get_indirect_object` instead. ÚcacheGetIndirectObjectr)rr)rLrrârFrFrGr%\sz PdfReader.cacheGetIndirectObject)rrâr—rBcCsH||f|jkr6d|›d|›�}|jr,t|ƒ‚t|tƒ||j||f<|S)NzOverwriting cache for rñ)r~rwr*rro)rLrrâr—ÚmsgrFrFrGris zPdfReader.cache_indirect_objectcCstddƒ|j|||ƒS)z` .. deprecated:: 1.28.0 Use :meth:`cache_indirect_object` instead. ÚcacheIndirectObjectr)rr)rLrrâr—rFrFrGr'ts zPdfReader.cacheIndirectObjectc Cs4|j|ƒ|j|ƒ|j|ƒ}|j||ƒ}|dkrV|jrD|rDtdƒ‚td|›d�tƒ|j|||ƒ|j op|j �r0|j ƒ}x¦|j j ƒD]˜\}}|dkršqˆt |jƒƒ}xx|D]p}|j||dƒy|j|ƒ\} } Wntk rèPYnX| ||j kr¬|j |||j || <|j ||=q¬WqˆW|j|dƒdS)NrzBroken xref tablezincorrect startxref pointer(ú)iÿÿ)Ú_basic_validationÚ_find_eof_markerÚ_find_startxref_posÚ_get_xref_issuesrwr*rroÚ_read_xref_tables_and_trailersrr�rrÏÚsortedÚkeysr�rÚ ValueError) rLrvÚ startxrefÚ xref_issue_nrr’r Z xref_entryZxref_kÚidÚpidZ_pgenrFrFrGrƒs4       zPdfReader.readcCsl|jdtjƒ|jƒstdƒ‚|jrh|jdtjƒ|jdƒ}|dkrZtd|j dƒ›d�ƒ‚|jdtjƒdS)NrzCannot read an empty fileés%PDF-zPDF starts with 'Úutf8z', but '%PDF-' expected) r�ÚosÚSEEK_ENDr�r(rwÚSEEK_SETrƒr*r‘)rLrvZ header_byterFrFrGr)¥s zPdfReader._basic_validationcCs>d}d}x0|dd…dkr8|jƒ|kr.tdƒ‚t|ƒ}q WdS)NrCr|r5s%%EOFzEOF marker not found)r�r*r)rLrvZlast_mbÚlinerFrFrGr*´s  zPdfReader._find_eof_markerc Cs~t|ƒ}y t|ƒ}WnDtk rX|jdƒs6tdƒ‚t|dd…jƒƒ}tdtƒYn"Xt|ƒ}|dd…dkrztdƒ‚|S)z5Find startxref entry - the location of the xref tables startxrefzstartxref not foundé Nz startxref on same line as offset)rrçr0Ú startswithr*Ústriprro)rLrvr:r1rFrFrGr+¼s  zPdfReader._find_startxref_poscCsð|jdƒ}|dd…dkr"tdƒ‚t|ƒ|jddƒd}�x®ttt||ƒƒ}|rp|dkrp||_|jrpt dt ƒd }t|ƒ|jddƒttt||ƒƒ}t|ƒ|jddƒd}�xü||k�r®|jd ƒ}x&|dd krî|jddƒ|jd ƒ}qÊW|dd k�r |jd dƒy8|dd …j dƒ\}} |dd…} t|ƒt| ƒ} } Wn¼t k �rþt |dƒ�rnt|jƒƒ} n(|jƒ}|jddƒ|jd!ƒ} |j|ƒtj|›d�jƒ| ƒ}|dk�rÒt d|›d�t ƒd} d"} n(t d|›d�t ƒt|jdƒƒ} |jƒ} YnX| |jk�r i|j| <i|j| <||j| k�r2nj| |j| |<y| dk|j| |<Wnt k �rlYnXy| dk|jd|<Wnt k �ršYnX|d7}|d7}q´Wt|ƒ|jd#dƒ|jdƒ}|dk�ræ|jd$dƒq>Pq>WdS)%Nér!srefzxref table read errorrTrzFXref table not zero-indexed. ID numbers for objects will be corrected.Fés s 0123456789téó éérz\s+(\d+)\s+objzentry z( in Xref table invalid; object not foundiÿÿz' in Xref table invalid but object foundóféstrailerräräräiìÿÿÿiíÿÿÿräräräräräiùÿÿÿ)rƒr*rr�r rçr<rrwrroÚsplitrr�rrr�rrrÚgrouprrr)rLrvÚrefZ firsttimer rAZcntr:Zoffset_bZ generation_bZ entry_type_brrrrrµZ trailertagrFrFrGÚ_read_standard_xref_tableÍs’                       z#PdfReader._read_standard_xref_table)rvr1r2rBc CsÆi|_i|_i|_tƒ|_�x¤|dk �rÀ|j|dƒ|jdƒ}|dkrP|jdƒ}|dkrd|j|ƒ}q|r”y|j|ƒPWnt k r�d}YnXq|j ƒ�r²y|j |ƒ}WnVt k �r}z8t j |jkrâtd|j›�tƒPntd|j›�ƒ‚WYdd}~XnXt j t jt jt jf}x8|D]0}||k�r||jk�r|j|ƒ|jt|ƒ<�qWd|k�r”|jƒ} |jtt|dƒddƒ|j |ƒ|j| dƒd|k�r®tt|dƒ}nPq|j||ƒ}qWdS) Nrrs óxz!Previous trailer can not be read ztrailer can not be read z/XRefStmz/Prev)rrrr1r‡r�rƒÚ _read_xrefÚ_rebuild_xref_tablerÚisdigitÚ_read_pdf15_xref_streamrˆr›rÚargsror*r‹r”r‰Zraw_getr6r�r rçÚ_read_xref_other_error) rLrvr1r2rãÚ xrefstreamÚeZ trailer_keysrMrrFrFrGr-:sP         "     z(PdfReader._read_xref_tables_and_trailersc Csì|j|ƒt|ƒ|jddƒttttft||ƒƒ}x(|jƒD]\}}||j kr@||j |<q@Wd|krÐ|j ƒ}|jtt |dƒddƒy|j |ƒWn*t k rÂtd|d›d�tƒYnX|j|dƒd|krä|d}|SdSdS)Nrz/XRefStmrzXRef object at z, can not be read, some object may be missingz/Prevrä)rIrr�r rrsrr<rÏr‡r�rçrNrrro)rLrvÚ new_trailerrMrÒrr1rFrFrGrKks*     zPdfReader._read_xref)rvr1rBc Csè|dkr$|jrtdƒ‚tdtƒdS|jddƒ|jdƒ}|jdƒ}|dkr\|d|8}|S|j|dƒx*td ƒD]}|jdƒjƒrr||7}|SqrWd |j krÜ|j rÜtd tƒy|j |ƒdSt k rÚtd ƒ‚YnXtd ƒ‚dS)Nrz6/Prev=0 in the trailer (try opening with strict=False)zA/Prev=0 in the trailer - assuming there is no previous xref tableé rr?sxrefé r5z/Rootz"Invalid parent xref., rebuild xrefzcan not rebuild xrefz/Could not find xref table at specified locationiõÿÿÿrä) rwr*rror�rƒÚfindrÍrMr‡rLr)rLrvr1róZxref_locÚlookrFrFrGrP„s6       z PdfReader._read_xref_other_errorcs|jddƒˆj|ƒ\}}ttt|ˆƒƒ}tt|dƒdks@t‚ˆj|||ƒtt |j ƒƒƒ‰|j dd|j dƒgƒ}tt t t f|j dƒƒ‰tˆƒdksœt‚ˆjr¼tˆƒdkr¼td ˆ›�ƒ‚tttttd ffd œ‡‡fd d „ }tttttd fftdœ‡fdd„ }ˆj|||ƒ|S)Nrz/Typez/XRefz/Indexrz/Sizez/Wr!zToo many entry sizes: .)rÑrBcs<ˆ|dkr(ˆjˆ|ƒ}t|ˆ|ƒS|dkr4dSdSdS)Nrr)rƒrH)rÑr@)Ú entry_sizesrrFrGÚ get_entry¿s  z4PdfReader._read_pdf15_xref_stream..get_entry)r rrBcs|ˆjj|gƒkp|ˆjkS)N)rrNr)r r)rLrFrGÚ used_beforeÍsz6PdfReader._read_pdf15_xref_stream..used_beforerä)r�rr r.r<rsr¨rrrrrNrrr rwr*rçr r ÚboolÚ_read_xref_subsections)rLrvrârrQÚ idx_pairsrYrZrF)rXrLrrGrN­s &&z!PdfReader._read_pdf15_xref_streamcCs‚|j|ddƒ|jdƒ}|dkr&dS|jdƒ}|dkr~d}x"|dkr^|jdƒ}|dkr>dSq>W||jdƒ7}|jƒd kr~d SdS) zBReturn an int which indicates an issue. 0 means there is no issue.rrs r>sxrefr|s 0123456789 rËsobjr!)r�rƒÚlower)rvr1r:rFrFrGr,Õs     zPdfReader._get_xref_issuesc Csêi|_|jddƒ|jdƒ}xXtjd|ƒD]H}t|jdƒƒ}t|jdƒƒ}||jkr^i|j|<|jdƒ|j||<q*W|jddƒxbtjd|ƒD]R}|j|jdƒdƒtt t t ft ||ƒƒ}x"t |j ƒƒD]\}}||j|<qÌWq�WdS)Nrrs([\r\n \t][ \t]*(\d+)[ \t]+(\d+)[ \t]+objrËs$[\r\n \t][ \t]*trailer[\r\n \t]*(<<)rä)rr�rƒrÚfinditerrçrGrr rrr<rrÏr‡) rLrvZf_rrârrSrMrÒrFrFrGrLîs     zPdfReader._rebuild_xref_table.)r]rYrZrBcCsþd}xô|j|ƒD]æ\}}||ks$t‚||}xÈt|||ƒD]¶}|dƒ}|dkrb|dƒ} |dƒ} q<|dkr¨|dƒ} |dƒ} | |jkrŽi|j| <||| ƒsò| |j| |<q<|dkrÞ|dƒ} |dƒ}d} ||| ƒsò| |f|j|<q<|jrd}x4||||dfV|d7}|dt|ƒkrPqWdS)NrrrË)r )rLrðrÑrFrFrGr`&s zPdfReader._pairsr)rvÚ limit_offsetrBcCsðtddd�g}xÌ|jƒdks*|jƒ|kr2tdƒ‚|jdƒ}|jƒdkrPtdƒ‚|jddƒ|dkrÐd }xN|dkr¶|jdƒ}|dkr”|jddƒd }|jƒdkr¨tdƒ‚|jddƒqjW|j|rÄdnddƒPq|j|ƒqW|jƒd j|ƒS)z.. deprecated:: 2.1.0Úread_next_end_linez4.0.0)Z removed_inrz!Could not read malformed PDF filerrËzEOL marker not foundó ó FTr|éþÿÿÿ)rcrd)rcrd)rcrdräre)rr�r*rƒr�rÝÚreverseÚjoin)rLrvraZ line_partsrãZcrlfrFrFrGrb.s2        zPdfReader.read_next_end_linecCstdƒ|j||ƒS)z.. deprecated:: 1.28.0ÚreadNextEndLine)rrb)rLrvrarFrFrGrhOszPdfReader.readNextEndLine)rxrBcCs|jstdƒ‚|jj|ƒS)ag When using an encrypted / secured PDF file with the PDF Standard encryption handler, this function will allow the file to be decrypted. It checks the given password against the document's user password and owner password, and then stores the resulting decryption key if either password is correct. It does not matter which password was matched. Both passwords provide the correct decryption key that will allow the document to be used with this library. :param str password: The password to match. :return: `PasswordType`. zNot encrypted file)r…r*rŒ)rLrxrFrFrGÚdecryptVszPdfReader.decrypt)Úpermissions_coderBcCsˆi}|d@dk|d<|d@dk|d<|d@dk|d<|d@dk|d <|d@dk|d <|d@dk|d<|d @dk|d<|d"@dk|d<|S)#Nrr!rÚprintr>Úmodifyr5ÚcopyéÚ annotationsr;ZformsrUZ accessabilityrTZassembleé Zprint_high_qualityrËr>r!rCr>r@r5é rCér;irUirTirF)rLrjÚ permissionsrFrFrGÚdecode_permissionsjszPdfReader.decode_permissionscCs tj|jkS)zè Read-only boolean property showing whether this PDF file is encrypted. Note that this property, if true, will remain true even after the :meth:`decrypt()` method is called. )rˆr‹r‡)rLrFrFrGr†yszPdfReader.is_encryptedcCstddƒ|jS)zZ .. deprecated:: 1.28.0 Use :py:attr:`is_encrypted` instead. ÚgetIsEncryptedr†)rr†)rLrFrFrGru‚s zPdfReader.getIsEncryptedcCstddƒ|jS)zZ .. deprecated:: 1.28.0 Use :py:attr:`is_encrypted` instead. Ú isEncryptedr†)rr†)rLrFrFrGrv‹s zPdfReader.isEncryptedc Cs®d}i}tt|jtjƒ}d|ks,|d r0dStt|dƒ}d|krªtt|dƒ}t|ƒ}xL|D]D}|}t|ƒ}t |t ƒrbtt t |j ƒƒ}|rbtj|jƒ} | ||<qbW|S)Nz /AcroFormz/XFA)r r1r‡rˆr›r;r-ÚiterÚnextrOr5r r2rUÚzlibÚ decompressÚ_data) rLr¬rPr²r´rÑrµÚtagr¶ÚesrFrFrGÚxfa•s$    z PdfReader.xfa)FN)NNN)NNN)NN)NN)NN)NN)NNN)r)r)qrorprqrrr rrr[rsrrKrtr“r rJr˜r™ršr?rœr�ržrçr¡r¢r£rr¦r¥rrr©rªr;r·r¸r1r°r¯r»rÉrÊr«rÕr=r×rØrÖrßr-ràr7r5rérërìr0rîrïr r8rÎrÜrærùrúrûr>rürýrþrŸr9r r rUr rr rr$rr%rr'rƒr)r*r+rIr-rKrPr.r2r/rNÚ staticmethodr,rLrr\rr`rbrhrrirtr†rurvr~rFrFrFrGrus/          *  % /   (     B    "*4      &n /(&    rucs&eZdZeeddœ‡fdd„ Z‡ZS)Ú PdfFileReaderN)rOÚkwargsrBcs8tddƒd|kr&t|ƒdkr&d|d<tƒj||ŽdS)Nr€rurwrËT)rr ÚsuperrK)rLrOr�)Ú __class__rFrGrK¯s zPdfFileReader.__init__)rorprqrrKÚ __classcell__rFrF)rƒrGr€®sr€)Zr7rrDryrÚiorZpathlibrÚtypingrrrrr r r r r r…rrZ_pagerrÚ_utilsrrrrrrrrrrrÚ constantsrrÌrr®r r!rÚr"rSr#r$r%rr&r½r'rˆÚerrorsr(r)r*r+r,Zgenericr-r.r/r0r1r2r3r4r5r6r7r8r9r:r;r<rÄr=r>Úxmpr?rrçrHrIrJrur€rFrFrFrGÚsV   , 4        H " !&