Elixir Concatinate ключ-пара значений из карты в существующую строку (создание файла FDF) - PullRequest
0 голосов
/ 16 октября 2018

новичок в Elixir и функциональное программирование в целом.

Я пытаюсь создать документ FDF, чтобы заполнить существующие PDF-формы библиотекой Pdftk.

Думаю, я поступаю неправильно и использую известную логику ООП, а не придерживаясь эликсира.

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 голосов
/ 16 октября 2018

Если я правильно понял вопрос, проблема в 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
...