【问题标题】:Elixir Concatinate key value pair from Map to existing String (FDF file generation)Elixir 将键值对从 Map 连接到现有字符串(FDF 文件生成)
【发布时间】:2018-10-16 23:04:48
【问题描述】:

Elixir 和一般函数式编程的初学者。

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

认为我以错误的方式解决这个问题,并使用已知的 OOP 逻辑,而不是遵循 elixir 的逻辑。

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() 出现两次。

提前致谢。如果答案包含递归并且是长生不老药的惯用语,则加分。 :)

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2015-09-23
      • 2021-10-05
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多