Reportlab не обрабатывает & и < - PullRequest
0 голосов
/ 27 марта 2012

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

ValueError: ошибка синтаксического анализатора xml (фиктивный <или &) в абзаце ... </em>

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

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

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")

Ответы [ 2 ]

1 голос
/ 28 марта 2012

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

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

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

0 голосов
/ 21 июля 2015

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

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

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

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

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

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

...