我正在使用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")
答案 0 :(得分:1)
我以前从未直接使用过ReportLab,但基于错误信息,将这些字符转换为html实体应该很简单。
以下是有关如何使用python cgi库快速轻松地执行此操作的快速指南: http://wiki.python.org/moin/EscapingHtml
或者xml特定版本可能稍好一些,因为看起来reportlab正在生成xml并且它正在破坏它(尽管大多数字符实体是共享的) http://wiki.python.org/moin/EscapingXml
答案 1 :(得分:0)
我遇到了& amp;的问题。创建标题之前的字符。
我通过以下方式解决了这个问题:
varchar2
也许你可以试试:
from cgi import escape
Paragraph(escape(self.name), self.styles['cover_subtitle'])
希望这有帮助!