{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys, json, datetime\n", "sys.path.insert(0, r'C:\\Users\\tglaubach\\repos\\pydocmaker\\src')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pydocmaker as pyd\n", "import os" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using templates (HTML and LaTeX)\n", "\n", "pydocmaker supports mounting Jinja2 Templates organized in folders together with (optional) default parameters and assets. Such templates are organized in folders. `pydocmaker` has one such template directory with a `base` template shipped with it by default which is part of the installation.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The `pydocmaker` inbuild templates" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['C:\\\\Users\\\\tglaubach\\\\repos\\\\pydocmaker\\\\src\\\\pydocmaker\\\\templates']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyd.get_registered_template_dirs()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['base']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyd.get_available_template_ids()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Definition of templates\n", "\n", "Each template has \n", "- a name, and its format. The main name per template is then: `..j2`\n", "- Optionally it can also have an assests folder `.assets/` where you can keep any assests such as images/logos etc. \n", "- Optionally it can have a JSON file `.params.json` to define the parameters which can be used for this template type, since (as far as I know) Jinja2 has no possibility to reflect / track expected parameter names. \n", "\n", "Such templates only work for text based formats, such as `html` and `tex`. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:\\Users\\tglaubach\\repos\\pydocmaker\\src\\pydocmaker\\templates\n", " assets\n", " base.assets\n", " base.html.j2\n", " base.params.json\n", " base.tex.j2\n", " word_template_with_mergefields.docx\n" ] } ], "source": [ "for d in pyd.get_registered_template_dirs():\n", " print(d)\n", " for f in os.listdir(d):\n", " print(' ', f)\n", "\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding / defining you own template\n", "\n", "Such Suppose you have the following folder structure \n", "\n", "```\n", "home/jovyan/templates/\n", "├─ assets/\n", "│ ├─ i_can_use_this_everywhere.png\n", "├─ fancy_tempate.assets/\n", "│ ├─ fancy_logo.png\n", "│ ├─ fancy_title_picture.png\n", "├─ fancy_template.params.json\n", "├─ fancy_template.tex.j2\n", "├─ normal_template.params.json\n", "├─ normal_template.tex.j2\n", "```\n", "\n", "(NOTE: you can also check out the `templates` folder in this repository for an example).\n", "\n", "You can then mount this folder in pydocmaker using " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyd.register_new_template_dir(r'C:\\Users\\tglaubach\\repos\\pydocmaker\\example_templates')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Which will give you two available templates to use for exporting tex and pdf documents: \n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['base', 'fancy_template', 'normal_template']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyd.get_available_template_ids()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Using your template\n", "You can mark the templates to be used for a doc by setting it to the reports metadata:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'files_to_upload': {'i_can_use_this_everywhere.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_logo.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_title_picture.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg=='},\n", " 'title': 'EMPTY',\n", " 'date': '',\n", " 'author': 'Automatically Generated',\n", " 'acronyms': {},\n", " 'references': {},\n", " 'applicables': {},\n", " 'template_id': 'fancy_template'}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc = pyd.get_example()\n", "doc.set_template_to_meta('fancy_template')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "which will write all needed data to the documents \"metadata\". Specifically:\n", "- `template_id` will hold the id with which the specific template can be loaded. In our case it will be `fancy_template`.\n", "- `files_to_upload` will hold all assets as base64 encoded bytes in our case the following files:\n", " - **key**: `fancy_logo.png` **value** content from `.../fancy_tempate.assets/fancy_logo.png`\n", " - **key**: `fancy_title_picture.png` **value** content from `.../fancy_tempate.assets/fancy_title_picture.png` \n", " - **key**: `i_can_use_this_everywhere.png` **value** content from `.../assets/i_can_use_this_everywhere.png` (content from `assets` will be made available shared for all templates)\n", "- and all other fields loaded from `fancy_template.params.json` will be loaded to the metadata dictionary directly. \n", "\n", "If you thereafter export your document to pdf (or html if you have an html type template), pydocmaker will automatically load the template and render it with parameters, attachments and your document as the body. \n", "\n", "you can view the template and params by " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'typ': 'meta',\n", " 'children': '',\n", " 'data': {'files_to_upload': {'i_can_use_this_everywhere.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_logo.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_title_picture.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg=='},\n", " 'title': 'EMPTY',\n", " 'date': '',\n", " 'author': 'Automatically Generated',\n", " 'acronyms': {},\n", " 'references': {},\n", " 'applicables': {},\n", " 'template_id': 'fancy_template'}}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc.get_meta()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'files_to_upload': {'i_can_use_this_everywhere.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_logo.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg==',\n", " 'fancy_title_picture.png': 'iVBORw0KGgoAAAANSUhEUgAAAH4AAAAVCAYAAACAEFoRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAOwSURBVGhD7Zi/a9toGMc/vbW4l0LRonrQ4GDeQCFD0Q3GcAYPBwZDh3gygczpnj/BezwbjkzuYCgYOgRSCIY7kyEQqAjpoMHVYgJxIzL3Bv2I9OqVrSTOtcH6gMB69Up63+f7vM/7lZ+VSus/yFk5fpMbclaDXPgVJRd+RcmFX1GeJcydMOnXXnD64ZDONHbFR6eza2L4Zzdnh+wcu1KfHIBKtc77NwXvZDKm9dGRuzwyBfa262zOku++84pvN02MyZhWd0CrO3gaoguT/naZitz+yIyOD2l1B+yf3TNGWpnerklbbl8CKcJf4yhXewF9Deyv/3fm5jyEm6truUlR6ufilXmOBuxZ6mvBFhArbcKkX/rG/pUIS19yi5Dudy32/z5nJEz6NRh2xxwE11RtKrQyvS3Bc7kdJ3KvXw79ihwdd6VaZ4cJ0zcCA4fhETRq+m2fTPPyS/5LK1FuE3MO3y21h7ixLTi2lcTmtJhswmcIYLtpwsfgxVKCCJO+HLCYcF5/TRG0xLOAdvMdDZL7VirCpP/2u5dI0qX4s7wkWLe9cXiBhdMP/8JfdTax2P8EO1u/87k75kCel1amt1XkQvJHacLPjRlB3P13xe5MJn+lWue9MVHOUUVKqZeYnrPTHdDqjrEB+8jb31uRAR2EEwBw+DIB7VWQjf4KDiZufcPmBbrmnVaqAsO16CVEx0uuMxejpPvnOhtFl9N/Moo+F52NosMwFMSlc+Lw3NBv/cDECkW0TxRBjc5r6nDhFlh7JXdSszBmc2iXdOyj2/tHxxZ2oUjFj+kisgmfBWHS330XHo2i3CEd42UBZm4yqD6j8wk3xdeeyRGvMSJiPAitgIZOIzLufi1IsPuTVbz7x8zzWkYtMm7l1pDOcoTXyvRqeqQSDBhO5E7p2FeqlR5h6nDh6mwIP9OXai4dhv6YwyNjuUxjerlgPjw8ZsQqb3CkfYInWY7wALjMLv2fwrxD9gYr2qQj5CsBXgk23tb5c81imDCWC7j8zo2qDPoJ1Wg+fJUDVKp/sFlw+JJ5fAtiNnWZ4iV8HJeR7WLU7v+pl83chSgMiE+7GSlVrsXpTLB+5Zu1hLnS6ewKZlETJBvIwNUH53MN4GLSHbDk6iPO/NaUXbO3XWftZMDeZcRwBeYuZP5zIf7VMDdmAbF3zHP1qpilc0fhfyaKZPnZJBL66bDEUv+4eP8YLsnU5fz6Kz4sh6oyJm8PEqo/U5bKE17xv7zwOY/Dkyn1OcslF35F+Q9idByILrzS4QAAAABJRU5ErkJggg=='},\n", " 'title': 'EMPTY',\n", " 'date': '',\n", " 'author': 'Me!',\n", " 'acronyms': {},\n", " 'references': {},\n", " 'applicables': {},\n", " 'template_id': 'fancy_template'}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "doc.update_meta(author='Me!')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Jinja2 templates from strings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "you can also use Jinja2 Templates directly to make HTML or PDF (latex) documents. An example is given below:\n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "testing available latex compilers\n", "DONE testing latex compilers: found compiler=\"pdflatex\"\n", "Running with latex_compiler='pdflatex'\n", "Writing file: 1769438669_mydocument.tex\n", "Writing file: img_1769438669001321700.png\n", "Compilation run 1\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\tglaubach\\repos\\pydocmaker\\src\\pydocmaker\\backend\\pdf_maker.py:100: UserWarning: Command pdflatex -interaction nonstopmode 1769438669_mydocument.tex returned non-zero exit status 1\n", " warnings.warn(s)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Compilation run 2\n", "Compilation run 3\n", "Reading PDF to bytes: C:\\Users\\tglaubach\\AppData\\Local\\Temp\\tmpgbj58z31\n" ] }, { "data": { "text/plain": [ "(114227, bytes)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# This is a minimal template, the document will be written to the \"body\" part.\n", "template = r'''\n", "\\documentclass[a4paper]{article}\n", "\n", "{% if title %}\\title {{ title }}{% endif %}\n", "{% if author %}\\author {{ author }}{% endif %}\n", "\n", "\\begin{document}\n", "\n", "{{ body }}\n", "\n", "\\end{document}\n", "'''\n", "\n", "from jinja2 import Environment, FileSystemLoader\n", "import pydocmaker as pyd\n", "\n", "\n", "doc = pyd.get_example()\n", "pdf_bytes = doc.to_pdf(template=template, template_params=dict(title='My Title', author='Me'))\n", "len(pdf_bytes), type(pdf_bytes)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\\documentclass[a4paper]{article}\n", "\n", "\\title My Title\n", "\\author Me\n", "\n", "\\begin{document}\n", "\n", "\\subsection{Some Ex...\n" ] } ], "source": [ "tex_string, attachments = doc.to_tex(template=template, template_params=dict(title='My Title', author='Me'))\n", "print(tex_string[:100] + '...')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**NOTE**: If you use template strings directly and your document template has external references such as logos, you need to load them to a bytes array and pass them as a `{filename:content}` dictionary into the to_pdf(...) methods using the `files_to_upload` argument.\n" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running with latex_compiler='pdflatex'\n", "Writing file: 1769438671_mydocument.tex\n", "Writing file: img_1769438669001321700.png\n", "Writing file: fancy_logo.png\n", "Compilation run 1\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\tglaubach\\repos\\pydocmaker\\src\\pydocmaker\\backend\\pdf_maker.py:100: UserWarning: Command pdflatex -interaction nonstopmode 1769438671_mydocument.tex returned non-zero exit status 1\n", " warnings.warn(s)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Compilation run 2\n", "Compilation run 3\n", "Reading PDF to bytes: C:\\Users\\tglaubach\\AppData\\Local\\Temp\\tmpwvh0s68l\n" ] }, { "data": { "text/plain": [ "(114227, bytes)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "assets = {}\n", "with open(r'C:\\Users\\tglaubach\\repos\\pydocmaker\\example_templates\\fancy_template.assets\\fancy_logo.png', 'rb') as fp:\n", " assets = {'fancy_logo.png': fp.read()} \n", "\n", "pdf_bytes = doc.to_pdf(template=template, template_params=dict(title='My Title', author='Me'), files_to_upload=assets)\n", "len(pdf_bytes), type(pdf_bytes)" ] } ], "metadata": { "kernelspec": { "display_name": "pyd", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.19" } }, "nbformat": 4, "nbformat_minor": 4 }