在本文结尾,您应该有一个可以正常运行的混合项目,可以从HTML
模板和json
负载生成PDF。
本教程假定您具有Elixir语言的基本经验。
生成一个新的混音项目
显然,您可以使用所需的名称来调用您的项目。 为了本文的方便,我将其称为“ PDFer”,因为它可以对事物进行PDF处理。 没有其他原因...
我们将使用mix
生成我们的项目。 运行mix new pdfer --sup
(或带您调用项目的w),将产生类似于以下输出的内容:
创建项目后,进入项目目录( cd pdfer
)并在编辑器中打开它cd pdfer
code .
如果您使用的是VSCode (并已配置 )。
打开后,您应该看到以下文件:
安装依赖项
实际上,我们只需要三个依赖项(两个依赖项取决于您如何决定)。
elixir-pdf-generator :这将处理PDF的实际生成
杰森 :这将用于解析我们的模板“映射”数据。
注:我很想从药剂社会上的一些差别的洞察力 杰森 和 毒药 ,如果有越来越多的偏好。
bbmustache :这处理合并我们的json
映射和我们的模板文件。 全部使用胡子完成,因此非常干净和简单。
最初,我尝试使用 您 从髭须自己的网站 链接到的库 ,但是,我无法使它工作于非空列表和反向选择(这是我需要的)。
在将以上依赖项添加到mix.exs
,它应该看起来像这样:
defp deps do
[
{ :bbmustache , github: "soranoba/bbmustache" },
{ :jason , "~> 1.1" },
{ :pdf_generator , ">=0.5.5" }
]
end
使用mix deps.get
安装我们所有的依赖项,并准备编写一些代码…
准备编写一些代码!
在Pdfer模块中,您将看到hello方法。 我们将用generate方法替换它。 生成将做两件事:
- 从磁盘读取
template
文件和mapping
文件。 此步骤实际上是可选的。 如果需要,您可以简单地创建变量template
和mapping
,并将它们的值分别内联设置为html
和json
。 我现在要从磁盘读取数据只是因为如果您想立即开始生成PDF,它是开箱即用的更有用的工具。 -
bbmustache
将使用template
和mapping
,并一起为我们“胡子”。 这实际上真的很棒,因为否则我们将不得不做一些杂乱的字符串插值工作。 坦率地说,如果您尝试使用多个模板和映射来生成不同的PDF,那将是不可能的。 - 生成PDF。 现在,我们将使用
wkhtmltopdf
生成我们的PDF,但是,我很乐意使用探索puppeteer
和无头镀铬的未来。 幸运的是,elixir-pdf-generator
给我们带来了灵活性。 - 将生成的PDF写入磁盘。 将来,我们可以将生成的PDF发送到S3之类的地方,但是现在,我们只希望看到所有辛勤工作的结果!
defmodule Pdfer do
@moduledoc "" "
Documentation for Pdfer.
" ""
#
def generate (pdf_path, template_path, mapping_path) do
mapping = Jason.decode!(read_file(mapping_path))
template = read_file(template_path)
template
|> :bbmustache .render(mapping, key_type: :binary )
|> PdfGenerator.generate_binary!()
|> (&File.write( " #{pdf_path} .pdf" , & 1 )).()
end
#
defp read_file (filepath) do
__DIR_ _
|> Path.join(filepath)
|> File.read!()
end
end
最后一步
根据您是决定从磁盘上读取这些内容,还是直接将它们放入代码内联中,最终的内容可能会或可能不会添加template.html
和mapping.json
文件。
现在,我们将它们都与模块一起转储到文件中。 在pdfer/lib/
下创建一个template.html
和mapping.json
,其内容如下:
< html >
< body >
< h1 > Hello {{ location }} </ h1 >
</ body >
</ html >
{ "location" : "World" }
生成PDF
而已! 我们准备生成PDF。 使用iex -S mix
运行我们的代码以放入iex
。 从那里,我们将运行我们的模块,为其提供三个参数。 PDF名称,模板文件名和映射文件名:
iex(1)> Pdfer.generate( "test" , "template.html" , "mapping.json"
几乎立即,您应该在项目目录的根目录中看到一个test.pdf
。
结论
非常棒的是,仅用20行代码,我们就能够从动态模板和数据集生成PDF。
在这里,您可以设置一个端点来接受有效负载并以这种方式生成PDF。 或者,正如我将在另一篇文章中解释的那样,您可以设置一个甜蜜的AWS消息传递管道,以供PDFer读取!