如何更正 TypeError:Unicode 对象必须在使用 ReportLab 散列之前进行编码

Posted

技术标签:

【中文标题】如何更正 TypeError:Unicode 对象必须在使用 ReportLab 散列之前进行编码【英文标题】:How to correct TypeError: Unicode-objects must be encoded before hashing with ReportLab 【发布时间】:2020-06-11 09:32:09 【问题描述】:

最近,我一直在工作ReportLab。目前,我想使用ReportLab 在 PDF 中生成可点击的目录。

当我尝试查看它的工作原理时,我不断收到此错误:TypeError: Unicode-objects must be encoded before hashing

当我尝试使用 ReportLab 库在 Python 3.7.4 上执行此代码时:

class MyDocTemplate(BaseDocTemplate):
    def __init__(self, filename, **kw):
        self.allowSplitting = 0
        apply(BaseDocTemplate.__init__, (self, filename), kw)
        template = PageTemplate('normal', [Frame(2.5*cm, 2.5*cm, 15*cm, 25*cm, id='F1')])
        self.addPageTemplates(template)


    def afterFlowable(self, flowable):
        "Registers TOC entries."
        if flowable.__class__.__name__ == 'Paragraph':
            text = flowable.getPlainText()
            style = flowable.style.name
            if style == 'Heading1':
                level = 0
            elif style == 'Heading2':
                level = 1
            else:
                return
            E = [level, text, self.page]
            #if we have a bookmark name append that to our notify data
            bn = getattr(flowable,'_bookmarkName',None)
            if bn is not None: E.append(bn)
            self.notify('TOCEntry', tuple(E))

centered = PS(name = 'centered',
    fontSize = 30,
    leading = 16,
    alignment = 1,
    spaceAfter = 20)

h1 = PS(
    name = 'Heading1',
    fontSize = 14,
    leading = 16)


h2 = PS(name = 'Heading2',
    fontSize = 12,
    leading = 14)


# Build story.
story = []

toc = TableOfContents()
toc.levelStyles = [
    PS(fontName='Times-Bold', fontSize=20, name='TOCHeading1', leftIndent=20, firstLineIndent=-20, spaceBefore=10, leading=16),
    PS(fontSize=18, name='TOCHeading2', leftIndent=40, firstLineIndent=-20, spaceBefore=5, leading=12),
]
story.append(toc)

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)

我尝试解决此问题,但无法正确解决此问题。感谢您在这方面的帮助。

【问题讨论】:

【参考方案1】:

你应该传递字节,而不是字符串,所以问题就在这里:

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

你可以做的就是改变它:

bn=sha1((text+sty.name).encode("utf8")).hexdigest()

另外,你真的应该把你的 sha1 导入到文件的顶部,不需要每次运行函数时都调用它

【讨论】:

它给出了同样的错误'TypeError: Unicode-objects must be encrypted before hashing' 它在哪里给你这个错误?请将堆栈跟踪添加到问题中 72 def doHeading(text,sty): 73 #create bookmarkname ---> 74 bn=sha1(text+sty.name).encode("utf8").hexdigest() 75 #modify段落文本包含名称为 bn 76 h=Paragraph(text+'' % bn,sty) 的锚点 TypeError: Unicode-objects must be encrypted before hashing bn=sha1(text+sty.name).encode("utf8").hexdigest() 错了!仔细看看我的建议,你在错误的地方得到了()。应该是bn=sha1((text+sty.name).encode("utf8")).hexdigest()

以上是关于如何更正 TypeError:Unicode 对象必须在使用 ReportLab 散列之前进行编码的主要内容,如果未能解决你的问题,请参考以下文章

如何更正错误未捕获的 typeError 验证器未定义并防止我的表单在错误时发布

Python多处理:TypeError:预期的字符串或Unicode对象,找到NoneType

PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象

Spark TypeError:LongType 不能接受类型 <type 'unicode'> 中的对象 u'Value'

TypeError:强制转换为 Unicode:需要字符串或缓冲区,找到字典 [关闭]

烧瓶登录:TypeError:不支持解码Unicode