如何在Django中创建PDF文档 - 初学者教程

234 阅读4分钟

编码员你好。

本文介绍了如何在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 文件。

Generate PDF in Django - Simple Hello World.

创建新的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

Generate PDF in Django - Dynamic content with GET parameter.

用一个图像生成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/

Generate PDF in Django - Dynamic content with Image Object.

一旦我们保存了代码,就必须更新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知识的开发者,通过遵循产品文档,只需在终端键入几行就能编译和使用该应用。

Django Template Black - open-source Django Starter.

Argon Dashboard Django

Argon Dashboard是由100多个独立的组件组成的,让你可以自由选择和组合。所有的组件都可以采取不同的颜色,你可以使用SASS文件轻松修改。从原型设计到全功能代码,你将节省大量的时间,因为所有的元素都已实现。这个仪表盘带有预制的例子,所以开发过程是无缝的,从我们的页面切换到真实的网站是非常容易的。

Django Template Argon - open-source Django Starter.

Material Dashboard Django

Material Dashboard利用了光线、表面和运动。总的布局类似于多个不同层次的纸片,所以深度和顺序都很明显。导航主要停留在左边的侧边栏,内容则在右边的主面板内。

Django Template Material - open-source Django Starter.

谢谢你!🚀🚀欢迎在评论区中提出AMA。