如何使用 Django 将完全呈现的 html 页面转换为 PDF
How to turn fully rendered html page using Django into PDF
我创建了一个应用程序,它使用 Google 地图 api 对地址进行地理编码并向地图添加标记。在我看来,它也与 Postgis 有一些互动。那里一切正常。
我遇到的问题是如何从完全呈现的 HTML 文件创建 PDF,以便所有上下文数据和 google 地图都可以呈现为 pdf。我需要 pdf 由与网络应用程序交互以进行地理编码的人通过电子邮件发送。所以,最终的结果是将结果pdf并附在邮件中。
我看过 Reportlab,它只能通过视图创建 pdf(非常适合这个,但不能满足我的需要)。
我也看过wkhtmltopdf,乍一看似乎只能从视图中渲染,除非我遗漏了什么。
问:是否可以从呈现的网页创建 pdf(将包括在客户端创建的 Google 地图)?如果可能的话,一个简单的例子将不胜感激。
谢谢
编辑:添加工作流程以尝试澄清问题所在
- 在索引页上有一个文本框,有人可以在其中添加地址
在提交时,有一个 Google 地理编码器函数将表单数据中的纬度和经度发送回视图
- 在视图中,纬度和经度用于查找 3 个最近的位置(在我的 Postgis 数据库中)并呈现到 HTML 结果页面
- 在结果页面上,使用 Google 个地图 API
创建了 3 个单独的 Google 地图
我需要将完全呈现的网页转换为 PDF。 Reportlab(例如)在第 2 点之后调用,在第 3 点呈现网页之前,因此它无法创建包含这 3 个 Google 地图的 PDF。
首先,根据模型-视图-控制器范例,可下载的 PDF 是 视图 - 因此请查看 Django PDF documentation。
如果您希望在 PDF 中包含 Google 地图,有 3 个选项:
- 在客户端呈现,将它们打印为 PDF。这取决于用户实际知道如何执行此操作。
- 使用无头浏览器使用 Javascript、return 将页面预渲染到 Django,然后导出为 PDF。根据服务器的不同,这会很困难。
- 使用 Google Maps Static Map API to generate the image and use that in a tool like Pisa 。它的功能比完整的 API 少,但非常适合制作可打印的静态图像。 这样做。
As stated in the bottom of the Django Docs on generating PDFs, Pisa 通过获取 HTML 页面然后从中创建一个 PDF 来工作,我以前使用过它,这意味着您可以使用 Django 模板来构建页面,而不是return 通过 HTML 转 PDF 处理器 运行 处理它。您只需捕获此生成的 PDF 并根据需要将其附加到电子邮件中。
与编辑匹配的附录。
以上仍然有效,除了关于PDF是视图的部分。无论如何,静态地图 API 应该会为您提供需要包含在 Raw HTML 中的图像,您可以将其转换为 PDF。
查看 HTML2Canvas (http://html2canvas.hertzen.com/) 是否适用于您的页面。如果是这样,您可以将 canvas 导出为 png,然后将其发送到您的服务器。
您的服务器可以将该 png 转换为 pdf,然后 return 该 pdf,因此系统会提示用户下载它。
另一个选项是 xhtml2pdf (http://www.xhtml2pdf.com/),但它可能无法正常工作,具体取决于地图的呈现方式。不过值得一试。
我创建了一个应用程序,它使用 Google 地图 api 对地址进行地理编码并向地图添加标记。在我看来,它也与 Postgis 有一些互动。那里一切正常。
我遇到的问题是如何从完全呈现的 HTML 文件创建 PDF,以便所有上下文数据和 google 地图都可以呈现为 pdf。我需要 pdf 由与网络应用程序交互以进行地理编码的人通过电子邮件发送。所以,最终的结果是将结果pdf并附在邮件中。
我看过 Reportlab,它只能通过视图创建 pdf(非常适合这个,但不能满足我的需要)。
我也看过wkhtmltopdf,乍一看似乎只能从视图中渲染,除非我遗漏了什么。
问:是否可以从呈现的网页创建 pdf(将包括在客户端创建的 Google 地图)?如果可能的话,一个简单的例子将不胜感激。
谢谢
编辑:添加工作流程以尝试澄清问题所在
- 在索引页上有一个文本框,有人可以在其中添加地址 在提交时,有一个 Google 地理编码器函数将表单数据中的纬度和经度发送回视图
- 在视图中,纬度和经度用于查找 3 个最近的位置(在我的 Postgis 数据库中)并呈现到 HTML 结果页面
- 在结果页面上,使用 Google 个地图 API 创建了 3 个单独的 Google 地图
我需要将完全呈现的网页转换为 PDF。 Reportlab(例如)在第 2 点之后调用,在第 3 点呈现网页之前,因此它无法创建包含这 3 个 Google 地图的 PDF。
首先,根据模型-视图-控制器范例,可下载的 PDF 是 视图 - 因此请查看 Django PDF documentation。
如果您希望在 PDF 中包含 Google 地图,有 3 个选项:
- 在客户端呈现,将它们打印为 PDF。这取决于用户实际知道如何执行此操作。
- 使用无头浏览器使用 Javascript、return 将页面预渲染到 Django,然后导出为 PDF。根据服务器的不同,这会很困难。
- 使用 Google Maps Static Map API to generate the image and use that in a tool like Pisa 。它的功能比完整的 API 少,但非常适合制作可打印的静态图像。 这样做。
As stated in the bottom of the Django Docs on generating PDFs, Pisa 通过获取 HTML 页面然后从中创建一个 PDF 来工作,我以前使用过它,这意味着您可以使用 Django 模板来构建页面,而不是return 通过 HTML 转 PDF 处理器 运行 处理它。您只需捕获此生成的 PDF 并根据需要将其附加到电子邮件中。
与编辑匹配的附录。
以上仍然有效,除了关于PDF是视图的部分。无论如何,静态地图 API 应该会为您提供需要包含在 Raw HTML 中的图像,您可以将其转换为 PDF。
查看 HTML2Canvas (http://html2canvas.hertzen.com/) 是否适用于您的页面。如果是这样,您可以将 canvas 导出为 png,然后将其发送到您的服务器。
您的服务器可以将该 png 转换为 pdf,然后 return 该 pdf,因此系统会提示用户下载它。
另一个选项是 xhtml2pdf (http://www.xhtml2pdf.com/),但它可能无法正常工作,具体取决于地图的呈现方式。不过值得一试。