Cloud - Create a PDF using Elixir via API

This example shows how to generate a PDF from a DOCX template using Elixir.  It calls the Docmosis REST API to merge the data with the template and stream the result back.

The sample code includes the instructions to get started. You will need a Free Trial and then plug your Docmosis Cloud access key into the code below, then run.

Note: This code sample is written to specifically work with DWS4.

defmodule DocmosisTest.Example do
@moduledoc """
This elixir module calls the Docmosis Web Service in order to render a document
from the default template (samples/WelcomeTemplate.docx) into a PDF.

Thank you to Ali Tahbaz for creating this example to share with everyone.

Keywords: Elixir REST post generate pdf template

**In order to execute:**
1. Create a new mix project and navigate into the new directory with the following
`mix new docmosis_test && cd docmosis_test`
2. Add the following application configuration entry into /config/config.exs
Set the api url to the correct region below:
USA: ""
EU: ""
AUS: ""
config :docmosis_test,
  docmosis_access_key: "enter your key here",
  docmosis_render_api_uri: ""
3. Open mix.exs and replace your application and deps functions with the following
  def application do
    [applications: [:httpoison]]

  defp deps do
    [{:poison, "~> 3.0", override: true},
     {:httpoison, "~> 0.11.1"}]
3. Drop this file defining DocmosisTest.Example into /lib ("DocmosisTest.Example.ex")
4. Get dependencies and execute
mix do deps.get, compile
iex -S mix
iex> DocmosisTest.Example.render()

@doc """
Renders an example document named `output_filename` into `output_root` using the Docmosis cloud service.

Returns either `:ok` or `:error`

  ## Examples

      iex> DocmosisTest.Example.render()
  def render(output_root \\ "", output_filename \\ "myWelcome.pdf") do
    case do_render("samples/WelcomeTemplate.docx", output_filename) do
      {:ok, rendered_content} ->
        if(output_root == "", do: Path.join(__DIR__, ".."), else: output_root)
        |> Path.join(output_filename)
        |> IO.inspect(label: "Rendering output to ")
        |> File.write!(rendered_content)
      {:error, reason} ->
        IO.puts "Something went wrong: #{reason}"

  defp do_render(template_name, output_name, format \\ "pdf", access_key \\ nil)
  defp do_render(template_name, output_name, format, nil) do
    # ensure the access key has been set
    access_key = Application.get_env(:docmosis_test, :docmosis_access_key)
    if is_nil(access_key) || (access_key == "") || (access_key == "enter your key here") do
      {:error, "Please set your access key prior to running this example"}
      do_render(template_name, output_name, format, access_key)
  defp do_render(template_name, output_name, format, access_key) do
    docmosis_attributes = docmosis_settings(template_name, output_name, format)
    request_json = example_data()
    |> Map.merge(%{accessKey: access_key})
    |> Map.merge(docmosis_attributes)
    |> Poison.encode!()

    # the default timeout of 5s will work for the example, increase the recv_timeout 
    # to something higher like this if necessary for more significant rendering requests (30s here)
    case, request_json, [{"Content-Type", "application/json"}], recv_timeout: 30_000) do
      {:ok, %HTTPoison.Response{body: document}} ->
        case document do
          "{\"succeeded\":false,\"shortMsg\":\"" <> error_message ->
            {:error, String.replace_trailing(error_message, "\"}", "")}
          _ ->
            {:ok, document}
      {:error, error} ->
        {:error, "Error retrieving document from docmosis: #{inspect error}"}
      unexpected_response ->
        {:error, "An unexpected response was returned from docmosis: #{inspect unexpected_response}"}

	# Make sure the url below matches the one above.
  defp docmosis_render_uri() do
    Application.get_env(:docmosis_test, :docmosis_render_api_uri) || ""

  defp docmosis_settings(template_name, output_name, format) do
      templateName: template_name,
      outputName: output_name,
      outputFormat: format

  defp example_data() do
      data: %{
        title: "Welcome to Docmosis in the Cloud",
        messages: [
          %{msg: "This cloud experience is better than I thought."},
          %{msg: "The sun is shining."},
          %{msg: "Right, now back to work."}


Invalid Input

Sorry, this field will only accept letters and numbers, and not special characters, to limit spam. Please also consider contacting if you need help with this article.

Sorry, this field will only accept letters and numbers, and not special characters, to limit spam.

Invalid Input

API Overview

Docmosis offers a high-performance, template-based PDF generation API. Suitable for use with custom software applications built using Java, C#/.Net, Python, Ruby and more. See a side-by-side comparison of the API for our SaaS and self-hosted products.