Cloud - 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 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.

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 "samples/WelcomeTemplate.docx" template using JSON format
    /// instruction and data.
    ///
    /// There are several constants at the top of this file which you can modify to suit your test. You
    /// need to set:
    ///
    /// ACCESS_KEY - this key is your unique access to the Docmosis services (keep it safe). You can see
    /// your access key in your Account Settings in the Cloud area Docmosis web site.
    ///
    /// If you have troubles connecting, it is likely because you have a proxy server you need to
    /// configure. See the PROXY_* settings below to enable it.
    /// 

    ///
    /// Copyright Docmosis 2019
    ///
    class CSRenderExample
    {
        // Set your region here.
        // End-point in the USA
        private static string DWS_RENDER_URL = "https://us1.dws4.docmosis.com/api/render";
        // End-point in the EU
        // private static string DWS_RENDER_URL = "https://eu1.dws4.docmosis.com/api/render"
        // End-point in AUS
        // private static string DWS_RENDER_URL = "https://au1.dws4.docmosis.com/api/render"

        // Set your access key here. This is visible in your cloud account in the Docmosis Web Site.
        // It is your key to accessing your service - keep it private and safe.
        private const string ACCESS_KEY = "XXXXX";

        // 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 our cloud account) to use
        private const string TEMPLATE = "samples/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)
        {
            if (ACCESS_KEY.Equals("XXXXX", StringComparison.Ordinal))
            {
                Console.Error.WriteLine("Please set your private ACCESS_KEY at the top of this file from your Docmosis cloud account.");
                Console.Out.WriteLine("Press any key");
                Console.ReadKey();
                System.Environment.Exit(1);
            }
            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 the docmosis cloud: " + 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
            string[] messages = { "This cloud thing is better than I thought.",
                                  "The sun is shining",
                                  "Right, now back to work." };

            sb.Append("\"data\":{\n");
            sb.Append("\"title\":\"Welcome to Docmosis in the Cloud\",\n");
            sb.Append("\"messages\":[\n");
            for (int i = 0; i < messages.Length; i++)
            {
                sb.Append("{\"msg\":\"").Append(messages[i]).Append("\"}");
                if (i < messages.Length - 1)
                {
                    sb.Append(',');
                }
                sb.Append("\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.