B ]`*@sddlZddlZddlZddlZddlZddlZddlZddlZddlm Z yddl m Z Wne k rvej Z YnXe rddZ nddZ dd Z d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3)Zd4d5ZGd6d7d7eZd8d9ZGd:d;d;edgZGd?d@d@eZGdAdBdBZGdCdDdDZGdEdFdFeZGdGdHdHe ZGdIdJdJZGdKdLdLZdMdNZGdOdPdPZdS)QN)py3)UserDictcCs |dS)Nzus-ascii)encode)sr//tmp/pip-build-ktz6qwqq/Pillow/PIL/PdfParser.py make_bytessr cCs|S)Nr)rrrrr scCstj|dS)N utf_16_be)codecs BOM_UTF16_BEr)rrrr encode_text sr u˘uˇuˆu˙u˝u˛u˚u˜u•u†u‡u…u—u–uƒu⁄u‹u›u−u‰u„u“u”u‘u’u‚u™ufiufluŁuŒuŠuŸuŽuıułuœušužu€))cCs`|dttjtjkr0|ttjddStrHddd|DSddd|DSdS)Nr css|]}t|t|VqdS)N)PDFDocEncodinggetchr).0byterrr Uszdecode_text..css|]}tt||VqdS)N)r9r:ord)r<r=rrrr>Ws)lenr r decoderjoin)brrr decode_textQs rDc@seZdZdZdS)PdfFormatErrorz\An error that probably indicates a syntactic or semantic error in the PDF file structureN)__name__ __module__ __qualname____doc__rrrrrEZsrEcCs|s t|dS)N)rE) condition error_messagerrrcheck_format_conditionasrLc@s4eZdZddZddZddZddZd d Zd S) IndirectReferencecCsd|S)Nz%s %s Rr)selfrrr__str__iszIndirectReference.__str__cCs|dS)Nzus-ascii)rOr)rNrrr __bytes__lszIndirectReference.__bytes__cCs$|j|jko"|j|jko"|j|jkS)N) __class__ object_id generation)rNotherrrr__eq__os  zIndirectReference.__eq__cCs ||k S)Nr)rNrTrrr__ne__vszIndirectReference.__ne__cCst|j|jfS)N)hashrRrS)rNrrr__hash__yszIndirectReference.__hash__N)rFrGrHrOrPrUrVrXrrrrrMfs rMZIndirectReferenceTuplerRrSc@seZdZddZdS)IndirectObjectDefcCsd|S)Nz %s %s objr)rNrrrrO~szIndirectObjectDef.__str__N)rFrGrHrOrrrrrY}srYc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS) XrefTablecCs i|_i|_ddi|_d|_dS)NriF)existing_entries new_entriesdeleted_entriesreading_finished)rNrrr__init__s zXrefTable.__init__cCs2|jr||j|<n ||j|<||jkr.|j|=dS)N)r^r\r[r])rNkeyvaluerrr __setitem__s    zXrefTable.__setitem__cCs*y |j|Stk r$|j|SXdS)N)r\KeyErrorr[)rNr`rrr __getitem__s zXrefTable.__getitem__cCs||jkr0|j|dd}|j|=||j|<nR||jkrX|j|dd}||j|<n*||jkrn|j|}ntdt|ddS)Nrz object ID z+ cannot be deleted because it doesn't exist)r\r]r[ IndexErrorstr)rNr`rSrrr __delitem__s      zXrefTable.__delitem__cCs||jkp||jkS)N)r[r\)rNr`rrr __contains__szXrefTable.__contains__cCs.tt|jt|jBt|jBS)N)r@setr[keysr\r])rNrrr__len__szXrefTable.__len__cCs*t|jt|jt|jBS)N)rir[rjr]r\)rNrrrrjszXrefTable.keysc Cs`tt|jt|jB}tt|j}|}|dx|rZd}xPt|D]<\}}|dksx|d|kr~|}q\|d|}||d}Pq\W|}d}|td|dt |fx|D]} | |jkr|td|j| q| d} t | | kd| | fy |d} Wnt k r6d} YnX|td| |j| fqWqHW|S)Nsxref rz%d %d rz%010d %05d n z>expected the next deleted object ID to be %s, instead found %sz%010d %05d f ) sortedrir\rjr]tellwrite enumerater r@poprLre) rNfrjZ deleted_keysZ startxrefprevindexr`Zcontiguous_keysrRZthis_deleted_object_idZnext_in_linked_listrrrrns@           zXrefTable.writeN) rFrGrHr_rbrdrgrhrkrjrnrrrrrZsrZc@sleZdZddZddZddZddZd d Zed d Z e e d de dddDZ ddZ e ZdS)PdfNamecCs6t|tr|j|_nt|tr&||_n |d|_dS)Nzus-ascii) isinstancertnamebytesr)rNrvrrrr_s    zPdfName.__init__cCs |jdS)Nzus-ascii)rvrA)rNrrr name_as_strszPdfName.name_as_strcCs t|tr|j|jkp||jkS)N)rurtrv)rNrTrrrrUszPdfName.__eq__cCs t|jS)N)rWrv)rNrrrrXszPdfName.__hash__cCsdt|jS)Nz PdfName(%s))reprrv)rNrrr__repr__szPdfName.__repr__cCs|t|S)N) PdfParserinterpret_name)clsdatarrrfrom_pdf_streamszPdfName.from_pdf_stream!ccs|]}t|VqdS)N)r?)r<crrrr>szPdfName.z #%/()<>[]{}cCsztd}xh|jD]^}trB||jkr.||qn|td|qt||jkr\||q|dt|qWt|S)N/z#%02Xs#%02X) bytearrayrvr allowed_charsappendextendr r?rw)rNresultrCrrrrPs    zPdfName.__bytes__N)rFrGrHr_rxrUrXrz classmethodrrirangerrPrOrrrrrts  rtc@seZdZddZeZdS)PdfArraycCsdddd|DdS)Ns[  css|]}t|VqdS)N)pdf_repr)r<xrrrr>sz%PdfArray.__bytes__..s ])rB)rNrrrrPszPdfArray.__bytes__N)rFrGrHrPrOrrrrrsrc@s,eZdZddZddZddZes(eZdS)PdfDictcCs@|dkr.ttdr"t|||q<||j|<n|||d<dS)Nr~ __setattr__zus-ascii)hasattrrr__dict__r)rNr`rarrrrs   zPdfDict.__setattr__cCsy||d}Wntk r.t|YnXt|trBt|}|dr|drd|dd}d}t|dkr|d}t |ddd }t|d kr|t |d d 7}d dt|d}t |dt|d|}|d kr|d 9}|dkr|d9}t t ||}|S)Nzus-asciiDatezD:Z<z %Y%m%d%H%M%S)+-r)rrcAttributeErrorrurwrDendswith startswithr@inttimestrptimegmtimecalendartimegm)rNr`raZ relationshipoffsetformatrrr __getattr__s.        zPdfDict.__getattr__cCsrtd}xV|D]J\}}|dkr$qt|}|d|tt||d||qW|dt|S)Ns<< rs >>)ritemsrrrwrt)rNoutr`rarrrrP:s   zPdfDict.__bytes__N)rFrGrHrrrPrrOrrrrrs   rc@s*eZdZddZerddZnddZdS) PdfBinarycCs ||_dS)N)r~)rNr~rrrr_LszPdfBinary.__init__cCstdddd|jDS)Nz<%s>r8css|]}d|VqdS)z%02XNr)r<rCrrrr>Rsz&PdfBinary.__bytes__..)r rBr~)rNrrrrPQszPdfBinary.__bytes__cCsdddd|jDS)Nz<%s>r8css|]}dt|VqdS)z%02XN)r?)r<rCrrrr>Wsz$PdfBinary.__str__..)rBr~)rNrrrrOVszPdfBinary.__str__N)rFrGrHr_rrPrOrrrrrKs rc@seZdZddZddZdS) PdfStreamcCs||_||_dS)N) dictionarybuf)rNrrrrrr_[szPdfStream.__init__cCsy |jj}Wntk r"|jSX|dkrjy |jj}Wntk rT|jj}YnXtj|jt|dSt dt |jjdS)Ns FlateDecode)bufsizez$stream filter %s unknown/unsupported) rFilterrrZDLLengthzlib decompressrNotImplementedErrorry)rNfilterZexpected_lengthrrrrA_s  zPdfStream.decodeN)rFrGrHr_rArrrrrZsrcCs|dkr dS|dkrdS|dkr$dSt|ttttfr>t|St|trVt|dSt|t j r|dt d|dd St|t rtt|St|t rtt|Strt|tstst|trtt|St|tr |d d }|d d }|d d}d |d St|SdS)NTstrueFsfalsesnullzus-asciis(D:z %Y%m%d%H%M%SZ)\s\\(s\(s\))rurtrrrrwrrfrr struct_timestrftimedictlistrunicoderr replace)rrrrrps2            rc @seZdZdZdqddZddZd d Zd d Zd dZddZ ddZ ddZ ddZ ddZ ddZdrddZddZdd Zd!d"Zed#d$Zd%d&Zdsd'd(Zd)Zd*Zd+Zd,Zed-Zed.Zd/ZeeeZe ed0ed1ed2ed3ed4ed5ej!Z"e ed0ed6ed2ed3ed4eej!Z#d7d8Z$d9d:Z%e eZ&e ed;ed<Z'e ed=Z(e ed>eZ)e*d?d@Z+e dAZ,e*dtdCdDZ-e edEed<Z.e edFed<Z/e edGed<Z0e edHed<Z1e edIed<Z2e edJZ3e edKZ4e edLedMZ5e edNZ6e edOedOedPed<Z7e edOedOedQed<Z8e edRed<Z9e dSedTedUZ:e edVZ;e edWed<Zd\d]d^d_d`dadbdcdddedSdSd{}/%]s$[][()<>{}/%\000\011\012\014\015\040]s[\000\011\012\014\015\040]s#[\000\011\012\014\015\0400-9a-fA-F]*+s[\r\n]+strailers \<\<(.*\>\>)s startxrefs([0-9]+)s%%EOF$s \<\<(.*?\>\>)cCst|jd}||jkr|j}|j|j|}t|d|}x$|r`|}|j|j|d}q>W|sj|}|d}t|d|_ | ||_ t |_ |j|j dd|j kr||j ddS)Ni@ztrailer end not foundrr)xref_section_offsetsPrev)r@rrre_trailer_endsearchrLstartgrouprrinterpret_trailerrrZrread_xref_tableread_prev_trailer)rNZsearch_start_offsetmZ last_match trailer_datarrrrs$     zPdfParser.read_trailercCsv|j|d}|j|j||d}t|d|d}tt|d|kd||}d|krr||ddS)N)ri@zprevious trailer not foundrrzGxref section offset in previous trailer doesn't match what was expectedsPrev) rre_trailer_prevr rrLr rr r)rNrZtrailer_offsetrrrrrrrs    zPdfParser.read_prev_trailers/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=rs\<\\>cCsi}d}x||j||}|sV|j||}t|o>|t|kdt||dP||d}| ||\}}|||<q Wtd|kot |dt dtd|kot |dt d|S)Nrz+name not found in trailer, remaining data: rsSizez&/Size not in trailer or not an integersRootz1/Root not in trailer or not an indirect reference) re_namematch re_dict_endrLendr@ryr|r  get_valuerurrM)r}rtrailerrrr`rarrrr s* zPdfParser.interpret_trailers([^#]*)(#([0-9a-fA-F]{2}))?FcCsrd}xR|j|D]B}|drF||dt|dd7}q||d7}qW|rf|dSt|SdS)Nrrzus-asciizutf-8)re_hashes_in_namefinditerr rfromhexrArw)r}rawZas_textrvrrrrr|s & zPdfParser.interpret_namesnull(?=strue(?=sfalse(?=s([-+]?[0-9]+)(?=s)([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=s\[]s\<(s*)\>s\(s ([-+]?[0-9]+)sR(?=sobj(?=s endobj(?=rs %[^\r\n]*s)*s stream\r?\ns endstream(?=rc Cs|dkr dS|j||}|r&|}|j||}|rtt|ddkdtt|ddkdt|dkp|tt|dt|dkd|j|||dd\}}|dkr|dfS|j ||}t|d ||fSt| d |j ||}|r^tt|ddkd tt|ddkd tt|dt|d|fS|j ||}|r|}i}|j ||}xv|s|j|||dd\}}|dkr|dfS|j|||dd\} }| ||<|dkr|dfS|j ||}qW|}|j ||}|ryt|d } Wn0tttfk r`td|d dYnX|||| } |j||| }t|d|}tt|| }nt|}||fS|j||}|rL|}g}|j||}xN|s>|j|||dd\} }|| |dkr,|dfS|j||}qW||fS|j||}|rld|fS|j||}|rd|fS|j||}|rd|fS|j||}|rt||d|fS|j||}|rt|d|fS|j ||}|r0t!|d|fS|j"||}|rt#dd|dD} t$| ddkr|| t%dt#&| 'd|fS|j(||}|r|)||Stdt*|||ddS)Nr)NNrzsz'PdfParser.get_value..0zus-asciizunrecognized object: )+ re_commentrrre_indirect_def_startrLrr rMrre_indirect_def_endre_indirect_reference re_dict_startrre_stream_start TypeErrorrcrrEr: re_stream_endrrre_array_start re_array_endrre_nullre_truere_falserrtr|re_intre_realfloat re_string_hexrr@r?rrA re_string_litget_literal_stringry) r}r~rexpect_indirectrrobjectrr`raZ stream_lenZ stream_dataZ hex_stringrrrr s   &         zPdfParser.get_valuesF(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))nrr t bf rcCsd}t}x|j||D]}|||||drZ||j|ddn|dr|t|ddddnt|drnh|dr|dnR|dr|d |d7}n4|d r|dkrt || fS|d |d8}| }qWt d dS) Nrrrrrrrzunfinished literal string) rre_lit_str_tokenrrr r  escaped_charsrrrwrrE)r}r~rZ nesting_depthrrrrrr5s,            zPdfParser.get_literal_stringsxrefs+([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)c Csd}|j|j||j}t|d|}x|j|j|}|sNt|dPd}|}t|d}t|d}xt |||D]}|j |j|}t|d|}|dd k}t|d} |st|d| f} t||j kp|j || kd | |j |<qWq.W|S) NFzxref section start not foundzxref subsection start not foundTrrzxref entry not foundrr?z)xref entry duplicated (and not identical)) re_xref_section_startrrrrLrre_xref_subsection_startrr r re_xref_entryr) rNrZsubsection_foundrrZ first_object num_objectsrZis_freerSZ new_entryrrrrs8  zPdfParser.read_xref_tablecCsh|j|d\}}t||dkd|d|d||f|j|j||jt||dd}||j|<|S)Nrrzgexpected to find generation %s for object ID %s in xref table, instead found generation %s at offset %s)r6r)rrLrrrrMr)rNrrrrSrarrrrs  zPdfParser.read_indirectcCsn|dkr|j}t|ddkdg}xD|dD]8}||}|ddkrT||q.||j|dq.W|S)NsTypesPagesz%/Type of page tree node is not /PagessKidssPage)node)rrLrrrr)rNrKrZkidZ kid_objectrrrrs   zPdfParser.linearize_page_tree)NNNrr)N)N)F)Nr)r)N)HrFrGrHrIr_rrrrrrrrrrrrrr staticmethodrrr delimiterZdelimiter_or_ws whitespaceZwhitespace_or_hexZwhitespace_optionalZwhitespace_mandatoryZ newline_onlynewlinerecompileDOTALLr rrrZre_whitespace_optionalrr'rrr rr|r-r.r/r0r1r+r,r3r4r&r$r%r#r(r*rrEr?rFr5rGrHrIrrrrrrrr{s %      . *    "" y   ! r{)rr collectionsrrrPrrZ_utilrr ImportErrorr r r9rDrrErL namedtuplerMrYrZrtrrrrrrr{rrrrs     ]/6