Javascript Django HTML&;CSS呈现为pdf

Javascript Django HTML&;CSS呈现为pdf,javascript,html,css,django,bootstrap-4,Javascript,Html,Css,Django,Bootstrap 4,我正在尝试使用Django将HTML和CSS转换为pdf页面,但我仍然坚持使用他们的教程,因为我希望当用户单击下载按钮时pdf呈现当前页面,并且pdf以只读权限自动下载。整个过程让人感觉很痛苦 目前,weasyprint只是将Django中的URL转换为pdf,但我不知道如何设置查看weasyprint视图的按钮 也许我已经看过去了,把事情复杂化了,任何帮助都将不胜感激 Weasyprints示例代码: from django.conf import settings from django.v

我正在尝试使用Django将HTML和CSS转换为pdf页面,但我仍然坚持使用他们的教程,因为我希望当用户单击下载按钮时pdf呈现当前页面,并且pdf以只读权限自动下载。整个过程让人感觉很痛苦

目前,weasyprint只是将Django中的URL转换为pdf,但我不知道如何设置查看weasyprint视图的按钮

也许我已经看过去了,把事情复杂化了,任何帮助都将不胜感激

Weasyprints示例代码:

from django.conf import settings
from django.views.generic import DetailView

from django_weasyprint import WeasyTemplateResponseMixin
from django_weasyprint.views import CONTENT_TYPE_PNG


class MyModelView(DetailView):
    # vanilla Django DetailView
    model = MyModel
    template_name = 'mymodel.html'


class MyModelPrintView(WeasyTemplateResponseMixin, MyModelView):
    # output of MyModelView rendered as PDF with hardcoded CSS
    pdf_stylesheets = [
        settings.STATIC_ROOT + 'css/app.css',
    ]
    # show pdf in-line (default: True, show download dialog)
    pdf_attachment = False
    # suggested filename (is required for attachment!)
    pdf_filename = 'foo.pdf'


class MyModelImageView(WeasyTemplateResponseMixin, MyModelView):
    # generate a PNG image instead
    content_type = CONTENT_TYPE_PNG

    # dynamically generate filename
    def get_pdf_filename(self):
        return 'bar-{at}.pdf'.format(
            at=timezone.now().strftime('%Y%m%d-%H%M'),
        )

我在我的电脑上制作了一个虚拟环境,它的设置与示例完全相同。目前正在使用Boostrap 4

*编辑如果有更好的方法,欢迎分享:)

另外,我希望只针对body标记,这样它就可以只将该部分转换为pdf,而不是整个页面

我之前使用的解决方案是:但这不太管用

*编辑2.0

我已经转到了js,我被这个脚本困住了,它不想在单击时创建pdf表单函数,还有没有办法将js函数设置为只在div中下载所选Id,而不是按一定比例下载?(担心它将使用分辨率而不是需要呈现的实际内容)


如果您有任何建议,我们将不胜感激。

您不需要使用django应用程序。您可以根据博客文章中的示例编写一个自定义视图来处理打印


我发现那个应用程序有局限性,并写了自己的观点。这没那么难。

使用
whkhtmltopdf
在Django中很容易使用。它提供纯html生成的PDF转换

pip install django-wkhtmltopdf

我尝试了django wkhtmltopdf和weasyprint。舒尔weasyprint允许更多css主题,但它仍然不是一对一的浏览器版本。我对结果不满意。 对于表格和所有类似word/excel的数据都可以。但在我的例子中,我必须使px到px的“证书”像pdf一样具有svg形状的背景,然后一些功能的缺乏开始成为不方便的问题

因此,如果您需要使用相同的css,只需稍加修改即可获得browswer中的效果,那么木偶师将解决所有兼容性问题。但这个力量要用节点来运行木偶师。(就我而言,我已经使用它来编译资产)

:

npm i-木偶演员pdf

pip安装django木偶师pdf
在设置中添加节点puppeter cli start命令:

PUPPETEER_PDF_CMD = 'npx puppeteer-pdf'
并创建视图

from puppeter\u pdf导入render\u pdf\u from\u模板
从django.http导入HttpResponse,
导入操作系统
#渲染代码
上下文={
“数据”:“测试数据”
}
output_temp_file=os.path.join(settings.BASE_DIR,'static','temp.pdf')
pdf=从模板渲染pdf(
输入\u template='templates目录中模板的路径'
标题\模板=“”,
页脚模板=“”,
上下文=上下文,
cmd_选项={
“格式”:“A4”,
“比例”:“1”,
“marginTop”:“0”,
“marginLeft”:“0”,
“marginRight”:“0”,
“marginBottom”:“0”,
“printBackground”:True,
“PrefercSpageSize”:正确,
“输出”:输出临时文件,
“页面范围”:1
}
)
#您可以立即删除临时文件,也可以收集临时文件并运行一些crone任务。(性能)
如果os.path.存在(输出临时文件):
删除操作系统(输出临时文件)
其他:
#提出错误或什么的
filename=f'filename={'your donwload file name'}.pdf'
response=HttpResponse(pdf,content_type='application/pdf;'))
响应['Content-Disposition']=文件名
要保持原色,您必须添加

html{
-webkit打印颜色调整:精确;
}
选择“preferCSSPageSize”时控制页面大小和边距

@page{
尺寸:A4;
保证金:0;
}

为什么说它是限制性的?您尝试实现了什么?weasyprint给出了cario依赖项错误:/而且如果您安装了cario,它仍然不起作用weasyprint确定有更简单的方法来呈现pdf:)@Robert对于我来说,Linux和Mac的终端都有两行代码。至于Windows,我不知道,但我肯定不是trivial@somecallitblues我不记得GTK有什么问题,但舒尔并不是windows安装工程的首选。版本不工作(某些windows服务已运行,安装过程中不会更改此行为)。但他们公布了哪些有效。