Reportlab не обрабатывает & и ‹

Я использую Django и Reportlab для создания файлов PDF. Иногда пользователь будет использовать символ, который Reportlab определяет как недопустимый, и я получаю следующее:

ValueError: ошибка синтаксического анализатора xml (подделка ‹ или &) в абзаце...

Есть ли способ избежать этого, кроме ограничения ввода пользователем?

Вот урезанная версия кода:

def generate_report(request, obj_id):

    obj = Model.objects.get(pk=obj_id)
    width, height = letter
    styles = getSampleStyleSheet()

    doc = SimpleDocTemplate(settings.MEDIA_ROOT + "/pdf/" + str(obj.id) + ".pdf", pagesize=letter,rightMargin=72,leftMargin=72,topMargin=160,bottomMargin=100)
    Story = []        

    Story.append('Title', h1))

    text = obj.test_to_display
    for line in text.splitlines():
        Story.append(Spacer(1,0.1*inch))
        p = Paragraph(line, style)
        Story.append(p)        

    doc.build(Story)

    return HttpResponseRedirect("/media/pdf/" + str(obj.id) + ".pdf")

person jdickson    schedule 27.03.2012    source источник


Ответы (2)


Я никогда раньше не использовал ReportLab напрямую, но, судя по сообщению об ошибке, это должно быть так же просто, как преобразование этих символов в объекты html.

Вот краткое руководство о том, как использовать библиотеку python cgi, чтобы сделать это быстро и легко: http://wiki.python.org/moin/EscapingHtml

Или, может быть, конкретная версия xml будет немного лучше, так как кажется, что reportlab генерирует xml по пути, и именно здесь он ломается (хотя большинство сущностей символов являются общими) http://wiki.python.org/moin/EscapingXml

person John    schedule 27.03.2012

Я сталкивался с проблемой символа & раньше при создании заголовков.

Я решил это, выполнив следующие действия:

from cgi import escape
Paragraph(escape(self.name), self.styles['cover_subtitle'])

Возможно, вы могли бы попробовать:

from cgi import escape
p = Paragraph(escape(line), style)

Надеюсь это поможет!

person Alan Hannah    schedule 21.07.2015