{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Reportlab Cheatsheet" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from reportlab.pdfgen.canvas import Canvas\n", "from reportlab.lib.pagesizes import letter, A4\n", "from reportlab.lib.units import inch, mm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ReportLab PDF Library\n", "\n", "![](data:image/jpeg;base64,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) ![](data:image/gif;base64,R0lGODlh/wD/AOcAAB0iHx8lIiEmIyMpJSYrKCguKisxLi4zMDA1MjQ4NjY7ODk+OzxBPj5DQFwAAGUAAHcAAH0eHnUsLHs4OEFFQ0RIRkZLSEhNSkxQTU5TUFFVU1RZVldaWFldWlxgXl5iYHpBQWFlYmVoZmZqaGpsa21wbm5ycHN1c3R4dXZ6eHt8fH2Afn+CgIkAAJcAAIU6OqcBAawREbcAALgVFbokJL45OZNGRp5ubp97e6F1db98fMcBAcUbG9MJCdsUFMojI8k3N9coKNszM+cDA+EcHPMAAP0AAP0LC/0SEv4bG+gnJ+k0NPEuLv0iIv0qKvE0NPQ7O/00NP07O8VOTspYWNtGRtdUVMdpadlra9h2duVERORMTOxEROxKSudCU+hJWeNUVOJbW+pUVOtZWfZAQPRMTPlERPxLS/RUVPRbW/xTU/xaWulSYepaaOZjY+NsbOlkZOthb+xubutjcuxpdutseeJzc+N8fOh0dO1yf+p9ffJhYfxjY/tra/N3d/V7e/x0dPx7e+10ge55he18iISEhIaIh4aJiIyMjI6Qj46RkJOTk5WYlpeamJqamp2gnp6hoKGBgbScnKOjo6WopqapqKqqqq6wr6eysqyysq64uLmmprKzsra4trS7u7y8vL7AvrbAwLrAwL/IyMaJicaTk9uGhtOamsGursm1tdiqqtK+vuSEhOqDg++Ej+yKiu+FkO+JlOObm+yRkeubm/ODg/SLi/yDg/yLi/COmPOUlPCSnPSbm/yTk/ybm/Gbo+Wrq+a0tOyzs+q9vfWjo/KiqvWrq/ujo/urq/Oss/Szs/S1u/S6uvuysvu8vPa8wsPExMbIx8PKysvLy87Qz8zS0s7Z2dbFxdTU1NbY19Ta2tvS0tvb29/g39zi4tro6OPMzOzExO7Ly+3Y2PPDw/bHzPTLzPvDw/vMzPXR0vPb2/rT0/jU2Prb2/ne4eLi4ufo5+Pq6uzs7O3z8+37+/Lj4/Tr6/rj4/nn6fvt7fPz8/f49/P8/Pzx8f7+/gAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQURgD/ACH+ClBob3RvU2NhcGUALAAAAAD/AP8AAAj+AP0JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEMi3EeypMmTKFOqXMmypcuXMPf5Iymyps2bM03q28mzp8+fQIMKHUq0qNGjJ2fiXMp0YsmdJI9KnUq1qtWfT/WVbMq168io+uTJgwfvndmzaNOqXcu2rVu03eLKnUu3rt27ds/Ck9dzq9e/XKPO27cXr+HDh7kpXsyYcbbHkLFJnjyZmuXLmC9P28y58+ZooKGJBkUaVLRp2Lq948uTJuDXNgXzfaePrO3buHPr3m37Xdm37+o2Hg65eGTK2DJj9gw6NDRQ06hl8y1vHlTXsLN33LdzrDxu8oD+ix8vfLh548eRU6aWPLlmz/Cdjwb1qT41bmbFssauvf9F7mOphk144xXYVnnmNYbeY+ohp5xl8MUXjWjz1WchNmfpp5VM/nXoFIDvKDYNgQaWyBaCCS62YIMOtrdchM1NSCFp9XXSyTTcxLUXX3556CNDAMLTjWTRkGjikWehmCI3K7JY2YMRThMjhc/R94mNnECTTVwabvjjlwkFyY1loBiJ5JlKptikky5mFmVzVFppYyecfIKNYquJ5SWYfA4EIjeblXnmoGalmeCaTj5IzZvygQKNhVhy0gk13eS44559ggliNlJ+YiahSOK1JJOIsqgco3HSF6mk2GSTo4b+/GXaIUnzCIlNNKB08imo4hlKXKkOKrpolFI2WtqVnCR7ySV2PgaenlrJ+iOIt4LCSTzeZKtttt1s6+234IYr7rbcaOONNtx4U26552rj7rvuWpONNdhYU4291eSr777VUFONNP/+K4000ww8ysEHgyKKKKHQuewllkSTTavP7sehtATpo44643Ts8ccghyzyyCODA841q6SCyiaSnLwKyjC/LLPMMV9jc8yr5KzzzDqjvPPPQKeccyopE53K0UgnjTQqR6PCtNNQR73y1CtvYvXVVlsiydaXcLKsJWDjKFk2ZFWHqbQy1aPFEkIIwbbbcC/Bttx012333XK7Tbf+3nG37Tfcbb/9t99BCFH44UEkrvjiPyTe+A+QRy755JDTwIPlll+uOQ8z0DAD5zOELvroM8RQegyop6766i6o3vrrMbyOgydfW0IJJ61KZqmesfYp0zh64433E0tAUfzxxxuvfPLCNx/EEkEoEb3h0ke/+PXXPx7E45T/wIP33vMg/vjkc27+56SnL7rpq6sOA+rvx/D++y7QHzsM9bug//4u5EA72LabRDS4MTbFXKp3XyoJ8PLWvAbKzXgPdCDe+DY3wD2vcIYzHPY2uD3HdbB7kvve+MJXvvOBTn3rCx372re6+MUOfi98nQz3lwNNQAxslJiEJe4zGVcd8GL+fOKOPraxNgkib3lIZB7zINjAvlUQemxTQgYRx0HFaQ+ElBMfCUuIPtCdEIWlCyMLWWg/2O0vdjPMQSYsccMcPgIUimmPD3kHxASGZRtGrBsSocDHJCIvj078GwYHqUEqbvCK3AOhCLdYvi6iD4xiPN0Y3Se/SpoxhvzTXw4wwUaI5RASk6DUxCwzRx7V0Uf7mIc8iIi3PfbxlVwggyzJAAVavrKPSnQgBeEmRSFIsXDVq2L2PojFEhpzfI6EZCTHOL9KNhMG0Ixm/tCovxtw8muVmAQkHgGNSo2SPdz4YRBViUe7ncEMZ0inOtfJznau0wzwjKc8Z0nPW/bxCfj+zGc+mbAEJvhzCUpgQkCVQNCCGlQJREAoQonA0IY6lAg+8AFEI0pRivbABxftgUY3ytEd9MCjOwipSEUqg5CWVAYoTalKU5pJF1izk5bI5jYtMR0mJQc14aSjpsRyjSLSDZ3uTKcahHqGoRY1qOeUp1LpKUt78lGfUOWnP/2pBIAK9KAHTehCF/rQhlb0qxbNKEfH+tGyjvSsJ93BSVe6Uvzxz5rL8poltPmIRkxDSDZdlHTEOS2xlJOB6ASqO4eqhsIW9qhBVepSmepUKEBVn1L950CvilWDJrSrXZUoWMEqVrJuFKRnDe1a1crWlLp1fzfIRNfkSoltNuITvvH+JjY2s1donVI7++CpT+UWT6T6NrGKjSdTbWnPx0K2n1MV6FUpm1WFXhazDN3sV8WKUc9qFLShNal2UUpatp62mqpVlu0g4YhGPCIb4fHmsKZBNtui0q/Bc5tSz/nb3wZXuFCQwlONy199Iherl90qQwuqVehG16IYra51F2zWj2aXpGrtbmm/24LUrhZi2SzvIqgxluAQcL3YKJt1EAiY3MrjGhRcAhnuS1/BIjWw9zXDistQBjSoAQ1pyLGO04AGGpPBn8b9JxS4QGQudOHISC4yQAccYOhWcHBtI2TiFGxd7GY3rdwtrQxg0IK3hleuGW7EIsrU4Tiudzp8xS3+fKPoNlnG+M1wVioUzuCLc6yjHffoh5733A98rOMcvkgDGZ7AhOMqgQu8cMad3cFnPefDHehQhi7EsOTnPtQHY0BHO9jB6U6vgx2fDvWn0xEGBoPUwQ8uaYS1vGX9dbnC4XXYXB/hCEZQgjZk8fBNo4OhNMPGxCgGaNuUMNw4Gxue9VzDPfahZ2b3w9mN3kc+mrEHKBQan/1Uwh7y0ehuNxodtdBCQ7kaXTh4+9zP7scbPGpqK49U1aOdcJdd0GULS0quk6A1IxKRjdzm2sy0TY2vSwxf6hWOj8NN+Irvq3B6PiENy0Z3t/1xD1sQGrkATQM+JO7tfaBDDuRuaA/+4MBtjjf6DaZu8INXLeGVupreFdaEpLA03lonAhtBKktepYSabpTtbH8Bti8Vp4TGIrzhSK/nUyFu8mjnw+KRVYLGm+50W2DWBySn+p7XnfKVb5fl3n01vW8g8zlxoub7joZWwvKbnZ+GUj8nMVNMvI1CJu4JRs+73u3JBKZPfCDeprgfAprtqf9dIOeWttUf2oNta53ZKF/wqb0Odi3TG+Yt8N+c6BRAm3diMPpQZVlku6i359SUrxH69aDq2Nbv/fV8ZAIa8txofKBjHbfPB7T37A9nJJcIhufzPdBBfE2nO9r4+APjs97ofODj+dCPPtclj+pUf720rn615q/+xPkM73sS8JhJWDpMep7fZ+BNoTv2rt3fxzoW7/h8v/wfK3va73kfzQgoE6Bgi3N0ex/38AcDBXwb12i6MGBKMAa8wA6Bhw5bIFEMNXIlx2fKgAetoAcXqAcaiIFVQH3uhlbbxWqY1wKZ5wmdUCNek011pQiJ8A45MX6jZ1OfER2nB3Rzx1Me1Dj/NFWE1n4+yF/1F23IoH8CxQXMsHv94A/EUGDBt2cH6FxEwAXngIRJyAsQSAQS2G14oFEKRmVdR3mrtlZsNYIleII1cgkq6AiLYAjcIBBRIRYxOEqgQYPohxN09zhEADlT1U98uIORdXFA1k89WGiCGFkChQb+jNZo+UdVTECAjdZ7BNaEenaAluYDXEAO/vCI6yAGEYWFzMdnW5hRXviFXodlLadSZJgDDfMJqnJ2lEBri3AI2eAnAEJ+MjghdLgXNngTwLY9kZNQjKhchtiHxChVfWiMxqgEZZCI9zeE+kdQRviI6NAFBEUEY1CAfEaJUIhp2MhnrdADEJWFjbaFCcaFDHZdZmV9YHeKKJWKq9iKtgOLh0ANBPGGtpgNloGL56eLchcSwAY5PEAE34NVyjVZRJhcU0WEB5lcStAFzLhnxoBVS8AL0bYOY1CNYtCNk3iFDqUEupCJfOYPxjBR4giK5thZHgiGWMZq7UiCJAgBqnj+gq2IhuS1CIgQDQUhRHCoa6UHDbmIejd4YgA5PpVVlEZZkMx1UA7ZbRF5UBO5e/6ADmKQUD6ABhrZD7rAkSK3BxPngBnlBhO4Z3iwA+V4jpNHeSvJjizlkiSoiqyoKp2AhpOghogACnWkk7Z4U/oYTvx4W/7IU4xUjUY5mIRpWUvZaCNpWUvQDI94DktAlRnZbVl5dVpgDtHmDnCQUWMQlnoWiudYVtVXihEWhiLIljApCm+pKhCTb4yACJ+gDwbxhrlWKXrpk/sIlLwImOVTYARWmL5pmA+pZ4lZUD7QBe3wiMoAgT4QmQaoldElBMYAknymBxkVBpypbpOHaqD+CVqhKVohyJJr+ZKZh5rHEpez1pqcIA8HIZs6N0pSYpt8iZs1AWzIJD7jdp/OJZj6qVD7qVXOxQXB2Q9LeFk+oAS1QIWTCVFiYH9O2ImaRVFE8ArSuWffqFHW2W2vgEGCZDjoGFLd+W4QlmXgKQMuAAEuCZOj8AmjgSzx2AiJcAnquZ7dUWYf9p7R4XN9mZsnZjldZGBdxVVAep9MNqQA2m3EQFFVpQcT1w5woJxbcJWzAI6bNXITmoRRaqHXeQ/s0A5c2qV4Rgs/8IErZ4rgCQMpJZ4QgKKO8hws+oouagnhNxLd8W/uOSHRAHc5Op889UUz4KN++qcOZYnH2Wj+ymBkYvAKUzhxygBREdgFUHpRUwoHVeoPs0CWPXChVOcPyhAEYHh9aqllZlqiLWCiakohbUpeiQCnSiGjoudh7ikaNxp3frkRwOY5o6NZjOqcgOqnPqAFgxptJHF8IdkOY+CgPbAFDKpnUSpdPeAGk3qlO7CZWucPwMCpaBmCn6pSZmqmMjCqo5qmOTAKa/ocNkKTaginPZKToXePN/Ucd+pzvKOnJxY6MjAD9SpdFZWr+oqrygldPrAEAcpx0vaNFXWsydoPrwCpCltdzvqIlapRYHCd6CaSYSqa8caS3LqtW9atafqt4eoooKGac3Wu77AVt6WTcdiupkEN1DH+YiIBbCoURvg6szQ7pb6qdc92D6/AWciKoVxYjgw7qa0AUpjadP4gDBXrnWQ6oiilsdDEsWkKruIKDSF7Jav5CItwCSW7IX7JHa1afu7KsnvhsiABszIQA2crAxEFqTXbtlO6BL8qcTORD+TQpAm2tj2gBQebsBtFZT7AClXaD3cAUhHbbfhwD4ibuIibD8WQtJ4qhiPqtNtqpt8atTgwClQbGrniio/ACFrbGl1biylLDRPiKCGWpx4BbKhztu9jjnfLtrALtG6LUUIQt7wHePjQDszQCkIgigrbA1WwtwsWBMSAhPlgB4R7ncWABW9gB2+ABXYAvXZQBTMAYZX+V6ZNu7FPG02UG7VpermZW7qf4DWvyAicAA8+Ebow6KqzNQ3PgRqy+hGqy7po+5ld6Luyu7CvW7vdprvKwAzKQAt6AAZ+S1Z6i6HsNlY7IASWyWf7sA5bIFKFe3KqBqLXB7lMq73ay73QVLnfi7mn4b6qWQmQ0AidQBt9ob47SZs9aRqnK58aoboc/Jk0TMP822i0wG4JbJYH3GivsMPXtQNP+ojMYK07YAXclg9KrGdYoF2jubTZqq0avL0cHE0eDAHg+xm4wqJzCVvQch1fsb4s/J7QQTaoG8M8JT/c+1k13MYddcN8RgtufF3B222soMMNdgeTmsMihcT9oMT+JdfETry0GbyxG7xlVczBHvwAWfwZ5Oo1cwkKeZLCYSK6PEnG7BW/tJrGHCxSKoeOHTXH1wXHe5bDKdehO1DHjXbH2SUEDPjHS3y8JOXHgMzEaYnBTOu0iIzIicy9o/oAacrImMsZ4huXJHwjyxHCnDFH0eKGX1ujMpLJZ/wfaVw/+AMDnTpSn5yd23ldQWC7/WDK2TnOZiUEV8nKoQW4gKzE/kAOQDBStLzE/YAFF1vIujy5vZzPLQDMEADMOCANb9eTyHIJbmqThbACKoACJ2ACJDACIyACI1AIizAJnRANdzK2ZVansBqfu+gU1XzNLpDNIr1y39xtfDzSqcz+aLXcD+g8UliQxLXsD3e8VvEcyIVsWtkruficz9CUPzAQzP3MyAAdHS08vlcrZohgCIXAAiqQAgq90CZgAiVQAiRA1SvgCBV90ULyqqaBI5pMzSdGTfVTwRWM0p0aBOoAyyV30iMNBHm20neQVjvwA3dQgDHtzlhmBfag1racyzm9yzxdxdYM0vizz/3cz/8c0JvBpg7jfYqACIhQCAetAk3t1E+NApaNApq9ApAAHTlSo8/hkxzdjw4BbC01mk/sxKht1nOd1ivN1tksA1Wg0vIsC0AQBEAABFhADo5Wy9JGzyul13w9z9g7ubzMy4EtTYS9Pz8NzA/w3IlN1EX+bZ6tVWuLkAhJLdksgNCU3d3e/d2FYAnQIB346L5Ue5uk3RCqm0krRVrrOMioLdfwZlJoPdyyEN+pzXJq5dZ87XztoA7uoHu9DcjMZgr2ulJUsHErjQXcmr1TDNjJzb0+PeEtFdTPLdR3yh7DMiHc50n5VmssiAiHYAhKvdQssN0rkOIqkOIszgKS7QifgBqLIhrvShZkWxEmNg0tddMq5d5Zto4n9QOuXdtkCuTdxd/rfJ3r/MeZaODeJdwrfQX3rNMRzsHWTOEtpT8WDt3VwGuSseGPUq4xpU2OYN0hDtkkTuKSveba7eKFQOKHgNV3KsJ3Sh1QYRGqO29dxuP+fJ5SQm7ffY7kST7oSywT6pAFBy7FCT7cDH7IVS7YPQ3S+ZPl/LPlDoADXc4e3/SeYS5rbkRrjcAIizDqiVDqpS7iab7maX4IiFDqj/AJp+GuvQbDEGHal6c/htznhUwDx7nSshDoCs6ZKy0T+6AOwDAFhqyxW7boUf7oiTzhkv5dlF7pF/4ADhAJmZ47u1bMshZAj/DtZR7qjDDuo37mkC3ih8Dqra4Io24J0PG+aEbrpc1TL9dl9/zgDt7nNIAPBgEMfA4DQMDvbmgSBGEP7iAOskAFD47PVHAQWTDYEQ7tWD7tWT5vEOAAF37tXd4qDLLtbMp9chVA2rRN4F7+5mUu6uVu6qbO7osw7o9Q0bgY7x29EMD2aiQI8dEE2Au/8/cOAzwgC8AQ9EEfDI2e6xn712ZKA6YQDMAwDOLw9E8fDsMADLJgClRAAznP0zUg9EN/7Mkt8ZJO8dMudl323Bhv7diOGq7S8WD+8VjyMDFFCXI/CXQ/8rQW7uQ+6nrf8o3gCI9wCaYx3jKf3rHJU2xJgs5exce9vQufyDzP89w7AzUw+ZSf+FYe6Ti/3Ms96WJf8ZdH9l128RmP7dKhIhOza5xuJSDvNbUDQCJv93dv8o3Q92X+CJDg7qCxjzf+EMAWASNo+cAf/MI//NeM+cbP+Z3v+Z//+Yf/khj+//yk7yqm/+UbXro0wn10kiys3/qVMPd0D0rfDu60ZvuUgPs9p4vNzPuGf/iR3v7E//7wn8+DfeXFL/HIn/wtJXYwx/zNf6Jn7wAA4SBSNWzZuB08mC0bNmzUHE6bFi0aNIqgLH761EmjRk4dL328ZElkJUolJ52ElPJkSUugok3L9g6ePH379vnDmVPnTn/75Mm71kJoCwgtXLiAgVQpDKZLkSZlClVqVKpVrV7FmpXq06hcl0J1CvZo0qNlzZ5Fe9SoC6Nt2bJtO1TuXKEP7NoVaI2aQYQJFzJ0SA1iRIkVLYLCmDEjx46cQIYUaclkyUqVRLqchk0mTZs8PeP+9ClvmtCiRdOeBZv669PVTV2/1hrba1eprcOOxX1a9261b+MOhUt3LgQHD4rnxcat2/JufRUyBPxwsETqhi9i3NjYI8jI3T9Ci7YXHrx5NT97Dh20NPC3p9euPfverHze8t3a733f936hcIP3B1A4AQUsiigD10MwwdIgYLBBB+8yDjnl3lmur4Sgiy6wwSAqjCLrsFOsE+0cewwkTl6ippuZarrpPJ3SW9BBGWeksUYbb8TxgQcZ1BGCHnUE0kch7fKRSCAhRDJJJfGKMEIHnoQySiidpHJKK4szDq9IrEmum3coZM7C5zDMcEMOO4TmsMNCZIzESxrrZBpqsBn+jzMXX/zpmgiIwrFPP//0s0chBw1yyCINPXJJRRdltFFHlZTQyy+/rNA5hcbEMDDpppvIQ8MSw05E7TRC0UvOWrwztGkAZTVQVwnlEVZYgzTyUUaxPC7LXHfVtVdef/U1WIG06XLSSZlrzq9LLyWzzA2r81BNxBbbqJNPQIEoGxXl6ezOnuYBqlVxXy30x1hpPdRWdddlt11Ihy3WWErDFHPZvzLV1ExoPb0O1GspSu4dO73dR59wYxw3YRvdvdVXKR+GOGKJJ6a4Yogj0cYgeeVFNlmE7GWWzHz13TfNNUFJs5O9uhk4VYO3scGGF2amuWabb8Y5Z51nnkACnyX+4DnoFyYImugJjEb6aKWXZrppp5+G2mkQJohgQaIimGDqqLdeGgRJtJkQno2P7djjepdtdmQzI+KXooniTI68bl0sWJ7xmmtobb335rtvtjOyBBJHFhlFFMMPRzxxxRdnvHHHH19ckiuA4GGHHmqoHAgdPhklFMhFCcUT0Uf3RBRopKmGIG6+HE+msY1F1sKPQb63IbVJnuilaE6khpuZ5j7PJoPf4WYhTY9HPnnll5cu5UsmcYSRaTylvnrrr8c+e+23J+WHHb7vgQppSvE+fFCk0R5ladUEb86wxYb/9Xljl7344u1N+3a9L4FmmtVbpps+DCa2StXPgAdEoJj+sDG9TlyCEpDIBvMkOEEKVpB51jhFEIawwSEEQRXWwCARhtCDLOjFgoLZkEPiNR4Wtk5+YCqbAfGXv02ZSTD8g4nAzOOtngjwJz9pYRCFOEQiFrF1xWPgJSpBvAQ20YlPhKJzwMDBDYJhG97gxjfssEElqOIbT6QdXyRFxBdyjF4yvF/toKM8iNwQWzEBYKoKJkA61tGOd8RjHvMILnh0IxvTyMgl5FFGQhbSkIc0VjyC8YQiNLKRcojHl+IBDi40Eg+RRCQMJSUTI4rNkPRDINpElrwFXuKNOkQVD3tiE1a20pWvhGUsZTlAblADGp/gxABZaLc69XImu/QlL4X+GUxi/tKYwzwmMedBCyQYwZnOrAU9WEiPWRzBCFAIxzyKyMtOdpOFrnthDEMpymZFZ4EtyWEcVblOdhJMH33ERspCA64f1tOe98RnPvW5T37+hB62eKYzj8ALevxwHukggxGQQNB+9nMm3OxmGctWwPqBrJyAaUk0NKPOdnbUo6B5ZzewEQ1QdKJu8qCnwX6iUpb+sKU0WWlMYTrTl9ZUpjZFKT36EFAjJIEYBaUnP2phzVrwI6UxVWlDf+hNFxZSnDKcIYYimNGN7vCjV/VoweBJUpMazKtI/clRv0rTm5aVrGfFaU3BtQaeOoEZQLXHPOZhDikYwRb0ANdYj6r+1KUyFZzym6jZLKWskHEDG1RFJVYV206tipSrJ82rTOcR13qm1ayWRetlYzqPeqiBp1EgB1DDqlO7ijaslH2pUpkaP0I+9YBhNCxiObpY2vKksSMtad0MFtmyjhWzv9VsZmfKWc8GFLRwBRc9eGGEokY2talt6Gr/+rrAUhSqComtS6qaytp2dye3faxKJ+vc4ZbXvOKVbHCBS1Pifja0KA3rPMjRhD/gNaxkhW50/epJiU60icvKrkYT610CvyikuO3qWemJUsqedsHjNWiDGfzg9J73vuWdhzrO4F7kolTDd52wWffKV+nyl7rVheJhtTvgAhcYvLl9LkyTOlb+Gbt0pjUG64xvTGMe0yTDGzbue1M6WT/8FL5nxfGNVRtR1vbXta+VrVVb7N0Xd7U8Pv6qV6+s5SxvGcsy9jKXwdxlMsu4sxwer1fpQQxl4DWuXhVznGVK4v06GcUW8mOUuTtl2lbZHz6Mc5gFLWd9DPrLhN6yoQt95iDjFc40IUc65IroMqOXzt6c7tiqe0aE5HnFs+XzVaus2zAfesw1LnSWTU3oVbc61Yx+5nHTTBN91OPNp650jSF86TqH884H8bSAQR3qrB6Yq/5IdKCVfehkM3vZqXY2s2HtTCmEttnQxva1tX1hvgKRyZne2KaXQzw9E7u7ftZjutW9bnb+t1sfOw2oE5RhVHfXu9C3DvGSS2xnZJH701I2N1bRbW+CF7zd/PADT5FADHrTkbP1MLgdS61kfq62dSbW9ET9LWyAB/yjA494yEWuD6HydKANF+A+Ij3yOoJ5zvr+dmuZs/HtenyxIGd5zt3ND11YM6C24Icd6aEMcgSd5abmLcw7Ce6Mj5sb5ba5wI1d0j/r3Ors5gcxksDTQNDDjvXoRZuvfu8rd7uv+/Y1zVkc9WJvlepjh3se+cEMJ/C0D3acex/eOvZSJ1W/aAesl57+7z2zfZ04j3vi6UFXnqpBHV4XIM/XENq4l2e3L3eoxZluLHgMnuOFNzwPEZ/4uNv+g60BrbbRSd6HM6hD9XD/8pHNbvEmc97zNQ99R1/8iaqTnvT8gPczmzDvOppBDfbwfR1n7fdu0/6vfTTl53Ov+6nzPvm/v4XJeWF0fpDDCWqoxz4s7/tmm93bgIc+4afP2Or3/vpjz3ozA3oL7vPiCHxA/vuVj2/zOx9+3Yg+3Fs/Vdo999M/nZu7ugso/Iu8nfqD19M/LzM/iMK0/wvAtRtAl3E76zvAq+OHdDADnjqDdAi6etgwXIDAA5TACaTAiLrAYctAA9tAA+zAnOMDnmoCZuCHBLSrFOzAsluw5lutQXrBjotB9Gi/GvTA7AuoI9CFHey5I2A4JUw3blP+um16hyIEvSOUQcdCDBqkwojjB16Qv2cChB3cKSQwBh8MQ2xjQSMiQvXjwgCawTZkOR4MKPCzhw1LgmZgQzu0Ql4TojiUvjkMniS0Q5H7wBA0LnN4hiYwAtD6wzZcwdkbIkIUQEO0LURMRJG7wSZUhp4zAikoh0kERPO6wjrJQjnUxE2sw04MOX5gwoDqg9MbQVOkRFWbwBbCRAxsRZB6RVg0OH4whq0LqCSQvzUIP2GsQgbrv11axUL8xS7ELQ5kRoLjB8bjKTOsiWvco/yavUv4BGmcRmD0Qmv0RnfbB9PbxmcCunTUo/KjuH2CBy0sR2okKXSER6wLhHY0gpP+20d1gzDmqzh7vEdzrEYwDEi5I4YyDKjhw0V4lMAg1CdtMsiDLMCFPLhyiIJ2NAMS1Mh0Kz+KrKx6ZMV7LMA5Ckk9KpjTs7tuXEl2mzXZi6mLRMn2U8mYxCN+6Mdt7IWI1Ekv27WaPMlyTEmd1KP420YUzEmkjMdb8y15sEmjxEmn3EmO3EY1cAegDEoxYzCDmcppPEqrtKOW3EYk8EOybLeZBMuiFMuqVMs64sl2DASYjMt4/KorC8tfHMu7LJhP5CkpAMm7lEnkk0q35Eu4vEt+eAYFVLjta0rCxCPLO0xypMoZjEyn3AdZ9Ecj0EquJMzKzMTLPMceWkwN68z+heOHzJTMOxJNX0xMzCRMfjgGh9zGu2PN1my5vWzFlJSl3wTO4BTO4WQlewBMf2wCZ1hN4mTO5nTOV1o3n+AExOxNnHzO68RO4Jw7SOxMZwIEFsnO8BRP6MQj8eNNTfTN8VTP55zLgDqDusJB5VzP+QzPOzJP6kRP66TP/fzND4RPZ0ICZvAFnwuo7+TPAyVO+5yH8zTE9ETQB93MWyBQz8wHd/hP4ZNPCNXQ4NSH6bTMt8TMDT1QfnAHRnwmFPQHCb1NfFhOEXXRVupQ/GxQ/XzR9eQHX3BIJziHHSzRs/TDGq3RP/PQ0QTR0gRSG3WH4nom3NzMYzDGPLyHFj3+UggVUhmdQwedUuykTYdEgmNYpX3IB5d8piP4ySzV0Cr90Ng0UjPV0nw4Ts+MUlbiB2fgTuNaByllU/pEUyJV04TM0+vkh2ZwSDLFU1mcUGfqA3v40j9dzz2FzeoMUUYlTn5w08Bkh0LFByALKCTwBTyV1PB0VBjkQiz91P6kU56iP1ia0zqNtTst1fEMVSOE1DV91eAEhLY6h0VtpRQ9VCPgA3zQ1VptzljdwhmNVGFV1XNwTO/sB0+1CX7ABzEVKFy4CWR9TmI9SITMx2C1Vla61WP8UVniB3RYVmdqgnDtVuLE1mwl1W7lB2XlKT7Ih+D0B2R40lhDB2dN11j+WleMpNF93YdvfaYkQAZ9baXVVFGeMgNXBVjg7NebPNZ0fddylVeDPdhobUc1iNOGlaWHJU0/BdjVFFgALdhJbQdNXUAW5Vh+jdE0nVWQ3Vd/gNc8BFbm5Ad2uFCB6oONXdldbVk+fdltBdieGFmF6lTnlNly/cczWAdubViPLVKY7dakFcGaRVpnUFojMAN08AeLtVao7VOhTVeiVbijvdY5zVonOIZq7VmwDdovjNmZfaYzsNqzxdp2TAJAuAen/dqffdT8jNhaJdtNNVvs7Nq7bcczyFWvLVW3BVxaRVaqdc+6Ndx3NdG2woV+4NtXdVxjhVzBDViFOwbGHc7+rmUHlG3CNSiHrhXOrnVdfnjd2IVd2NVTvxXVI2zXT5XcZ1qDfNhcpG2HPuhVZ3ICXPDd5ZTd172HdnAHZ2iG54Xe6G2Gc2Dem4Bd1s3Ozr3Sf23cfihagiXdYc0HXLjXJjyDZnDdCnXeXriFQOCDNTgDM5ACKXCCJrDf+8XfJnCC+T2DNQiEXmiGvaXda7VdWX3chPzSVVLgzmBgtl1gB27gB5bgCO6MZihfPtBcCtbgCZ7g1WyGnH3IPnhf+a1fJBje7vRHJGgCM+ADXwBW5IXgGO6JnhjSv/VcBGbgBN7gHZZhHp7gm6jUY0SGGabgH15gI+7aexBeFGbiJu7+TiQwA+M14h2u4duNwQLUYSLu4S2eYi5u4JsQ1Hj1XR/m4Rx2XX9o3l4ABCk4YSd2YxS+v7rVYg7ehyo24Bve1geu1i7mYzLuYX8I4oEdYj8+YlbKCdjth3PwBdajX9t8Y4VKAic4g0nmg0Cw5EvGZPdVgzNwghPuXS3mYhq20lFtP9CYYSI25VNukVVOZVZW5VaG5VMOY1rMYFN25T3G5UPGh2bABfh1Akd+5FH0BWc4h3NAB3Zoh3bAh35g5mZ25n3Ah2Q+h2Y4hkA4g0P1hT2OZVau41HG3VI+ZVR+5XG+5W0253G+B2nV0XEm53DGiV3uZSlogjY+yygAZuH+WwNf0NxD9ozr/Yx+aAdnCATHVANgFedyFmWXPeA8PuhzRuiHdmhb9ocB5SlAKOdcTqV9OId4nucmRoIoUIM+6AVkcAZ0cIY+uGeBkoJAaFpYhuhU6gd06IWORIJ2aGh27maFxuMvjOV29mmI/ulU9od7UFLizVVt5madaIdj6AMz6GQmbgIp6ANcOIaSdgff1Yl8cAZp3cYjiII+QF+JbmdXzgl02DCuDWoituNi3d4ZlGikjui0BmpWPoZDvYWk1macQIdejoLy3UZJ7oNhPod1wOrvCud7QIaiRs4zwIW9zYmk9mmcaAc+YIdXRpVbXuts7SG3due5jmvPfuX+dbjcUbRpVE6lc7Dmp/bHJDiDwHaGcmiHwn6RyB5qZOCDlFZpPjgGg25oiG6HfcZroc5poF1onjbtz0ZuucYJXDhUXBBrnEBtTh5er14DXEAG6pXtt47rdz5pv97GJJACQHCGfdZujI7si85sdgVn0Gbv5G6RdejIgDIDmz7t1O7VI5DqYV6He+AuuFZud86Hc7iF+EbhFW7h0p7tvDbpWhZrzPbmK17v/25vCe/JZ+JUpe4FNVBtCzcDQKjqdeDtx5bw7e6JdTiG227iJABpD18H0DsHKUCG4Mbp9PZXzr5s98ZxdpZbZzoDze0H27bnwOyDY6Be8s7xCeeue9j+6Gt24kg2PkAIhGNAhmO4hTXo5Kb1b/R+8AzE4ptG8iMH5OAzV2S4h1swg3ttgnx2BhA37BF384cOaFxgcjc+AhVOAp+TV/emcYgtTTB/855GBtt0gjWIAp87AjMIhGZAB8cW8T93dITuiXZQ5DXwbiZOglz974Qm7p3mvSMk6tTM5yLX7FS6B3RAhirP2naMgrBmrD3/WIbOQIrGwT64bkbX7OApdWc4hl7W8Pz9vl5oad1z9aiF9fVrh5xVW3TI7lsnwHtwB3SA9mhfdJ4oBzaYgzwYhMoOnmEPW+Nev32YxWll9oBbhjpwhV1IhmRog3TY9i0fwC5fvx03Arr+HXdiywc2SIZcSAZYyHdCCPEX4fa37fTQY+Ywx8EhrvdQK3d8mINfEIRfwAcv0HbbCvjiHvioWwdfaOlA56k1MPKEL7BfgAV8oINB+IJn8AcvYHf0qHhOZ7t+qPJm0NyTbStnAPlQK4c4cAc6WIZB+IV7iAME/66Wb+s+9zhkoN+1XW67vvlQ24eH34V9uIdioINi+PjHJnpS5mxiQwdK79KcOAdW1Vpbb/oCw4dYaINd2AU22IWrx3p3/3Zw5jN8GOieQnh/wIc3TQJfKHtiu4dyWIZlKAe3f3udLnoE5rNmMANrcoK7n+hD9fi+x92s/+atJzB86ANjlAJMxwn++K55yZ98uJ8+ePeuD55btMaJfqjwZ7oF0A99w9d6o++ufsCFOl0Dsud4+f5318+94bbhwy/2xVoHNSjD29+JdchZguX9K6Z8CLd8xTJ93iV71b9Ntma7fYiGN3GMd8AqfQAF7RekgPN9K+ZyuVcsX7jXNdj93G/V2pIHaAB/aNAHj5KHE1gACqAABQAFrHoHEbh/CgAIBtT8ESxo8CDChAr97eMEKhq2d/L07Vto8SLGjAn36YPXDVs0UJ80Xux3K4mRlEbW3EOILorKlEl8kcQISkODChUacIhWsyC8EAEMGADQ6efBbhkEGCgwYBrSqA0fRpxYMSrWrAw7fgz+OVKrP5NHYqppeRAfn5gp+fQDa5DRUKIGBFSKCk8EAQQIBhzN2m1DAb0FoLrFOBWiRIqFF1/k6BGkSLD3+CCJKWVdQl9jY0bBvHhfIQF69QpQZBevXr5a/wZGUGAg44WHqyqObdug466Rs/YLtDmlFHQJnTVROzN2txF5RxNIIQ/p3eWq/QIWDPv2wdmJr2K3nRvy16gmK6ts0ixhuzNqjQBqyzhahtaCO1wnGT11X6ysrXfP7hCxVf15xxV4WO2Dy29GIIFLQv0Asp4Z7thWSQIHIMDAAggcwEB49qG2V35R7edaff1pF6CAjH3nFVbIkKcSWwn1kqARTjhzGyL+AyBgQAcbGLBXXT/dB+Jq1ZGYIkEn1oakWyvu9tM6TqhlBj4JNfNiSkj0cps8J+g4wCEr5DUAItxpNOR0+hn5GpNKmslkVk52qFE+acVk43BSqtWHe7FRw0EBG15yiI4FkNCNkB+mKeKaJXbnJpxNEsjiT8ckeEQg6Kk3pYS3ddLAAQZkgA1cO2ZAmELvOFICByZMMpGiIRa0zyeIiLABCo5kk9CIbMLzyAkemOAIohdNwwgJHZCAyCdv4vYfbc5G+pOcP6Wn1hn5IHStWk4Ih50jhXrwziUaHqCArAZVooECBhBwwAIhdFKCdOlCM0IDChTw7gIXIPKcQb1iA0r+BwscwO8GoCz0zgoWLOCuAQlUoAI8CkE6bZyTPqmRpTGZt+2mHiPTnT4r6EiACv50QsGPAzii0CP6/qhhUx1gMPOi/kxiQQGBWnjAAYFRHLCRByDSAQEGWKhhARf4hBA1HwQNNNWBlVAxQhdjLJXGc150jxpqAQLyelr2l80HgQmwiD/TaBAYASzog9AnFCxnLtAJJDDaop3w/DPVegH9b0EjIpBh4KMZ4AHWBckTwrt4L23hItJCu93WBnZd0zkoqeSEZwVxG9OCfd4GygVKG2CJP/KYkFcBIxRbkD4n3G0ABSFgAPRoRBI0pKiPWOKjXj+GZzjQDIyggYaCH3D+iZmFKK1hB5dEg0KFGjKATUKXo5g5tZuT1IxafBx0jhRl42L6bZMofUAFCvsT2o4WQHPQyjMTQAI18LzDQvPwUxBGJOBHB8AANCrCjRC0pgAmwBryPBAN/yFCAUszAAkA5g9q8ExDF4CN65p3AEY4y3tLAh9JqjU+j52nIMcojloWJK3Y0K8AHuCePxwxvQGwziAs0NGONoAqeYgAiL7TxwiASIBHGIQTLNOLAmAzIniFRx8kmNkBErArghSiQkCDhEGi8cQDeECDBTHhDFEoG/Fp5By/kYK2/LEOyqwnCb1g323gQa+9qGAeBLmEwRCwNoNwwwPSYcRBJhFI30H+AwOBOSAOCTIPyAkGEhUZkQFUYMZPVGBmBeAEQfRRnQNQYHYE6YABFcANhKBRjTVRIZ3sZAQ1yBEQMFRLFJqRRsZMIz6CRCRB3AY35xTkE6nTkALkV5BGtmY6kAikAR54kBVML5PP6VUPZ4U0wR1ibtCowCNP4EeDpMBcCPBaK12pEVhq5B6BQEkSpJAEGhnhCHwIXYoASbVsvoMEsOtAJC3BAAvxaIsFeUesCKKC5RSgcgdZRPYOsIFV9gpVBTEBFon5iEAeoBFvcoTBLDQJVlIFc+rMCDs10o91vHM9wEFGHJm0CB0ZoAL3K4jJtKdMRDDUBO84iDyUI0B/kED+iSPFXyc1hIFd9cpRhogo4/zx1J8xAhvZwIZVs6GIRSbiTek8aWPY+JOV3kIKm3ECH45hFjjJAwXiMqg/GCGdbBoiAHohQDcPAg+hEulx0vEa6lpzAKg0FSEg/RkHKjaCmSGAAhd4LGQbsDe9IGJuTSzp98C6xsdQykD3aMc62nGPmEYqGx4IDI8gYYnVXiIF2SPTVQwhGgQQoEx65atqgiIdZRazg3vxSWEPcokxJtYf2yxez5JbACwazbJnxOwJNbsRsUqXJPmDIgOyy4AGLGCysSuWbO9qW4PstV7+0G1qeEuQT/iWAMBtFCuJW7Hj9k5yVGvuQb5a3axRd7/+GAnXaEIll+kVDwOECS9txwsU3B4FvXtRrz/Y2xr3+iO4TZSvce82gkMgIgUf8ACIQ+wB6OUXuruUbkr9axHQzLa+Ls5iXxBc2zeVV4AOHgCEJSw4wsL3IJAYqIaKu02gWUIf+piHPOAhjyUz2bnPBVB0VbwVzm5MygvpBmoO0IATJAIRXkaEIgCVmpdJdbYFQEHjCEJE8+6jqHcNkkF0fECm9tggFfzZCZ6DgvuC8if6tXKKrYwQ1P2oAPQxMqL3oYjlxG1uj2heAUKwSvIymCAomC0BPHqQw1IPURYuyJ4FJ7f5RbSyfjaxoGfV31QbxBLNG4AKnEwQSwTyu/7+uEQDDEiBmxZEmENNBO8KkII0z6+aJ6hYr/pskNMWjxIEqQQDDDgCM2bkz1IONKsJkiO9BIDMB5nGKC3gk2i87a5HLQiucdaXdAd50kniawEecUkjGcDUBaHGBR5pgKdNo4Pnsmi1Uc1qbLO6rTrKorIN4jog8tAf8zCBEkvw04Kk4G7TyQYHlmOAhEMj36N52hQt4G5/KMKC1Jv4PhgouDzXxNoqJniq/4RaDDwNIfQTJNviSmADkJAgz2RsmqRnoQJ8YNL72PPQr0YQwxkAzes95o4W4VxKRFsvCWDBxANmOYGnGuaC5kQg95f1TU+vOc+hRrk1lIATQOIEixz+qj+YOZoPcCIaKjC5hY5nJLV/4BErqMDkGhBJhzNb7RlQBCUSf4gOiIDaBHG5f71uZUfMdgCFmCEncr0jDuBwEQS2UIaUtgAFwN0fiNhR8xhAgYgWgAUa3M8BOJBreGWPZj03CCh8GyoFLKD3+kLA2J8crWxLXsX6UIEAgEYAMCoEG0gL1QLk16VACU5pRC9Evg8ggBDVzmcCvq8ITNnxQBVgVUD7/AFGEHyCdKKT9x2w0rzmD8jvt/j+RVsBKtSAdDnudXtr+O+cwH0FGTb0UsQQQML5gz4gAkfxjgIYQvD5zY+sTjaEwAAigAmY0kFQwwmQXn3pzQXIH/1Vl/3+7Vc3PAKYIQIlENtBfIIhKIIiHAKvKeAlmMAFYAAJTMJPvQMKKgIi1NysUAMijMAFZMAHGMI0yJo/ZIMjIEKX7Yo8OMIIMACugIISHoQ+TAMkrIAIhEAIrEAjgAI8bB2UnZhmlWD97YMamiFFrCFC6MOSzQN3rKEaWgySLdkVJokbJsk8KFkeTpc8IFmUXVYZEt+qZRsiotAIotghJqIjTssinmEjPiIlpkgkghUaVqImusUlnpSTQNgmhuJtOMQ0ZINJdR0cvgNIQAMoiqIrFkYngEIpnqKgcYQ8vEM2TAMr0iEv9qIv/iIwBqMwDiMxFqMxHiMyJuMwdgI0zGL+ZgFaKnLDNIACJ1jCJDSCDxqCIRQCN3ajN34jOIajOI4jOZajOZ4jOqajOq4jOWojIiyCI0zCJXACNFADN/ihGWIiHMIDN1ADNHTCJUyCIyxCImwjOx4kQiakQi4kQ6qjIRxCIsAjJXBCJ0DEPcpDHQ7cPn7ENHxCNUKCIzBCInTZl5WkSZ4kSqakSq4kS7akS74kTMakTLZkIigCIziCapFiNnQDPMhhPnqiLb5DP0KDR1oCJUDCIziCUi4lUzalUz4lVEalVE4lVValVV4lVmYlVT4CJFCCJXDCJ0SDPW7HT3riRmaDP4JCJ3DCJayWW74lXMalXM4lXdalXd7+JV7mpV7uJV/q5TzGoliaIj4mIkecJTVMQzSw4icsJmM2pmM+JmRGpmROJmVWpmVeJmZmpmZeJihAQzRMAzXsJD6WJVAeWZJ1Azdc1WFOA2u2pmu+JmzGpmzOJm3Wpm3eJm7mpm7uZm5Sg1Vxwzv4YRs6ohqapv90A2qmZjYsJ3M2p3M+J3RGp3ROJ3VWp3VeJ3Zmp3ZaJzdwQzcEp3BmJGEWJxwmGTz4zzukp3quJ3u2p3u+J3zGp3zOJ33Wp33eJ37a53k2WRuS5hmuoZHdIZMNKIEWqIEeKIImqIIuKIM2qIM+KIRGKH/2p3+SIB0iGoZmqIZuKId2qId+KIgphqiIjiiJlqiJZigvviJDKCOLtqiLviiMxiiLMoSK1qiN3iiO5mgiBgQAIfkEFEYA/wAsAAAAAP8A/wAACP4A/QkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezLmz58+gQ4seTbq06dOoU6tezbq169ewY8ueTbu27du4c+vezbu379/AgwsfTry48ePIkytfzry58+fQo0ufTr269evYs2vfzr279+/gw6iLH0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqOCCDDbo4IMQRijhhBRWaOGFGGao4YYcdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWaeSRSCap5JJMNunkk1BGKeWUVFZp5ZVYZqnlllx26eWXYIYp5phklmnmmWi2FBAAOw==)\n", "\n", "What is the ReportLab PDF Library?\n", "\n", "This is a software library that lets you directly create documents in Adobe's Portable Document Format (PDF)using the Python programming language. \n", "\n", "*tip*: the Reportlab Userguide, https://www.reportlab.com/docs/reportlab-userguide.pdf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Canvas" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "Canvas?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Make a Canvas object, bottomup=0 will put the 0,0 at the lop-left (instead of bottom-left)\n", "c = Canvas(\"pdf/reportlab-cheatsheet.pdf\", pagesize=A4, bottomup=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Add a page\n", "c.showPage()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Save the PDF\n", "c.save()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Shapes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.circle?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.circle(20*mm, 20*mm, 10*mm, stroke=0, fill=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.rect?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.rect(40*mm, 40*mm, 10*mm, 10*mm, stroke=1, fill=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.roundRect?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.roundRect(60*mm, 60*mm, 50*mm, 50*mm, 5*mm, stroke=1, fill=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.showPage()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fonts" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Reportlab comes with a set of fonts\n", "c.getAvailableFonts()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.setFont('Courier', 72)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Or you can import fonts\n", "from reportlab.pdfbase.ttfonts import TTFont, pdfmetrics\n", "\n", "fontpath = \"fonts/OSP-DIN.ttf\"\n", "font = TTFont('OSP-DIN', fontpath)\n", "pdfmetrics.registerFont(font)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.setFont('OSP-DIN', 72)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.drawCentredString(105*mm, 50*mm, \"Hello :)!\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.showPage()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Colors" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Choose a RGB/CMYK color\n", "\n", "# Fill-color\n", "c.setFillColorRGB(255,0,0)\n", "c.setFillColorCMYK(0,1,0,0)\n", "\n", "# Stroke-color\n", "c.setStrokeColorRGB(255,255,0)\n", "c.setStrokeColorCMYK(0,0,1,0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Or choose one of the embedded colors from Reportlab\n", "from reportlab.lib.colors import pink, magenta, red, blue\n", "\n", "c.setFillColor(magenta)\n", "c.setStrokeColor(red)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.setFont('OSP-DIN', 72)\n", "c.drawCentredString(105*mm, 50*mm, \"Hello :)!\")\n", "\n", "c.rect(105*mm, 150*mm, 50*mm, 50*mm, stroke=1, fill=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "c.showPage()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lines" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Images" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }