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

Dictionary Elixir concatatite从映射到现有字符串的键值对(FDF文件生成),dictionary,recursion,functional-programming,elixir,phoenix-framework,Dictionary,Recursion,Functional Programming,Elixir,Phoenix Framework,初学者在长生不老药和函数式编程一般 我正在尝试创建一个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文档,用库
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
defp generate\u fdf(文件名、字段)do
fdf=fdf_头()
|>fdf_内容(字段)
File.write!(“/tmp/test.fdf”,fdf_页脚(to_字符串(fdf)))
IO.puts fdf_页脚(到字符串(fdf))
结束
defp fdf_头()do
%FDF-1.2\n1 0对象
结束
结束
defp fdf_页脚(文件内容)do
文件内容“\n]>>>>\nendobj\n跟踪程序\n\n%%EOF”
结束
目前,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-1.2
10 obj
endobj
拖车
%%EOF
这意味着
fdf_header()
出现两次


提前谢谢。如果答案包含递归且惯用于长生不老药,则可获得额外积分。:)

如果我正确理解了这个问题,那么问题出在
fdf\u content/2
中。您正在为每个字段预先添加
文件内容
。以下代码只会添加一次
文件内容

defp fdf_content(file_content, fields) do
  file_content <>
    Enum.map_join(fields, "\n", fn {k, v} ->
      "<< /T (#{k}) /V (#{v}) >>"
    end)
end
defp fdf_内容(文件内容,字段)do
文件内容
Enum.map_join(字段“\n”,fn{k,v}->
">"
(完)
结束