{"id":5524,"date":"2020-04-14T08:58:09","date_gmt":"2020-04-14T06:58:09","guid":{"rendered":"https:\/\/pythonprogramming.altervista.org\/?p=5524"},"modified":"2020-04-16T09:47:03","modified_gmt":"2020-04-16T07:47:03","slug":"free-pdf-maker-app-with-python","status":"publish","type":"post","link":"https:\/\/pythonprogramming.altervista.org\/free-pdf-maker-app-with-python\/","title":{"rendered":"Free PDF maker app with Python"},"content":{"rendered":"<p>This time we will create a graphic user interface to make a pdf with Python. Go <a href=\"https:\/\/pythonprogramming.altervista.org\/make-a-formal-letter-in-pdf-with-python-v-2\/\">here<\/a> to see the code to make it without the GUI.<\/p>\n<p>Now, we will divide the code in 2. One to create the pdf and another to create the GUI. Launching the first, you can still make the pdf, but you need to change the text in the code itself, in the text variable. Launching the GUI, you can change the text into a Text widget called content. Having a file for the logic and a file for the GUI, makes it easy to change both of them, separately.<\/p>\n<h2>The script (working also alone) to make the pdf<\/h2>\n<pre class=\"lang:default decode:true \">import time\r\nfrom reportlab.lib.enums import TA_JUSTIFY\r\nfrom reportlab.lib.pagesizes import letter\r\nfrom reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image\r\nfrom reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle\r\nfrom reportlab.lib.units import inch\r\nimport os\r\n\r\n\r\n\r\ndef make_doc(name):\r\n    \r\n    global doc\r\n    doc = SimpleDocTemplate(\r\n        name,\r\n        pagesize=letter,\r\n        rightMargin=72,leftMargin=72,\r\n        topMargin=72,bottomMargin=18)\r\n    return name, doc\r\n\r\n\r\ndef add_image(img, w=200, h=100, align=\"LEFT\"):\r\n    \"Add an image to page\"\r\n    im = Image(img, w, h, hAlign=align)\r\n    # im = Image(img, 2*inch, 2*inch)\r\n    page.append(im)\r\n\r\n\r\ndef add_space():\r\n    \"Add a space to page\"\r\n    page.append(Spacer(1, 12))\r\n\r\n\r\ndef add_text(text, space=0):\r\n    \"Add a text to page followed by a space\"\r\n    if type(text)==list:\r\n        for f in text:\r\n            add_text(f)\r\n    else:\r\n        ptext = f'&lt;font size=\"12\"&gt;{text}&lt;\/font&gt;'\r\n        page.append(Paragraph(ptext, styles[\"Normal\"]))\r\n        if space==1:\r\n            add_space()\r\n        add_space()\r\n\r\n\r\ndef show(text):\r\n    \"Adds images and text for each line in 'text' multiline string\"\r\n\r\n    global doc\r\n    # using add_image and add_text and recognizing .png and ctime\r\n    text = text.splitlines()\r\n    for line in text:\r\n        if \".png\" in line:\r\n            if len(line.split()) == 4:\r\n                l, w, h, align = line.split()\r\n                add_image(l, int(w), int(h), align)\r\n            else:\r\n                add_image(line)\r\n\r\n        elif \"ctime()\" in line:\r\n            add_text(time.ctime())\r\n        else:\r\n            add_text(line)\r\n    doc.build(page)\r\n\r\n# ==========style\r\n\r\nstyles=getSampleStyleSheet()\r\nstyles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))\r\npage=[]\r\n\r\n# ======= Write text and images here =======================\r\n\r\ntext = \"\"\"\r\nlogo.png 200 100 LEFT\r\ntime.ctime()\r\n\r\nGiovanni Gatto\r\nVia Leonardo Da Vinci\r\ntel. 335556566\r\n\r\nHello,\r\nThis is a formal letter\r\n    Thank you very much and we look forward to serving you.\r\n\"\"\"\r\n# ===========================================================\r\n\r\n# put the name of the pdf file here\r\n\r\nif __name__ == \"__main__\":\r\n    name, doc = make_doc(\"myform.pdf\")\r\n    show(text)\r\n\r\n    os.startfile(name)<\/pre>\n<p>If you do not want to use a GUI, you can use the one above. Works perfectly alone. If you prefer a GUI, go to the next chapter and use both the script in the same folder, calling the one above pdfcreate2.py<\/p>\n<h2>The GUI to make the pdf importing pdfcreate2<\/h2>\n<p>This is the very simple GUI. You have a template at the beginning, but you can change it as you want.<\/p>\n<p><a href=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/04\/pdfm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-5527\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/04\/pdfm.png\" alt=\"\" width=\"646\" height=\"486\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/04\/pdfm.png 646w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/04\/pdfm-320x241.png 320w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/a><\/p>\n<pre class=\"lang:default decode:true \"># GUI for pdfcreate\r\nimport os\r\nimport pdfcreate2 as pc\r\nimport tkinter as tk\r\n\r\nroot = tk.Tk()\r\n\r\nlabel = tk.Label(root, text=\"File name: \")\r\nlabel.pack()\r\n\r\nv = tk.StringVar()\r\nentry = tk.Entry(root, textvariable=v)\r\nentry.pack()\r\n\r\ncontent = tk.Text(root)\r\ncontent.pack()\r\ncontent.insert(\"0.0\", pc.text)\r\n\r\ndef create_pdf():\r\n    if v.get() == \"\":\r\n        v.set(\"example\")\r\n    if \".pdf\" not in v.get():\r\n        name, doc = pc.make_doc(v.get() + \".pdf\")\r\n    else:\r\n        name, doc = pc.make_doc(v.get())\r\n    pc.show(content.get(\"0.0\", tk.END))\r\n    os.startfile(name)\r\n\r\nbutton = tk.Button(\r\n    root,\r\n    text=\"Create PDF\",\r\n    command = create_pdf)\r\nbutton.pack()\r\n\r\n\r\n\r\nroot.mainloop()<\/pre>\n<p><iframe loading=\"lazy\" title=\"Free app to make a pdf with Python and tkinter\" width=\"747\" height=\"420\" src=\"https:\/\/www.youtube.com\/embed\/f6xXdWmQZXU?feature=oembed&amp;enablejsapi=1\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<h2>Using templates in txt files<\/h2>\n<p>I thought that it could be useful to have files saved as txt that can be used as templates for different occasions, so that you got a good part of the work done and you have just to adjust something. So, I added a button to get the templates from the txt file in the folder. All you got to do is to previously create one or more txt files with the templates you need. Next time I&#8217;ll make a way to save the templates from the GUI itself.<\/p>\n<pre class=\"lang:default decode:true \"># GUI for pdfcreate\r\nimport os\r\nimport pdfcreate2 as pc\r\nimport tkinter as tk\r\nfrom tkinter import filedialog\r\n\r\n\r\nroot = tk.Tk()\r\n\r\nlabel = tk.Label(root, text=\"File name: \")\r\nlabel.pack()\r\n\r\nv = tk.StringVar()\r\nentry = tk.Entry(root, textvariable=v)\r\nentry.pack()\r\n\r\ncontent = tk.Text(root)\r\ncontent.pack()\r\ncontent.insert(\"0.0\", pc.text)\r\n\r\ndef create_pdf():\r\n    if v.get() == \"\":\r\n        v.set(\"example\")\r\n    if \".pdf\" not in v.get():\r\n        name, doc = pc.make_doc(v.get() + \".pdf\")\r\n    else:\r\n        name, doc = pc.make_doc(v.get())\r\n    pc.show(content.get(\"0.0\", tk.END))\r\n    os.startfile(name)\r\n\r\n\r\ndef get_template():\r\n    try:\r\n        filename = filedialog.askopenfilename(\r\n            initialdir=\".\")\r\n        with open(filename) as file:\r\n            file = file.read()\r\n        content.delete(\"0.0\", tk.END)\r\n        content.insert(\"0.0\", file)\r\n    except:\r\n        pass\r\n\r\nb1 = tk.Button(\r\n    root,\r\n    text=\"Get a template\",\r\n    command=get_template)\r\nb1.pack()\r\n\r\nbutton = tk.Button(\r\n    root,\r\n    text=\"Create PDF\",\r\n    command = create_pdf)\r\nbutton.pack()\r\n\r\n\r\n\r\nroot.mainloop()<\/pre>\n<p>See ya.<\/p>\n<h2>Make a pdf with flask<\/h2>\n<blockquote class=\"wp-embedded-content\" data-secret=\"cF06U6iKwm\"><p><a href=\"https:\/\/pythonprogramming.altervista.org\/make-a-pdf-from-html-with-python-and-flask\/\">Make a pdf from html with Python and Flask<\/a><\/p><\/blockquote>\n<p><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8220;Make a pdf from html with Python and Flask&#8221; &#8212; python programming\" src=\"https:\/\/pythonprogramming.altervista.org\/make-a-pdf-from-html-with-python-and-flask\/embed\/#?secret=QbU5BoV5Uc#?secret=cF06U6iKwm\" data-secret=\"cF06U6iKwm\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe><\/p>\n<!-- se vuoi mettere un testo scorrevole\r\n[hoops name=\"typeWriterGen\"]\r\n\r\npoi metti un id diverso per ogni testo nella stessa pagina\r\n\r\n<div id=\"div01\">\r\n<script>\r\n\r\ntypeWriterGen(\"div01\",\"Esempio di testo scorrevole\");\r\n<\/script>\r\n\r\n-->\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n<hr>\r\n\r\n<!-- NEWSLETTER LINK -->\r\n<a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSf7TniIPCWHDzCSGh2dYZaCwDvi9yLKS5ovFdKuK1sdfOvwEg\/viewform\">\r\n<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/08\/image-13.png\" class=\"avatar\">\r\nSubscribe to the <b>newsletter<\/b> for updates<\/a><br>\r\n\r\n<!-- TKINTER TEMPLATE LINK -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/tkinter-templates\/\">\r\n<img decoding=\"async\" src=\"https:\/\/i0.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2023\/07\/image-26.png\" class=\"avatar\">\r\nTkinter templates<\/a><br>\r\n\r\n<!-- MY AVATAR PUT A LINK TO YOUTUBE CHANNEL-->\r\n<iframe loading=\"lazy\" frameborder=\"0\" src=\"https:\/\/itch.io\/embed\/711828\" width=\"552\" height=\"167\"><a href=\"https:\/\/pythonprogrammi.itch.io\/pysnake\">PySnake by PythonProgrammi<\/a><\/iframe>\r\n<br>\r\n<style>\r\n.avatar {\r\n  vertical-align: middle;\r\n  width: 100px;\r\n  height: 100px;\r\n  border-radius: 50%;\r\n}\r\n<\/style>\r\n\r\n\r\n<a href=\"https:\/\/www.youtube.com\/channel\/UCzbxq5e9gLiY-je2-br1rvg\">\r\n\t<img decoding=\"async\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/10\/avatar64x64.png\" alt=\"Avatar\" class=\"avatar\">\r\n\t My youtube channel<\/a><br>\r\n\r\n<br>\r\n\r\nTwitter: <a href=\"https:\/\/twitter.com\/pythonprogrammi\">@pythonprogrammi - python_pygame<\/a>\r\n<h3>Claude's Games<\/h3>\r\n<p><a href=\"https:\/\/pythonprogramming.altervista.org\/random-daily-game-1-arkanoid\/\">Arkanoid<\/a><br>\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/platform-2d-with-pygame-made-with-claude\/\">Platform 2d<\/a><\/p> <!-- videogames made with claude -->\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/artifacts-games-day-1-memory-game\/\">1. Memory game<\/a>\r\n<h4>Videos<\/h4>\r\n<a href=\"https:\/\/youtu.be\/ciLjWWw5pLY\">Speech recognition game<\/a>\r\n<h3>Pygame's Platform Game<\/h3>\r\n\r\n<a href=\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\"><img decoding=\"async\" src=\"https:\/\/i1.wp.com\/pythonprogramming.altervista.org\/wp-content\/uploads\/2020\/01\/climbercover.png?w=557&ssl=1\"\/ width=\"50%\"><\/a>\r\n<script>\r\nvar title = \"Platform Pygame\";\r\n\t\tvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animation-of-a-sprite-v-1-3\/\",\"Animation 1.3\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-v-2-better-coding-test-it-checking-fps-on-the-screen\/\",\"Animation 1.2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-how-to-display-the-frame-rate-fps-on-the-screen\/\",\"Display Frame rate\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-sprite-animation-update\/\",\"Animation 1.1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Pygame Platform Game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-platform-game-2\/\",\"Pygame Platform 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-3-recap-cheatsheet\/\",\"Pygame PLatform 3 - recap and some Cheat Sheet\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-4-background-and-stuffs\/\",\"Pygame Platform 4 - Background & organizing code\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platform-game-5-sounds-and-mixer\/\",\"Pygame Platform 5 - Sounds\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/platform-game-in-detail-part-1\/\",\"Game in detail part 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/map-maker-1-2\/\", \"Map maker 1.2\"]\r\n\t\t];\r\n\t\t<\/script>\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script>\r\n\r\n<h3>Other Pygame's posts<\/h3>\r\n\r\n<script>\r\nvar title = \"Pygame's Posts\"\r\nvar links = [\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-platformer-1\/\",\"Platform game 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/make-a-platform-game-with-pygame-dafluffypotato\/\",\"DaFluffyPotato Platform Tutorials\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-and-classic-arcade-games-pong\/\",\"Pong Game Full\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/python-draws-in-colors-app-to-draw-with-pygame\/\",\"PyGameGIF 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-draw-app-with-animation\/\",\"PyGameGIF 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pydraw-2-0-app-to-draw-gif\/\",\"PyDraw 2.0\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-drawing-2\/\",\"Draw with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-with-pygame\",\"Sprite animation 1\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/animation-on-pygame-2-free-characters-and-more-actions\/\",\"Sprite animation 2\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/starting-with-pygame\/\",\"Starting movements with Pygame\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-3-move-sprite\/\", \"Move a Sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-4-fonts\/\",\"Text and Fonts\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-animate-a-sprite\/\", \"Animate a sprite\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pygame-and-mouse-events\/\",\"Mouse events\"],\r\n[\"https:\/\/pythonprogramming.altervista.org\/pgp-aka-pygamepresentation-project\/\",\"Pygame presentation\"],\r\n\t[\"https:\/\/pythonprogramming.altervista.org\/moving-the-player-in-pygame-with-key-get_pressed\/\",\"How to use key.get_pressed()\"]\r\n]\r\n<\/script>\r\n\r\n\r\n<script>\r\n\t\r\nif (typeof next2 != \"undefined\"){let next2 = 0;}\r\n\t\r\nnext2 = 0;\r\n\thtml = \"\";\/\/<b style='color:coral;font-size:1.2em'>Other posts about \" + title + \"<\/b><br>\";\r\nfor (address of links) \r\n{\r\n\r\n\tif (next2 == 1){\r\n\t\thtml += \"<div style='background:coral'>\";\r\n\t\thtml += \"Next link => <a href='\" + address[0] + \"'>\" + address[1] + \"<\/a>\";\r\n\t\thtml += \"<\/div><br>\";\r\n\t\tnext2 = 0;\r\n\t}\r\n\tif (address[0] == document.URL) {\r\n\t\tnext2 = 1;\r\n\t}\r\n}\r\n\r\nif (typeof next != \"undefined\") {let next = 0;}\r\nif (typeof addressStart != \"undefined\") {let addressStart = \"\";}\r\nnext = 0;\r\naddressStart = \"<a href='\";\r\nfor (address of links) {\r\n\tif (next == 1){\r\n\t\thtml += \">>>\" + addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t\tnext = 0;\r\n\t}\r\n\telse if (addressStart + address[0] != document.URL)\r\n\t{\r\n\t\thtml += addressStart + address[0] + \"'>\" + address[1] + \"<\/a><br>\";\r\n\t}\r\n\telse\r\n\t{\r\n\t\tnext = 1;\r\n\t\tnext_address = address[0]\r\n\t\tnext_title = address[1]\r\n\t\thtml += \"<span style='color:gray'>\" + address[1] + \"<\/span><br>\";\r\n\t}\r\n\r\n}\r\n\r\n\thtml += `<span style=\"font-size:8px\">Powered by <a href=\"https:\/\/pythonprogramming.altervista.org\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2673\" src=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png\" alt=\"\" width=\"70\" height=\"25\" srcset=\"https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2.png 156w, https:\/\/pythonprogramming.altervista.org\/wp-content\/uploads\/2019\/06\/altervista2-150x56.png 150w\" sizes=\"auto, (max-width: 70px) 100vw, 70px\" \/>pythonprogramming.altervista.org<\/a><\/span>`\r\n\thtml = \"<div style='background:yellow'>\" + html + \"<\/div>\";\r\n\tdocument.write(html)\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"Create a pdf from text into a GUI with Python. Easy and free.\n<a class=\"moretag\" href=\"https:\/\/pythonprogramming.altervista.org\/free-pdf-maker-app-with-python\/\"> [...]<\/a>","protected":false},"author":1,"featured_media":5525,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[1],"tags":[712,783,188,782,4],"class_list":["post-5524","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-examples","tag-free-app","tag-free-pdf-maker","tag-pdf","tag-pdf-maker","tag-python"],"avopt_banners_inside_post":true,"avopt_banners_on_page":true,"av_copy_from":"","av_sharing_message":"","av_sharing_allowed":true,"av_sharing_on":{"fb":[],"tw":[]},"av_allow_affiliate_banner":false,"av_allow_affiliate_multi_banner":false,"av_show_affiliation_buy_button":false,"av_post_rating":true,"av_have_post_rating_value":false,"av_is_artificial_intelligence_content":false,"_links":{"self":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/5524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/comments?post=5524"}],"version-history":[{"count":5,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/5524\/revisions"}],"predecessor-version":[{"id":5541,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/posts\/5524\/revisions\/5541"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media\/5525"}],"wp:attachment":[{"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/media?parent=5524"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/categories?post=5524"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pythonprogramming.altervista.org\/wp-json\/wp\/v2\/tags?post=5524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}