从HTML生成PDF [A如何指导专长。 长生不老药]

在本文结尾,您应该有一个可以正常运行的混合项目,可以从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方法替换它。 生成将做两件事:

  1. 从磁盘读取template文件和mapping文件。 此步骤实际上是可选的。 如果需要,您可以简单地创建变量templatemapping ,并将它们的值分别内联设置为htmljson 。 我现在要从磁盘读取数据只是因为如果您想立即开始生成PDF,它是开箱即用的更有用的工具。
  2. bbmustache将使用templatemapping ,并一起为我们“胡子”。 这实际上真的很棒,因为否则我们将不得不做一些杂乱的字符串插值工作。 坦率地说,如果您尝试使用多个模板和映射来生成不同的PDF,那将是不可能的。
  3. 生成PDF。 现在,我们将使用wkhtmltopdf生成我们的PDF,但是,我很乐意使用探索puppeteer和无头镀铬的未来。 幸运的是, elixir-pdf-generator给我们带来了灵活性。
  4. 将生成的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.htmlmapping.json文件。

现在,我们将它们都与模块一起转储到文件中。 在pdfer/lib/下创建一个template.htmlmapping.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读取!

From: https://hackernoon.com/how-to-generate-a-pdf-with-elixir-by-the-end-of-this-article-you-should-have-a-working-mix-project-yk1932fj

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值