Elixir从地图映射到现有字符串的键值对(生成FDF文件)

时间:2018-10-16 14:59:52

标签: dictionary recursion functional-programming elixir phoenix-framework

Elixir的入门者和一般的函数式编程。

我正在尝试创建一个FDF文档,以使用库Pdftk填写现有的PDF表单。

认为我要以错误的方式使用已知的OOP逻辑,而不是坚持使用长生不老药。

defp generate_fdf(filename, fields) do
    fdf = fdf_header()
    |> fdf_content(fields)

    File.write!("./tmp/test.fdf", fdf_footer(to_string(fdf)))
    IO.puts fdf_footer(to_string(fdf))
  end

  defp fdf_header() do
    "%FDF-1.2\n1 0 obj<</FDF<< /Fields["
  end

  defp fdf_content(file_content, fields) do
    Enum.map fields,  fn {k, v} ->
      file_content <> "\n" <> "<< /T (#{k}) /V (#{v}) >>"
    end
  end

  defp fdf_footer(file_content) do
   file_content <> "\n] >> >>\nendobj\ntrailer\n<</Root 1 0 R>>\n%%EOF"
  end

当前generate_fdf的输出将导致:

%FDF-1.2
1 0 obj<</FDF<< /Fields[
<< /T (first_name) /V (George) >>%FDF-1.2
1 0 obj<</FDF<< /Fields[
<< /T (last_name) /V (Das) >>
] >> >>
endobj
trailer
<</Root 1 0 R>>
%%EOF

表示fdf_header()出现两次。

先谢谢了。如果答案包含递归并且对长生不老药来说很普遍,则奖励积分。 :)

1 个答案:

答案 0 :(得分:1)

如果我理解正确的问题,那么问题出在fdf_content/2中。您将file_content放在每个字段的前面。以下代码只会添加一次file_content

defp fdf_content(file_content, fields) do
  file_content <>
    Enum.map_join(fields, "\n", fn {k, v} ->
      "<< /T (#{k}) /V (#{v}) >>"
    end)
end