{"id":24708799,"url":"https://github.com/amberg/docxtemplater","last_synced_at":"2026-02-22T17:17:58.244Z","repository":{"id":216453269,"uuid":"735794955","full_name":"Amberg/DocxTemplater","owner":"Amberg","description":"DocxTemplater: C# library for generating DOCX documents with templates, supporting placeholders, loops, tables, charts, Markdown/HTML, and image embedding. Ideal for document automation.","archived":false,"fork":false,"pushed_at":"2026-02-21T11:50:10.000Z","size":1536,"stargazers_count":100,"open_issues_count":7,"forks_count":22,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-02-21T12:34:51.322Z","etag":null,"topics":["document-generator","docx","docx-generator","docx-template","docxtemplater","openxml","openxml-word","word"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Amberg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["Amberg"],"buy_me_a_coffee":"amstutz"}},"created_at":"2023-12-26T05:22:04.000Z","updated_at":"2026-02-21T11:50:14.000Z","dependencies_parsed_at":"2024-01-11T11:16:25.785Z","dependency_job_id":"53e3cb28-fc05-4380-bc6e-ebf54c75e196","html_url":"https://github.com/Amberg/DocxTemplater","commit_stats":null,"previous_names":["amberg/docxtemplater"],"tags_count":55,"template":false,"template_full_name":null,"purl":"pkg:github/Amberg/DocxTemplater","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amberg%2FDocxTemplater","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amberg%2FDocxTemplater/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amberg%2FDocxTemplater/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amberg%2FDocxTemplater/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Amberg","download_url":"https://codeload.github.com/Amberg/DocxTemplater/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Amberg%2FDocxTemplater/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29688220,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T15:51:39.154Z","status":"ssl_error","status_checked_at":"2026-02-21T15:49:03.425Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["document-generator","docx","docx-generator","docx-template","docxtemplater","openxml","openxml-word","word"],"created_at":"2025-01-27T06:47:32.889Z","updated_at":"2026-02-22T17:17:58.229Z","avatar_url":"https://github.com/Amberg.png","language":"C#","readme":"# DocxTemplater\r\n\r\n_DocxTemplater is a library to generate docx documents from a docx template. The template can be **bound to multiple datasources** and be edited by non-programmers. It supports placeholder **replacement**, **loops**, and **images**._\r\n\r\n[![NuGet](https://img.shields.io/nuget/v/DocxTemplater.svg)](https://www.nuget.org/packages/DocxTemplater/)\r\n[![MIT](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/Amberg/DocxTemplater/blob/main/LICENSE)\r\n[![CI-Build](https://github.com/Amberg/DocxTemplater/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Amberg/DocxTemplater/actions/workflows/ci.yml)\r\n\r\n## Features\r\n- Variable Replacement\r\n- Collections - Bind to collections\r\n- Conditional Blocks\r\n- Images - Replace placeholder with Image data\r\n- Chart Data Binding - Bind a chart to a data source\r\n- Markdown Support - Converts Markdown to OpenXML\r\n- HTML Snippets - Replace placeholder with HTML Content\r\n- Dynamic Tables - Columns are defined by the datasource\r\n\r\n## Quickstart\r\n\r\nCreate a docx template with placeholder syntax:\r\n```\r\nThis Text: {{ds.Title}} - will be replaced\r\n```\r\n\r\nOpen the template, add a model, and store the result to a file:\r\n```csharp\r\nvar template = DocxTemplate.Open(\"template.docx\");\r\n// To open the file from a stream use the constructor directly \r\n// var template = new DocxTemplate(stream);\r\ntemplate.BindModel(\"ds\", new { Title = \"Some Text\" });\r\ntemplate.Save(\"generated.docx\");\r\n```\r\n\r\nThe generated word document will contain:\r\n```\r\nThis Text: Some Text - will be replaced\r\n```\r\n\r\n### Install DocxTemplater via NuGet\r\n\r\nTo include DocxTemplater in your project, you can [install it directly from NuGet](https://www.nuget.org/packages/DocxTemplater).\r\n\r\nRun the following command in the Package Manager Console:\r\n```\r\nPM\u003e Install-Package DocxTemplater\r\n```\r\n\r\n#### Additional Extension Packages\r\n\r\nEnhance DocxTemplater with these optional extension packages:\r\n\r\n| Package      | Description                             \r\n|--------------|-----------------------------------\r\n| [DocxTemplater.Images ](https://www.nuget.org/packages/DocxTemplater.Images)  |Enables embedding images in generated Word documents|\r\n| [DocxTemplater.Markdown ](https://www.nuget.org/packages/DocxTemplater.Markdown)  | Allows use of Markdown syntax for generating parts of Word documents|\r\n\r\n## Placeholder Syntax\r\n\r\nA placeholder can consist of three parts: `{{property:formatter(arguments)}}`\r\n\r\n- **property**: The path to the property in the datasource objects.\r\n- **formatter**: Formatter applied to convert the model value to OpenXML (e.g., `toupper`, `tolower`, `img` format).\r\n- **arguments**: Formatter arguments - some formatters have arguments.\r\n\r\nThe syntax is case insensitive.\r\n\r\n### Quick Reference Examples\r\n\r\n| Syntax                                                   | Description                                                                                     |\r\n| -------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |\r\n| `{{SomeVar}}`                                            | Simple Variable replacement.                                                                    |\r\n| `{?{someVar \u003e 5}}...{{:}}...{{/}}`                       | Conditional blocks.                                                                             |\r\n| `{{#Items}}...{{Items.Name}} ... {{/Items}}`             | Text block bound to collection of complex items.                                                |\r\n| `{{#Items}}...{{.Name}} ... {{/Items}}`                  | Same as above with dot notation - implicit iterator.                                            |\r\n| `{{#Items}}...{{.}:toUpper} ... {{/Items}}`              | A list of string all upper case - dot notation.                                                 |\r\n| `{{#Items}}{{.}}{{:s:}},{{/Items}}`                      | A list of strings comma separated - dot notation.                                               |\r\n| `{{SomeString}:ToUpper()}`                               | Variable with formatter to upper.                                                               |\r\n| `{{SomeDate}:Format('MM/dd/yyyy')}`                      | Date variable with formatting.                                                                  |\r\n| `{?{!.IsHw \u0026\u0026 .Name.Contains('Item')}}...{{}}`           | Logical Expression with string operation. Careful; Word Replaces `'` with `‘` and `\"` with `”`. |\r\n| `{{SomeDate}:F('MM/dd/yyyy')}`                           | Date variable with formatting - short syntax.                                                   |\r\n| `{{SomeBytes}:img()}`                                    | Image Formatter for image data.                                                                 |\r\n| `{{SomeHtmlString}:html()}`                              | Inserts HTML string into the word document.                                                     |\r\n| `{{@i:ItemCount}}...{{i}}...{{/}}`                       | Range loop that repeats its content `ItemCount` times.                                          |\r\n| `{{#Items}}{?{Items._Idx % 2 == 0}}{{.}}{{/}}{{/Items}}` | Renders every second item in a list.                                                            |\r\n| `{{#switch: SomeVar}}{{#case: 'A'}}...{{/}}{{#default}}...{{/}}{{/}}` | Evaluates switch cases and renders the matching block. there is a short syntax too                                          |\r\n| `{{:ignore}} ... {{/:ignore}}`                           | Ignore DocxTemplater syntax, which is helpful around a Table of Contents.                       |\r\n| `{{:break}}`                                             | Insert a line break after this keyword block.                                                   |\r\n| `{{:PageBreak}}`                                         | Start a new page after this keyword block.                                                      |\r\n| `{{:SectionBreak}}`                                      | Start a new \"Section Break\" on the next page after this keyword block.                          |\r\n---\r\n### Collections\r\n\r\nTo repeat document content for each item in a collection, use the loop syntax:\r\n**{{#\\\u003ccollection\\\u003e}}** ... content ... **{{\u003c\\/collection\u003e}}**\r\n\r\nAll document content between the start and end tag is rendered for each element in the collection:\r\n```\r\n{{#Items}} This text {{Items.Name}} is rendered for each element in the items collection {{/Items}}\r\n```\r\n\r\nThis can be used, for example, to bind a collection to a table. In this case, the start and end tag have to be placed in the row of the table:\r\n| Name         | Position  |\r\n|--------------|-----------|\r\n| **{{#Items}}** {{Items.Name}} | {{Items.Position}} **{{/Items}}** |\r\n\r\nThis template bound to a model:\r\n```csharp\r\nvar template = DocxTemplate.Open(\"template.docx\");\r\nvar model = new\r\n{\r\n    Items = new[]\r\n    {\r\n        new { Name = \"John\", Position = \"Developer\" },\r\n        new { Name = \"Alice\", Position = \"CEO\" }\r\n    }\r\n};\r\ntemplate.BindModel(\"ds\", model);\r\ntemplate.Save(\"generated.docx\");\r\n```\r\n\r\nWill render a table row for each item in the collection:\r\n| Name  | Position  |\r\n|-------|-----------|\r\n| John  | Developer |\r\n| Alice | CEO       |\r\n\r\n#### Shortcut for Dot Notation - accessing the current item\r\n\r\nTo access the current item in the collection, use the dot notation `{{.}}`:\r\n```\r\n{{#Items}} This text {{.Name}} is rendered for each element in the items collection {{/Items}}\r\n```\r\n\r\nTo access the outer item in a nested collection, use the dot notation `{{..}}` This is useful when you have nested collections and want to access a property from the outer scope:\r\n```\r\n{{#Items}} This text {{..SomePropertyFromTheOuterScope}} is rendered for each element in the items collection {{/Items}}\r\n```\r\n\r\n#### Accessing the Index of the Current Item\r\n\r\nTo access the index of the current item, use the special variable `Items._Idx` In this example, the collection is called \"Items\".\r\n\r\n---\r\n### Range Loops\r\n\r\nTo repeat document content a specific number of times based on an integer count or the length of a collection without directly iterating over it, use the range loop syntax:\r\n**{{@i:count}}** ... content ... **{{/}}**\r\n\r\nHere, `count` can be an integer, a string parseable to an integer, or an `IEnumerable` (in which case its count is used). The variable `i` is the index of the current iteration (starting from 0). If you omit the index variable name (e.g. `{{@count}}`), it defaults to `Index`.\r\n\r\n---\r\n### Separator\r\n\r\nTo render a separator between the items in the collection, use the separator syntax:\r\n```\r\n{{#Items}} This text {{.Name}} is rendered for each element in the items collection {{:s:}} This is rendered between each element {{/Items}}\r\n```\r\n\r\n---\r\n### Chart Data binding\r\n\r\nCharts can be fully styled within the template, and a data source can then be bound to each chart.\r\nTo bind a chart to a data source, the chart’s title in the template must match the property name in the model. `MyChart`\r\n![alt text](docs/chartTemplate.png)\r\n\r\nTo bind the chart correctly, the corresponding model property must be of th `ChartData` type.\r\n\r\n*Currently, only bar charts are supported.*\r\n\r\n```\r\n            using var fileStream = File.OpenRead(\"MyTemplate.docx\");\r\n            var docTemplate = new DocxTemplate(fileStream);\r\n            var model = new\r\n            {\r\n                MyChart = new ChartData()\r\n                {\r\n                    ChartTitle = \"Foo 2\",\r\n                    Categories = [\"Cat1\", \"Cat2\", \"Cat3\", \"Cat4\", \"Cat5\"],\r\n                    Series =\r\n                    [\r\n                        new() {Name = \"serie 1\", Values = [2200.0, 5500.0, 4600.25, 9560.56],},\r\n                        new() {Name = \"serie 2\", Values = [1200.0, 2500.0, 8600.25, 4560.56],},\r\n                    ]\r\n                }\r\n            };\r\n\r\n            docTemplate.BindModel(\"ds\", model);\r\n            var resultStream = docTemplate.Process();\r\n```\r\n\r\n---\r\n### Conditional Blocks\r\n\r\nShow or hide a given section depending on a condition:\r\n**{?{\\\u003ccondition\\\u003e}}** ... content ... **{{/}}**\r\n\r\nAll document content between the start and end tag is rendered only if the condition is met:\r\n```\r\n{?{Item.Value \u003e= 0}}Only visible if value is \u003e= 0\r\n{{:}}Otherwise this text is shown{{/}}\r\n```\r\n\r\n---\r\n### Switch / Case Blocks\r\n\r\nShow or hide a given section depending on a switch variable:\r\n\r\n| Long Syntax                                                | Short Syntax                                         |\r\n| :--------------------------------------------------------- | :--------------------------------------------------- |\r\n| `{{#switch: Item.Value}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#case: 1}}Value is 1{{/}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#case: 'A'}}Value is A{{/}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#default}}Value is unknown{{/}}`\u003cbr\u003e`{{/}}` | `{{#s: Item.Value}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#c: 1}}Value is 1{{/}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#c: 'A'}}Value is A{{/}}`\u003cbr\u003e\u0026nbsp;\u0026nbsp;`{{#d}}Value is unknown{{/}}`\u003cbr\u003e`{{/}}` |\r\n| **Optional Closing Tags:** | A new Case or Default tag automatically closes any preceding open block. However, the switch itself must always be closed with `{{/}}`. |\r\n\r\n\u003e [!TIP]\r\n\u003e **Enums:**\r\n\u003e You can also use `.ToString()` to match `enum` properties against strings.\r\n\u003e For example, if `Item.Day` is `DayOfWeek.Monday`:\r\n\u003e `{{#s: Item.Day.ToString()}} ... {{#c: 'Monday'}} Match ... {{/s}}`\r\n---\r\n## Formatters\r\n\r\nIf no formatter is specified, the model value is converted into a text with `ToString`.\r\n\r\nThis is not sufficient for all data types. That is why there are formatters that convert text or binary data into the desired representation.\r\n\r\nThe formatter name is always case insensitive.\r\n\r\n### String Formatters\r\n\r\n- `ToUpper`\r\n- `ToLower`\r\n\r\n### FormatPatterns\r\n\r\nAny type that implements `IFormattable` can be formatted with the standard format strings for this type.\r\n\r\nSee:\r\n- [Standard date and time format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings)\r\n- [Standard numeric format strings](https://learn.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings)\r\n\r\nExamples:\r\n```\r\n{{SomeDate}:format(d)}  ----\u003e \"6/15/2009\"  (en-US)\r\n{{SomeDouble}:format(f2)}  ----\u003e \"1234.42\"  (en-US)\r\n```\r\n---\r\n## Image Formatter\r\n\r\n**_NOTE:_** For the Image formatter, the NuGet package `DocxTemplater.Images` is required.\r\n\r\nBecause the image formatter is not standard, it must be added:\r\n```csharp\r\nvar docTemplate = new DocxTemplate(fileStream);\r\ndocTemplate.RegisterFormatter(new ImageFormatter());\r\n```\r\n\r\nThe Image Formatter replaces a placeholder with an image stored as a byte array.\r\n\r\nThe placeholder can be positioned in a `TextBox`, allowing end-users to adjust the image size easily within the template. The image will then automatically resize to match the dimensions of the `TextBox`.\r\n\r\n#### Stretching Behavior\r\n\r\nYou can configure the image's stretching behavior as follows:\r\n\r\n| Argument     | Example                           | Description                                               |\r\n|--------------|-----------------------------------|-----------------------------------------------------------|\r\n| `KEEPRATIO`  | `{{imgData}:img(keepratio)}`      | Scales the image to fit the container while preserving the aspect ratio |\r\n| `STRETCHW`   | `{{imgData}:img(STRETCHW)}`       | Scales the image to fit the container’s width              |\r\n| `STRETCHH`   | `{{imgData}:img(STRETCHH)}`       | Scales the image to fit the container’s height             |\r\n\r\nIf the image is not placed in a container, scaling can be applied using the `w` (width) or `h` (height) arguments. The `r` (rotate) argument can be used to rotate the image.\r\n\r\n- When only `w` or `h` is specified, the image scales to the specified width or height, maintaining its aspect ratio.\r\n- The size of the image can be specified in various units: cm, mm, in, px.\r\n\r\n\r\n| Argument | Example                            | Description                                                                          |\r\n|----------|------------------------------------|--------------------------------------------------------------------------------------|\r\n| `w`      | `{{imgData}:img(w:100mm)}`         | Scales the image to a width of 100 mm, preserving aspect ratio                        |\r\n| `h`      | `{{imgData}:img(h:100in)}`         | Scales the image to a height of 100 inches, preserving aspect ratio                   |\r\n| `r`      | `{{imgData}:img(r:90)}`            | Rotates the image by 90 degrees                                                      |\r\n| `w,h`    | `{{imgData}:img(w:50px,h:20px)}`   | Stretches the image to 50 x 20 pixels without preserving the aspect ratio             |\r\n\r\n---\r\n## Markdown Formatter\r\n\r\nThe Markdown Formatter in DocxTemplater allows you to convert Markdown text into OpenXML elements, which can be included in your Word documents. This feature supports placeholder replacement within Markdown text and can handle various Markdown elements including tables, lists, and more.\r\n\r\n**_NOTE:_** For the Markdown formatter, the NuGet package `DocxTemplater.Markdown` is required.\r\n\r\nBecause the markdown formatter is not standard, it must be added:\r\n```csharp\r\nvar docTemplate = new DocxTemplate(fileStream);\r\ndocTemplate.RegisterFormatter(new MarkDownFormatter());\r\n```\r\n\r\n\r\n#### Usage\r\n\r\nTo use the Markdown formatter, you need to specify the `md` prefix and pass in the Markdown text as a string. Here is an example:\r\n\r\n```csharp\r\n// Initialize the template\r\nvar template = DocxTemplate.Open(\"template.docx\");\r\nvar markdown = \"\"\"\r\n                | Header 1 | Header 2 |\r\n                |----------|----------|\r\n                | Row 1 Col 1 | Row 1 Col 2 |\r\n                | Row 2 Col 1 | Row 2 Col 2 |\r\n                \"\"\";\r\n// Bind model with Markdown content\r\ntemplate.BindModel(\"ds\", new { MarkdownContent = markdown });\r\n\r\n// Save the generated document\r\ntemplate.Save(\"generated.docx\");\r\n```\r\n\r\nIn your template, you would have a placeholder like this:\r\n\r\n```\r\n{{ds.MarkdownContent}:MD}\r\n```\r\n---\r\n## Whitespace Trimming Around Directives\r\n\r\nTo improve template readability without affecting the final output, line breaks before and after template directives (e.g., `{{#...}}, {{/}}, {{:}}`) can be automatically removed.\r\nThis behavior can be enabled via the ProcessSettings:\r\n```csharp\r\nvar docTemplate = new DocxTemplate(memStream, new ProcessSettings()\r\n{\r\n    IgnoreLineBreaksAroundTags = true\r\n});\r\nvar result = docTemplate.Process();\r\n```\r\n---\r\n## Error Handling\r\n\r\nIf a placeholder is not found in the model, an exception is thrown. This can be configured with the `ProcessSettings`:\r\n```csharp\r\nvar docTemplate = new DocxTemplate(memStream);\r\ndocTemplate.Settings.BindingErrorHandling = BindingErrorHandling.SkipBindingAndRemoveContent;\r\nvar result = docTemplate.Process();\r\n```\r\n---\r\n## Culture\r\n\r\nThe culture used to format the model values can be configured with the `ProcessSettings`:\r\n```csharp\r\nvar docTemplate = new DocxTemplate(memStream, new ProcessSettings()\r\n{\r\n    Culture = new CultureInfo(\"en-us\")\r\n});\r\nvar result = docTemplate.Process();\r\n```\r\n\r\n## Advanced Model Binding: `ITemplateModel` and `TemplateModelWithDisplayNames`\r\n\r\n### `ITemplateModel` Interface\r\n\r\nFor advanced scenarios where a standard object or dictionary is not suitable for your data model, you can implement the `ITemplateModel` interface.\r\nThis allows you to control how properties are resolved for template binding.\r\n\r\n```csharp\r\npublic interface ITemplateModel\r\n{\r\n    bool TryGetPropertyValue(string propertyName, out ValueWithMetadata value);\r\n}\r\n```\r\n\r\nImplement this interface to provide custom property lookup logic.\r\nThis is useful for dynamic models, computed properties, or when you want to support custom property resolution strategies.\r\n\r\n### `TemplateModelWithDisplayNames` Base Class\r\n\r\n`TemplateModelWithDisplayNames` is an abstract base class that extends `ITemplateModel` and allows you to bind template placeholders to properties using either their property name or a `[DisplayName]` attribute.\r\nThis is especially useful when you want to use user-friendly or localized names in your templates.\r\n\r\n```csharp\r\nusing DocxTemplater.Model;\r\nusing System.ComponentModel;\r\n\r\npublic class PersonModel : TemplateModelWithDisplayNames\r\n{\r\n    [DisplayName(\"Vorname\")]\r\n    public string FirstName { get; set; }\r\n\r\n    [DisplayName(\"Nachname\")]\r\n    public string LastName { get; set; }\r\n}\r\n```\r\n\r\nIn your template, you can then use either `{{person.Vorname}}` or `{{person.FirstName}}` to access the property.\r\n\r\n## Support This Project\r\n\r\nIf you find DocxTemplater useful, please consider supporting its development:\r\n\r\n[![Sponsor](https://img.shields.io/github/sponsors/Amberg?logo=GitHub\u0026color=ff69b4)](https://github.com/sponsors/Amberg)\r\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-%23FFDD00?style=flat\u0026logo=buy-me-a-coffee\u0026logoColor=black)](https://www.buymeacoffee.com/amstutz)\r\n\r\n","funding_links":["https://github.com/sponsors/Amberg","https://buymeacoffee.com/amstutz","https://www.buymeacoffee.com/amstutz"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famberg%2Fdocxtemplater","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famberg%2Fdocxtemplater","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famberg%2Fdocxtemplater/lists"}