Ошибка Unicode-объектов должна быть закодирована перед хэшированием - PullRequest
0 голосов
/ 18 апреля 2019

Я хотел бы создать ToC с гиперссылками на другой скрипт и хотел бы понять, как он работает, но я не могу заставить его работать с этим примером, который я нашел.Не могли бы вы помочь мне?Я просто получаю сообщение об ошибке:

Unicode-объекты должны быть закодированы перед хэшированием

Это весь пример: https://www.reportlab.com/snippets/13/

#this function makes our headings
def doHeading(text,sty):
    from hashlib import sha1
    #create bookmarkname
    bn=sha1(text+sty.name).hexdigest()
    #modify paragraph text to include an anchor point with name bn
    h=Paragraph(text+'<a name="%s"/>' % bn,sty)
    #store the bookmark name on the flowable so afterFlowable can see this
    h._bookmarkName=bn
    story.append(h)

story.append(Paragraph('<b>Table of contents</b>', centered))
story.append(PageBreak())
doHeading('First heading', h1)
story.append(Paragraph('Text in first heading', PS('body')))
doHeading('First sub heading', h2)
story.append(Paragraph('Text in first sub heading', PS('body')))
story.append(PageBreak())
doHeading('Second sub heading', h2)
story.append(Paragraph('Text in second sub heading', PS('body')))
story.append(PageBreak())
doHeading('Last heading', h1)
story.append(Paragraph('Text in last heading', PS('body')))
doc = MyDocTemplate('mintoc.pdf')
doc.multiBuild(story)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-138d578aa6aa> in <module>
     83 story.append(Paragraph('<b>Table of contents</b>', centered))
     84 story.append(PageBreak())
---> 85 doHeading('First heading', h1)
     86 story.append(Paragraph('Text in first heading', PS('body')))
     87 doHeading('First sub heading', h2)

<ipython-input-16-138d578aa6aa> in doHeading(text, sty)
     74     from hashlib import sha1
     75     #create bookmarkname
---> 76     bn=sha1(text+sty.name).hexdigest()
     77     #modify paragraph text to include an anchor point with name bn
     78     h=Paragraph(text+'<a name="%s"/>' % bn,sty)

TypeError: Unicode-objects must be encoded before hashing

1 Ответ

1 голос
/ 18 апреля 2019

Пример кода для Python 2. Я могу воспроизвести эту ошибку с Python 3. Для справки, полный возврат:

Traceback (most recent call last):
  File "example.py", line 85, in <module>
    doHeading('First heading', h1)
  File "example.py", line 76, in doHeading
    bn=sha1(text+sty.name).hexdigest()
TypeError: Unicode-objects must be encoded before hashing

Причина в том, что метод sha1() ожидает байты, а не строку. Python 2 менее строг с обработкой строк, поэтому он не дает исключения.

Таким образом, у вас есть два варианта: либо использовать Python 2 (что не рекомендуется для нового кода), либо вы можете обновить код для работы с Python 3. Я мог бы получить этот конкретный пример, работающий с двумя незначительными изменениями:

В строке 76 заменить

bn=sha1(text+sty.name).hexdigest()

от

bn=sha1((text+sty.name).encode('ascii')).hexdigest()

В строке 11 используется apply(), что устарело с Python 2.3. Для обновления замените

apply(BaseDocTemplate.__init__, (self, filename), kw)

от

BaseDocTemplate.__init__(*(self, filename), **kw)

Обратите внимание, что пример с этими модификациями прекрасно работает в Python 2 и 3 (протестирован с 2.7 и 3.6).

...