Python convert json/html to pdf
我正在编写一个脚本,用于将带有html的json文件转换为呈现的pdf。
我写了这个:
1 2 3 4 5 6 7 8 9 10 11 | 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部分还可以。
有人知道我该如何解决?
这是模板:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | {%for elemento in elementi%} {%if not elemento.tipo%} {{elemento.html}} {%else%} <ul> {%for f in elemento.form %} <li> {{f}} </li> {%endfor%} </ul> {%endif%} {%endfor%} |
这是json:
1 2 | {"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='è' idx="1" testo="testo" show-modal="setModal()" tables="updateTables(input)">è</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 è 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
而不是:
1 | {{ elemento.html }} |
使用此:
1 | {{ elemento.html | safe }} |
来自Django文档:
将字符串标记为不需要在输出之前进一步转义HTML。关闭自动转义功能时,此过滤器无效。
链接:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#safe