2016-10-06 27 views
1

我在我的Django應用程序中通過Weasyprint將HTML導出爲PDF。我注意到,如果我將模板html發送到前端,並將該html返回到後端以將其導出爲pdf,則它會完美打印。但是,如果我直接發送模板html到Weasyprint,它會弄亂一切!沒有CSS,沒有JavaScript。在Django模板中執行Javascript和css

這是我如何使用模板來生成html:

template = loader.get_template('Reporting/reportTemplate.html') 
context = { 
    "reportObj" : result[0] 
}  

htmlContent = (template.render(context, request)) 
response['message'] = htmlContent 
return JsonResponse(response) 

在我的JS控制器我分配htmlContent我的div:

$('#htmlContent').html(response.message); 

然後我返回HTML產生的反到我的Django功能打印pdf

HTML(string=htmlContent).write_pdf(target=response, stylesheets=[CSS(string=getCSS())]) 

這樣,它保持了設計和一切。

但是,當我直接發送htmlContent到Weayprint而沒有發送到前端時,設計和着色消失了!

在我的模板,我甚至已經包括CSS和JavaScript文件是這樣的:

{% load static %} 
{% block content %} 
<link href="{% static "css/ion.rangeSlider.css" %}" rel="stylesheet"> 
<link href="{% static "css/ion.rangeSlider.skinHTML5.css" %}" rel="stylesheet"> 
<script type='text/javascript' src='{% static "scripts/ion.rangeSlider.js" %}'></script> 

<script type='text/javascript'> 
$(document).ready(function(){ 
    var creditScore = $("#creditScore").html(); 

    $("#rangeCS").ionRangeSlider({ 
     type: "double", 
     min: 0, 
     max: 1000, 
     step: 100, 
     from: 0, 
     to: creditScore, 
     from_fixed: true, 
     to_fixed: true, 
     grid: true, 
     grid_snap: true 
    }); 
}); 
</script> 

{% endblock %} 

我怎樣才能在Django模板和導出爲PDF執行JavaScript和CSS,而無需將其發送到前端?

+1

也許你可以嘗試在內部呈現頁面。一些更多的信息:http://stackoverflow.com/questions/126131/python-library-for-rendering-html-and-javascript#126250 – Marcs

+0

即時考慮它 –

回答

0

您是否意味着您已將JS渲染爲您爲Weasyprint渲染的模板?因爲JS使用這種方式只能在客戶端運行(比如瀏覽器),而Weasyprint不能運行,所以不能。您必須向Weasyprint提供最終文檔(HTML)。

如果您的PDF中存在CSS問題,那麼也許您使用Weasyprint不支持的CSS功能。

+0

我在我的模板中使用rangeSlider顯示某種數據。有沒有辦法在將它發送到weasyprint之前執行Javascript,而不必將其發送到瀏覽器? –

+0

我想你需要一種方法來執行你的django應用程序正在運行的JavaScript引擎。您可以使用http://jeanphix.me/Ghost.py/或Selenium + Phantom webdriver之類的軟件運行網站並生成內容 – Willemoes

0

像mille_a說的,你不能執行javascript代碼到pdf中。

因此,要解決你的問題,你需要它做的到你的觀點:

# do some python stuff to get somes datas 
datas = ... 

# assign it into your html 
htmlContent = my_html_template.render(datas) 

# call the pdf generation 
HTML(string=htmlContent).write_pdf(target=response) 

你可以看到這個例子瞭解更多詳情:http://www.supinfo.com/articles/single/379-generate-pdf-files-out-of-html-templates-with-django

希望它能幫助。