2012-03-27 18 views
0

Ich verwende Django und Reportlab, um PDF-Dateien zu generieren. Gelegentlich wird ein Benutzer ein Zeichen verwenden, die Reportlab ungültig sein bestimmt, und ich bekomme diese:Reportlab verarbeitet nicht & und <

Valueerror: XML-Parser-Fehler (falsche < oder &) Absatz ...

Gibt es eine Möglichkeit zu vermeiden Sie dies, außer die Eingabe vom Benutzer zu beschränken?

Hier ist eine abgespeckte Version des Codes:

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

Antwort

1

Ich habe noch nie verwendet ReportLab direkt, sondern basierend auf der Fehlermeldung so einfach sein sollte, ist diese Zeichen konvertieren Entitäten in HTML.

Hier ist eine kurze Anleitung, wie man die Python-CGI-Bibliothek verwenden, um dies schnell und einfach zu tun: http://wiki.python.org/moin/EscapingHtml

Oder vielleicht die XML-spezifische Version wäre etwas besser, da es reportlab erscheint xml auf dem Weg erzeugt und das ist, wo es bricht (obwohl die Mehrheit der Zeichen-Entitäten geteilt werden) http://wiki.python.org/moin/EscapingXml

0

ich in der Frage der & Charakter ausgeführt haben, bevor, wenn Titel zu schaffen.

Ich löste es durch folgende Maßnahmen:

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

Vielleicht könnten Sie versuchen:

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

hoffe, das hilft!

Verwandte Themen