The modern approach to API development is often associated with the use of the cloud. Therefore, it has become increasingly important to present novel ideas capable of improving users' and developers' digital experiences.
With that in mind, the DynamicDocs API approach to PDF generation is to use LaTeX, a language that is designed for high-quality typesetting
The DynamicDocs API provides an alternative to deploying a stand-alone PDF-generating solution for startups and enterprises. The API approach allows developers to test the solution quickly via Postman and generate large amounts of PDF while incorporating graphics and logic into the templates.
In this article, we present a specific type of JSON to PDF template called TEX to PDF, which allows users to send their own LaTeX source file and compile it via the API.
LaTeX is a computer language used for document preparation, specifically PDF generation. LaTeX source files have a Tex extension and are typically compiled into PDFs. Although it is very popular in academia, where it is used for dissertations and journal articles, the language lends itself well to creating great-looking documents in general.
One of its advantages is the separation of document content and the rules governing the look and feel of the document. A notable disadvantage of LaTeX is that the learning curve for writing the rules of the document layout can be steep and require a significant investment in time for the user.
To circumvent this, DynamicDocs API has a library of ready-made PDF to JSON templates that do not require any knowledge of LaTeX. However, this article assumes that you already have a working Tex file that needs to be compiled.
To convert LaTeX source files into PDFs, one needs a compiler. DynamicDocs API offers two compilers, namely pdfLaTeX and LuaLaTeX.
Tex to PDF Template range consists of two general templates allowing users to upload their own tex file and optionally include Base64 encoded images in the JSON payload.
The templates correspond to the two compilers available. For more information on calling the two templates, visit Tex to PDF with pdfLaTeX Template and Tex to PDF with LuaLaTeX Template.
Let's now look at the case when it makes sense to use TEX to PDF conversion with an API.
The following list explains the criteria for when using DynamicDocs API makes sense for TEX to PDF conversion:
If any of those points do not apply to your use case, you will likely be better off using a simple online Tex to PDF converter or Overleaf.
Consider a situation where you have to create PDF name tags where the underlying data is stored in the system and can be accessed programmatically. The aim is to create a PDF document that looks as follows:
To get started with DynamicDocs API, you will need to sign up for an account with ADVICEment. Without needing to give bank card information, the new accounts are automatically set up with a FREE plan which offers a limited number of API calls. Once the account email address is confirmed, users can log in and access the Dashboard, where they can get their account API key.
We are now almost ready to make the API call. To create the PDF document above, we have written the following Tex file:
\documentclass[10pt]{article}
\usepackage[paperheight=3in, paperwidth=4in, left=0mm, right=0mm, top=0mm, bottom=0mm, noheadfoot]{geometry}
\usepackage[T1]{fontenc}
\usepackage[sfdefault,lf]{carlito}
\usepackage{graphicx}
\usepackage{ragged2e}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage[none]{hyphenat}
%%%%%%%%%%%%%%%%%%%%%%% content definition %%%%%%%%%%%%%%%%%%%%%%%
\makeatletter\let\thetitle\@title\makeatother
\usepackage[pdfencoding=auto,unicode, bookmarks=false, colorlinks=false, pdfborder={0 0 0},pdftitle={Name Tag}, pdfauthor={Advicement}, pdfsubject={Name Tag}, pdfkeywords={Name Tag}]{hyperref}
%%%%%%%%%%%%%%%%%%%%%% color definitions %%%%%%%%%%%%%%%%%%%%%%
\definecolor{White}{HTML}{FFFFFF}
\definecolor{Black}{HTML}{000000}
\definecolor{AdvGreen}{HTML}{0DBB72}
\definecolor{AdvGray}{HTML}{383838}
\definecolor{AdvDarkGray}{HTML}{303030}
\begin{document}
\pagecolor{White}
\begin{tikzpicture}[remember picture,overlay]
\node (rec1) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=north west, fill = AdvGreen, minimum width = 9.16cm, minimum height = 2cm] at ([xshift=0.5cm, yshift=-0.5cm]current page.north west) {};
\node (rec2) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=south west, fill = AdvGreen, minimum width = 9.16cm, minimum height = 0.3cm] at ([xshift=0.5cm, yshift=0.5cm]current page.south west) {};
\node (image) [anchor=north] at ([xshift=0cm, yshift=-0.4cm]rec1.north) {\advGetImage{key = image1, width=3.5cm, type = png}};
\node (name) [anchor=north, inner sep=0.0cm, outer sep=0] at ([xshift=0cm, yshift=-3.75cm]current page.north) {\color{AdvGreen} \bfseries \Huge{Name}};
\node (rec3) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=north, fill = AdvGreen, minimum width = 1cm, minimum height = 0.01cm] at ([xshift=0.0cm, yshift=-0.25cm]name.south) {};
\node (role) [anchor=north, inner sep=0.0cm, outer sep=0] at ([xshift=0cm, yshift=-0.25cm]rec3.north) {\color{AdvGreen} \LARGE{Title}};
\end{tikzpicture}
\end{document}
Changing this Tex file by including different names and titles for each name tag can be done programmatically. Although at first glance, this looks like a normal Tex file, notice the \advGetImage function, which is a custom function used within DynamicDocs API to convert the image from JSON payload and insert it into the file.
Notice that it references the image1 key in the JSON payload below. For more information on this function, visit our API documentation page.
Now, we are ready to formulate our JSON payload, which looks as follows:
{
"texFileContent": "\\documentclass[10pt]{article}\n\n\\usepackage[paperheight=3in, paperwidth=4in, left=0mm, right=0mm, top=0mm, bottom=0mm, noheadfoot]{geometry}\n\\usepackage[T1]{fontenc}\n\\usepackage[sfdefault,lf]{carlito}\n\\usepackage{graphicx}\n\\usepackage{ragged2e}\n\\usepackage{xcolor}\n\\usepackage{tikz}\n\\usetikzlibrary{calc}\n\\usepackage[none]{hyphenat}\n\n%%%%%%%%%%%%%%%%%%%%%%% content definition %%%%%%%%%%%%%%%%%%%%%%%\n\\makeatletter\\let\\thetitle\\@title\\makeatother\n\\usepackage[pdfencoding=auto,unicode, bookmarks=false, colorlinks=false, pdfborder={0 0 0},pdftitle={Name Tag}, pdfauthor={Advicement}, pdfsubject={Name Tag}, pdfkeywords={Name Tag}]{hyperref}\n\n%%%%%%%%%%%%%%%%%%%%%% color definitions %%%%%%%%%%%%%%%%%%%%%%\n\\definecolor{White}{HTML}{FFFFFF} \n\\definecolor{Black}{HTML}{000000} \n\\definecolor{AdvGreen}{HTML}{0DBB72} \n\\definecolor{AdvGray}{HTML}{383838}\n\\definecolor{AdvDarkGray}{HTML}{303030}\n\n\\begin{document} \n\\pagecolor{White}\n\\begin{tikzpicture}[remember picture,overlay]\n\\node (rec1) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=north west, fill = AdvGreen, minimum width = 9.16cm, minimum height = 2cm] at ([xshift=0.5cm, yshift=-0.5cm]current page.north west) {}; \n\\node (rec2) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=south west, fill = AdvGreen, minimum width = 9.16cm, minimum height = 0.3cm] at ([xshift=0.5cm, yshift=0.5cm]current page.south west) {}; \n\\node (image) [anchor=north] at ([xshift=0cm, yshift=-0.4cm]rec1.north) {\\advGetImage{key = image1, width=3.5cm, type = png}}; \n\\node (name) [anchor=north, inner sep=0.0cm, outer sep=0] at ([xshift=0cm, yshift=-3.75cm]current page.north) {\\color{AdvGreen} \\bfseries \\Huge{Name}};\n\\node (rec3) [rectangle, inner sep=0.0cm, outer sep=0, draw = AdvGreen, anchor=north, fill = AdvGreen, minimum width = 1cm, minimum height = 0.01cm] at ([xshift=0.0cm, yshift=-0.25cm]name.south) {}; \n\\node (role) [anchor=north, inner sep=0.0cm, outer sep=0] at ([xshift=0cm, yshift=-0.25cm]rec3.north) {\\color{AdvGreen} \\LARGE{Title}};\n\\end{tikzpicture} \n\\end{document}",
"image1": "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"
}
Note that the stringified Tex file has to be put under the texFileContent key in the JSON. Furthermore, the texFileContent value contains double backslashes where single backslashes were previously used in the Tex file.
The double backslashes are a result of stringifying the TEX file. Finally, the JSON contains a Base64 encoded image which is referenced in the \advGetImage function above. This allows users to make images dynamic in the documents.
We are now ready to make the API call and POST the JSON above to TEX to PDF with the pdfLaTeX template endpoint:
To do so successfully, you will have to authenticate your API request by including the API key as a header parameter as follows:
Header Key |
Value |
---|---|
Adv-Security-Token |
{{Your Account API Key}} |
To make the API call above, we suggest using Postman and viewing the DynamicDocs API – Public Workspace for example.
The response of the API call is a simple JSON with the location of the Status JSON. To see whether the PDF was generated successfully, we can GET the Status JSON using the URL found in the response.
If the PDF is generated successfully, the Status JSON will look as follows and contain the link to download the PDF:
{
"id": "47c2451a-8aa8-47eb-b5db-842dc770b53a",
"startedAt": "Tue Oct 09 2022 19:03:57 GMT+0000 (Coordinated Universal Time)",
"statusCode": 201,
"statusDescription": "document created successfully",
"calculationLogUrl": "https://advicement-prod-api-calls.s3.eu-west-1.amazonaws.com/test/blank-template/47c2451a-8aa8-47eb-b5db-842dc770b53a/output/log/calcLog.txt?AWSAccessKeyId=ASIA2L...",
"latexLogUrl": "https://advicement-prod-api-calls.s3.eu-west-1.amazonaws.com/test/blank-template/47c2451a-8aa8-47eb-b5db-842dc770b53a/output/log/inputFile.log?AWSAccessKeyId=ASIA2L...",
"documentUrl": "https://advicement-prod-api-calls.s3.eu-west-1.amazonaws.com/test/blank-template/47c2451a-8aa8-47eb-b5db-842dc770b53a/output/inputFile.pdf?AWSAccessKeyId=ASIA2L..."
}
We have completed the LaTeX to PDF process using an API. Of course, the Tex file above can be replaced with any working LaTeX source file. The approach above gives developers a powerful option of creating a large variety of different document types.
As outlined in this article, DynamicDocs API caters to a specific use case when doing TEX to PDF conversion (see the Consideration section to see whether your use case fits).
In an event where you have ticked all the conditions, TEX to PDF templates give the option of creating different document types, provided users can create their own working Tex file and dynamically populate it with their data.
DynamicDocs API runs a full TeX Live 2021 Distribution, meaning that users have access to an extensive range of the latest LaTeX packages and fonts. For quick integration, follow the steps above or visit DynamicDocs API – Public Workspace via Postman page.