У нас была проблема при использовании Reportlab для форматирования некоторого контента, который изначально был html, а иногда html был слишком сложным.Решение (и я не возражаю здесь, это было от парней из Reportlab) заключалось в том, чтобы отследить ошибку, когда она произошла, и вывести ее непосредственно в PDF.
Это означает, что вы видите причину ошибки.проблема в правильном контексте.Вы можете расширить это, чтобы вывести подробности об исключении, но в нашем случае, поскольку наша проблема заключалась в преобразовании html в rml, нам просто нужно было отобразить наш ввод:
Шаблон пресета содержит это:
{{script}}
#This section contains python functions used within the rml.
#we can import any helper code we need within the template,
#to save passing in hundreds of helper functions at the top
from rml_helpers import blocks
{{endscript}}
, а затем более поздние биты шаблона, такие как:
{{if equip.specification}}
<condPageBreak height="1in"/>
<para style="h2">Item specification</para>
{{blocks(equip.specification)}}
{{endif}}
В rml_helpers.py мы имеем:
from xml.sax.saxutils import escape
from rlextra.radxml.html_cleaner import cleanBlocks
from rlextra.radxml.xhtml2rml import xhtml2rml
def q(stuff):
"""Quoting function which works with unicode strings.
The data from Zope is Unicode objects. We need to explicitly
convert to UTF8; then escape any ampersands. So
u"Black & Decker drill"
becomes
"Black & Decker drill"
and any special characters (Euro, curly quote etc) end up
suitable for XML. For completeness we'll accept 'None'
objects as well and output an empty string.
"""
if stuff is None:
return ''
elif isinstance(stuff,unicode):
stuff = escape(stuff.encode('utf8'))
else:
stuff = escape(str(stuff))
return stuff.replace('"','"').replace("'", ''')
def blocks(txt):
try:
txt2 = cleanBlocks(txt)
rml = xhtml2rml(txt2)
return rml
except:
return '<para style="big_warning">Could not process markup</para><para style="normal">%s</para>' % q(txt)
Так что все, что слишком сложно для xhtml2rml
обрабатывать, бросаетисключение и заменяется в выводе большим предупреждением «Не удалось обработать разметку», за которым следует разметка, которая вызвала ошибку, экранированная, поэтому она выглядит как литерал.
Тогда все, что нам нужно сделать, - это не забыть поискатьвыходной PDF для сообщения об ошибке и исправьте ввод соответственно.