2012-03-27 6 views
0

Я использую Django и Reportlab для генерации pdf-файлов. Иногда пользователь будет использовать символ, который определяет ReportLab недействительным, и я получаю это: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") 

ответ

1

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

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

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

0

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

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

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

Может быть, вы могли бы попробовать:

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

Надеется, что это помогает!

Смежные вопросы