You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django CBV:在服务器端程序化将HTML页面保存为PDF文件

在Django中实现服务器端将指定URL的HTML转PDF(含views.py与urls.py配置)

我来给你一步步拆解怎么在Django项目里完成这个需求——服务器端抓取指定URL的HTML页面,然后转换成PDF文件返回给用户,核心就是视图函数的编写和URL路由配置,再配合合适的PDF转换库。

第一步:安装依赖库

首先得装个能把HTML转PDF的工具,WeasyPrint是个不错的选择,它对CSS的支持很友好,能还原页面样式。直接用pip安装:

pip install weasyprint

第二步:编写views.py中的转换逻辑

这里分两种场景给你写示例:

场景1:转换Django内部URL的页面

如果要转的是你自己项目里的页面(比如/dashboard/),用Django的Client来获取页面内容会更稳妥,避免外部请求的问题,还能处理登录验证之类的场景:

from django.http import HttpResponse
from weasyprint import HTML
from django.test import Client

def url_to_pdf(request):
    # 替换成你要转换的目标内部URL
    target_internal_url = '/dashboard/'
    
    # 初始化Django测试客户端,模拟请求目标页面
    client = Client()
    # 如果目标页面需要登录,先模拟登录(需要替换成实际的用户凭证)
    # client.login(username='your_username', password='your_password')
    
    # 获取目标页面的HTML内容
    html_response = client.get(target_internal_url)
    html_content = html_response.content.decode('utf-8')
    
    # 生成PDF:base_url用来处理页面中的相对路径静态资源
    pdf = HTML(string=html_content, base_url=request.build_absolute_uri('/')).write_pdf()
    
    # 构造响应,让浏览器下载PDF
    response = HttpResponse(pdf, content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="dashboard.pdf"'
    return response

场景2:转换外部URL的页面

如果要转的是外部网站的页面,直接用WeasyPrint的HTML(url=...)就能搞定:

from django.http import HttpResponse
from weasyprint import HTML

def external_url_to_pdf(request):
    # 替换成你要转换的外部URL
    target_external_url = 'https://example.com'
    
    # 直接从URL拉取内容生成PDF
    pdf = HTML(url=target_external_url).write_pdf()
    
    # 这里设置为inline是让浏览器直接预览,attachment是下载
    response = HttpResponse(pdf, content_type='application/pdf')
    response['Content-Disposition'] = 'inline; filename="external_page.pdf"'
    return response

第三步:配置urls.py路由

把上面写的视图函数映射到一个可访问的URL:

from django.urls import path
from . import views

urlpatterns = [
    # 其他已有的URL配置
    path('convert-to-pdf/', views.url_to_pdf, name='convert_to_pdf'),
    # 如果是外部URL转换的视图,也加上
    # path('convert-external-to-pdf/', views.external_url_to_pdf, name='convert_external_to_pdf'),
]

一些注意事项

  • 静态资源加载:如果页面里有CSS、图片等静态资源,一定要设置base_url,不然WeasyPrint找不到这些资源,PDF样式会乱。
  • 登录验证:如果目标页面需要用户登录,记得用client.login()模拟登录,不然获取到的是登录页面的HTML。
  • 性能考虑:HTML转PDF是比较耗时的操作,如果请求量很大,建议用异步任务(比如Celery)来处理,避免阻塞请求。

内容的提问来源于stack exchange,提问作者raratiru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:55:13