Python 将 json/html 转换为 pdf



我正在编写一个脚本,用于将带有html的json文件转换为渲染的pdf。 我写了这个:

from weasyprint import HTML  
from django.template import Template, Context
from django.template.loader import render_to_string, get_template
import json

context = json.load(open("source path"))
rendered_string = render_to_string("template.html", context)
HTML(string=rendered_string).write_pdf("sample.pdf")

问题是输出,json 中的所有 html 都被格式化为简单文本和绑定类型......JSON 部分还可以。 有人知道我该如何解决这个问题吗?

这是模板:

{%for elemento in elementi%}
{%if not elemento.tipo%}
<h1>{{elemento.html}}</h1>
{%else%}
<ul>
{%for f in elemento.form %}
<li>{{f}}</li>
{%endfor%}
</ul>
{%endif%}
{%endfor%} 

这是 JSON:

{"elementi":[{"id":107729,"titolo":null,"tipo":false,"form":null,"html":"<span lessico='Questa' idx="0" testo="testo" show-modal="setModal()" tables="updateTables(input)">Questa</span> <span lessico='&egrave;' idx="1" testo="testo" show-modal="setModal()" tables="updateTables(input)">&egrave;</span> <span lessico='una' idx="2" testo="testo" show-modal="setModal()" tables="updateTables(input)">una</span> <span lessico='domanda' idx="3" testo="testo" show-modal="setModal()" tables="updateTables(input)">domanda</span>...","traduci":[],"inputLessicale":[],"esercizioId":101624,"italiano":null,"testo_principale":"Questa &egrave; una domanda...","testo_principale_pre":"","testo_principale_post":"","risposta_1":"","risposta_2":"","risposta_3":"","risposta_4":"","distrattore_1":"","distrattore_2":"","distrattore_3":"","distrattore_4":"","parole_gia_ricostruite":"","continua":false,"focus":true,"ignora_lessico":false,"etichetta_1":null,"etichetta_2":null,"etichetta_3":null,"etichetta_4":null,"etichetta_5":null},
{"id":107730,"titolo":"Scegli la risposta corretta","tipo":"M","form":["a scelta multipla","con risposta aperta","di tipo trova","di associazione"],"html":null,"traduci":[],"inputLessicale":[],"esercizioId":101624,"italiano":null,"testo_principale":"a scelta multipla","testo_principale_pre":"","testo_principale_post":"","risposta_1":"","risposta_2":"","risposta_3":"","risposta_4":"","distrattore_1":"con risposta aperta","distrattore_2":"di associazione","distrattore_3":"di tipo trova","distrattore_4":"","parole_gia_ricostruite":"","continua":false,"focus":false,"ignora_lessico":false,"etichetta_1":null,"etichetta_2":null,"etichetta_3":null,"etichetta_4":null,"etichetta_5":null}],"ordine_in_verifica":null}

这是 Django 的一个安全功能,以避免 HTML 注入,请参阅类似线程的答案:

https://stackoverflow.com/a/4848661/1047040

而不是:

{{ elemento.html }}

使用这个:

{{ elemento.html | safe }}

来自 Django 文档:

将字符串标记为在输出之前不需要进一步的 HTML 转义。关闭自动转义后,此过滤器不起作用。

链接: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#safe