Tornado - Create a PDF using C# via API

This example shows how to generate a PDF from a DOCX template using C#.  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 to install and run Tornado.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace Docmosis
{
    /// 

    /// This sample code shows a render of the "WelcomeTemplate.docx" template using JSON format
    /// instruction and data via the local Tornado server (localhost:8080).
    ///
    /// If you wish to test via a web proxy server, see the PROXY_* settings below to enable it.
    /// 

    ///
    /// Copyright Docmosis 2015
    ///
    class CSRenderExample
    {
        private static string DWS_RENDER_URL = "http://localhost:8080/api/render";

        // Set your access key here.  The access key is only required if configured in Tornado.
        private const string ACCESS_KEY = "";

        // The output format we want to produce (pdf, doc, odt and more exist)
        private const string OUTPUT_FORMAT = "pdf";

        // the name of the template (stored in Tornado) to use
        private const string TEMPLATE = "WelcomeTemplate.docx";

        // the name of the file we are going to write the document to
        private const string OUTPUT_FILE = "myWelcome." + OUTPUT_FORMAT;

        // Proxy settings if needed to reach the internet
        private const string PROXY_HOST = "";
        private const string PROXY_PORT = "";
        private const string PROXY_USER = "";
        private const string PROXY_PASSWD = "";

        static void Main(string[] args)
        {
            HttpWebResponse response;
            try
            {
                response = sendRequest();
                try
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        saveToFile(response.GetResponseStream());
                    }
                    else
                    {
                        processError(response);
                    }
                }
                finally
                {
                    response.Close();
                }
            }
            catch (WebException e)
            {
                Console.WriteLine("ERROR:" + e.Message);
                using (WebResponse webResponse = e.Response)
                {
                    HttpWebResponse httpResponse = (HttpWebResponse)webResponse;
                    processError(httpResponse);
                }
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("Unable to connect to Docmosis: " + e.Message);
                Console.Error.WriteLine(e.StackTrace);
                Console.Error.WriteLine("If you have a proxy, configure proxy settings at the top of this example.");
                Console.ReadKey();
                System.Environment.Exit(2);
            }
            Console.Out.WriteLine("Press any key");
            Console.ReadKey();
        }

        /// 

        /// Sends the request to the server and returns the response.
        /// 

        /// 
        /// the response returned by the server
        /// 
        static HttpWebResponse sendRequest()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(DWS_RENDER_URL);
            if (PROXY_HOST.Length != 0)
            {
                WebProxy proxy = new WebProxy(PROXY_HOST + ":" + PROXY_PORT, true);
                if (PROXY_USER.Length != 0)
                {
                    proxy.Credentials = new NetworkCredential(PROXY_USER, PROXY_PASSWD);
                }
                Console.WriteLine(proxy.Address);
                request.Proxy = proxy;
            }

            string renderRequest = buildRequest();
            Console.WriteLine("Sending request:" + renderRequest);
            byte[] data = new UTF8Encoding().GetBytes(renderRequest);

            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";
            request.ContentLength = data.Length;

            Stream stream = request.GetRequestStream();
            stream.Write(data, 0, data.Length);

            return (HttpWebResponse)request.GetResponse();
        }

        /// 

        /// Build the request in JSON format. You can do it in XML if you prefer (code not shown here).
        /// 

        private static string buildRequest()
        {

            StringBuilder sb = new StringBuilder();

            // Start building the instruction
            sb.Append("{\n");
            sb.Append("\"accessKey\":\"").Append(ACCESS_KEY).Append("\",\n");
            sb.Append("\"templateName\":\"").Append(TEMPLATE).Append("\",\n");
            sb.Append("\"outputName\":\"").Append(OUTPUT_FILE).Append("\",\n");
            sb.Append("\"outputFormat\":\"").Append(OUTPUT_FORMAT).Append("\",\n");

            // now add the data specifically for this template
            sb.Append("\"data\":{\n");
            sb.Append("\"date\":\"").Append(DateTime.Now).Append("\",\n");
            sb.Append("\"message\":\"This Tornado Document Engine is working great!\",\n");
            sb.Append("}\n");

            // end the entire instruction
            sb.Append("}\n");

            return sb.ToString();
        }

        /// 

        /// Save the given Input stream to a file
        /// 

        ///the Stream containing the content to save
        private static void saveToFile(Stream content)
        {
            byte[] buff = new byte[1000];
            int bytesRead = 0;

            FileStream file = File.Create(OUTPUT_FILE);
            try
            {
                while ((bytesRead = content.Read(buff, 0, buff.Length)) > 0)
                {
                    file.Write(buff, 0, bytesRead);
                }
            }
            finally
            {
                file.Close();
            }

            Console.Out.WriteLine("Created file:" + file.Name);
        }

        /// 

        ///  Something went wrong in the call to the service, tell the user about it
        /// 

        ///The response causing errors
        private static void processError(HttpWebResponse response)
        {
            Console.Error.WriteLine("Our call failed: status = {0}", response.StatusCode);
            Console.Error.WriteLine("message:" + response.StatusDescription);
            StreamReader errorReader = new StreamReader(response.GetResponseStream());
            String msg;
            while ((msg = errorReader.ReadLine()) != null)
            {
                Console.Error.WriteLine(msg);
            }
        }
    }
}

Feedback

Invalid Input

Sorry, this field will only accept letters and numbers, and not special characters, to limit spam. Please also consider contacting support@docmosis.com 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.