编码员你好。
本文介绍了如何在Django中使用不同的技术生成PDF文档:通过Django Shell,使用GET参数生成文档,并从互联网上拉出一张图片,用它来建立一个新的(PDF)文档。对于新手来说,Django是一个由经验丰富的开发者设计的开源网络框架,我们可以用它来编写从简单的单页项目到复杂的API和电子商务平台的代码。
谢谢你的阅读!- 内容由App Generator提供。
本教程涵盖的主题
- 建立一个新的Django应用程序
- 配置Django以激活新的应用程序
- 为每种情况添加/解释代码
- 使用Django CLI生成PDF
- 在一个新页面中生成一个(简单的)动态PDF
- 使用图像生成一个动态PDF
- 提到几个开源的Django模板
使用Django CLI创建PDF
本教程假设听众已经有一个Django项目,我们将添加一个新的app ,实现PDF的生成过程。没有工作项目的完全初学者可能会发现一个涵盖Django基础知识的专门的Django教程。Django for Beginners。
使用虚拟环境安装依赖项
$ virtualenv env # create a VENV
$ source env/bin/activate # activate VENV
$
$ pip install reportlab
reportlab 是为我们的应用程序带来所有PDF魔法的库。让我们使用它并在Django外壳中直接创建一个简单的PDF文档。
$ python ./manage.py shell # start Django CLI
>>>
>>> import reportlab # import the library
>>> from reportlab.pdfgen import canvas # import modules
>>> p = canvas.Canvas('1.pdf') # Init a PDF object
>>> p.drawString(200, 200, "Hello world.") # Draw a simple String
>>> p.showPage() # Create the PDF
>>> p.save() # Clean UP the library usage
一旦所有指令被执行,我们应该看到在我们的Django项目的根部创建了一个新的PDF文件。让我们打开这个文件,不要离开Django shell。
>>> import os,sys
>>> os.startfile('1.pdf', 'open')
startfile 帮助器应该使用在操作系统中注册的默认处理程序打开PDF 文件。
创建新的Django应用程序
$ # Current Dir: ROOT of the Django project
$ python manage.py startapp pdf_app
编写一个简单的PDF生成器
# File contents: `app_pdf/views.py` (partial content)
...
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from datetime import datetime
...
def pdf_dw(request):
# Create the HttpResponse object
response = HttpResponse(content_type='application/pdf')
# This line force a download
response['Content-Disposition'] = 'attachment; filename="1.pdf"'
# READ Optional GET param
get_param = request.GET.get('name', 'World')
# Generate unique timestamp
ts = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')
p = canvas.Canvas(response)
# Write content on the PDF
p.drawString(100, 500, "Hello " + get_param + " (Dynamic PDF) - " + ts )
# Close the PDF object.
p.showPage()
p.save()
# Show the result to the user
return response
这个简单的PDF生成器将为返回给用户的HttpResponse 对象设置一些属性,读取一个可选的GET参数并生成一个保存在PDF中的时间戳。一旦新的PDF被保存在内存中,我们就可以将内容返回给用户。
示例用法。
http://localhost:8000/pdf_dw/?name=Bill Gates
用一个图像生成PDF
使用同样的reportlab 库,我们可以不费吹灰之力就能生成带有嵌入式图像的PDF文档--让我们看看代码。
# File contents: `app_pdf/views.py` (partial content)
...
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from datetime import datetime
...
def pdf_img(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(content_type='application/pdf')
# Create the PDF object, using the response object as its "file."
p = canvas.Canvas(response)
my_image = ImageReader('https://www.google.com/images/srpr/logo11w.png')
p.drawImage(my_image, 10, 500, mask='auto')
# Close the PDF object.
p.showPage()
p.save()
# Show the result to the user
return response
my_image 对象是谷歌的标志,从一个公共地址下载,并通过 指令用于我们的PDF中。drawImage
编码的输出样本
http://localhost:8000/pdf_img/
一旦我们保存了代码,就必须更新Django设置,以便激活新的应用程序。
# Update Django Settings.py
...
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app_pdf',
]
...
更新项目路由
urlpatterns = [
path('admin/', admin.site.urls),
path("" , include("app_pdf.urls")), # <-- NEW
]
谢谢你的阅读!有关Django和PDF生成过程的问题,请随时在评论区AMA。
更多Django模板
本节介绍的开源样本可能会帮助初学者(不仅如此)通过重复使用代码库和提供的功能,更快地在Django中编写新项目。
Black Dashboard Django
Black Dashboard Django具有超过16个独立的组件,让你可以自由选择和组合。这意味着有成千上万种可能的组合。所有的组件都可以采取不同的颜色,你可以使用SASS文件轻松地修改。从原型设计到全功能的代码,你将节省大量的时间,因为所有的元素都已实现。我们考虑到了一切,所以这个仪表盘有两个版本,黑暗模式和光明模式。
Django Codebase采用简单的模块化结构,遵循最佳实践,提供认证、数据库配置以及Docker和Gunicorn/Nginx栈的部署脚本。任何具有基本Django/Python知识的开发者,通过遵循产品文档,只需在终端键入几行就能编译和使用该应用。
- Black Dashboard Django- 现场演示
- Black DashboardDjango - 产品页面
Argon Dashboard Django
Argon Dashboard是由100多个独立的组件组成的,让你可以自由选择和组合。所有的组件都可以采取不同的颜色,你可以使用SASS文件轻松修改。从原型设计到全功能代码,你将节省大量的时间,因为所有的元素都已实现。这个仪表盘带有预制的例子,所以开发过程是无缝的,从我们的页面切换到真实的网站是非常容易的。
- Argon Dashboard Django- 现场演示
- Argon DashboardDjango - 产品页面
Material Dashboard Django
Material Dashboard利用了光线、表面和运动。总的布局类似于多个不同层次的纸片,所以深度和顺序都很明显。导航主要停留在左边的侧边栏,内容则在右边的主面板内。
- Material Dashboard Django- 实时演示
- Material Dashboard Django- 产品页面
谢谢你!🚀🚀欢迎在评论区中提出AMA。





