{ "info": { "author": "Dirk van den Bekerom", "author_email": "dcmvdbekerom@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Science/Research", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python", "Topic :: Multimedia :: Graphics", "Topic :: Scientific/Engineering :: Visualization" ], "description": "\n************\nOverview\n************\n\nThe ``pypdfplot`` package is an extension to ``Matplotlib`` that generates a PDF file of the plot with the generating Python script embedded.\n\nAlthough ``Matplotlib`` is a very powerful and flexible plotting tool, once a plot is saved as PNG or PDF file, the link between the plot and its generating Python script is lost. The philosophy behind ``pypdfplot`` is that there should be no distinction between the Python script that generates a plot and its output PDF file, much like there is no such distinction in an Origin or Excel file. As far as ``pypdfplot`` is concerned, *the generating script* **is** *the plot.*\n\n\nThe way ``pypdfplot`` works is by extending ``Matplotlib`` with a *publish* function. This function saves the current plot as a PDF file and embeds the generating Python script in that PDF file. The Python script is embedded in such a way that when the PDF file is renamed from .pdf to .py, the file can be read by a Python interpreter without alteration. The script can then be edited at will to implement changes in the plot, after which the script is ran again to produce the updated PDF file of the plot -- including the updated embedded generating script. \n\nSince the resulting output file is compliant with both Python and PDF syntax, we will call such a file a PyPDF file for the remainder of this document.\n\n\n\n************\nInstallation\n************\n\nVia Python Package\n==================\n\nInstall the package from the PyPI repository opening a command prompt and enter:\n\n.. code:: bash\n\n pip install pypdfplot\n\n\nVia Git or Download\n===================\n\nAlternatively, the source files can be downloaded directly from the GitHub `repository `__. After downloading the source files, navigate to the project directory and install the package by opening a command prompt and enter:\n\n.. code:: bash\n\n python setup.py install\n\n************\nQuickstart\n************\n\nThe ``pypdfplot`` package is designed to seamlessly integrate with ``Matplotlib``.\nIn this section we will go through a basic example that shows how to use ``pypdfplot``.\n\nSimple Example\n==============\n\nFor this example, our goal is to produce a red plot of the quadratic function from -10 to 20.\nTo start off, we will first plot this in the conventional way using ``Matplotlib``.\n\nCreate a new python file, let's call it ``example.py``. \n\nOpen the file and enter the following script:\n\n.. code:: python\n\n import matplotlib.pyplot as plt\n import numpy as np\n\n x = np.arange(-10,20,0.1)\n y = x**2\n\n plt.plot(x,y,'r')\n plt.show()\n\nAfter running this script, we should get the following figure:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/plot.png\n\nNext, we will use ``pypdfplot`` to publish this plot as a PyPDF file. \nIn order to do this we need to make two changes to the script:\n\n1. Instead of importing *matplotlib.pyplot* we have to import *pypdfplot*. Note that ``pypdfplot`` wraps all ``Matplotlib``'s functions, so by importing *pypdfplot* as *plt* like before, no other modifications to the code are needed.\n\n2. Instead of calling *show()* we have to call *publish()*. Note that *publish()* can take all keywords that *show()* can, in addition to some new keywords (see `Classes`_).\n\nThe code now looks as follows:\n\n.. code:: python\n\n import pypdfplot as plt\n import numpy as np\n\n x = np.arange(-10,20,0.1)\n y = x**2\n\n plt.plot(x,y,'r')\n plt.publish()\n\nAfter running this script, if we look in the folder where our ``example.py`` file once was, we notice it has been replaced by a new file ``example.pdf``.\nOf course the fact that the ``example.py`` file disappeared doesn't mean the script is gone -- it is now embedded in the PyPDF file ``example.pdf``!\n\nWe can find evidence of this by opening the ``example.pdf`` file:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/plot_pdf.png\n\nThe table on the left shows all files that are embedded, and clearly ``example.py`` is there.\n\nMost versions of Acrobat reader don't allow the embedded .py file to be opened for security reasons, which is probably a good thing.\nTo access the python script, rename ``example.pdf`` into ``example.py`` and open the file.\nThis is what we should find:\n\n.. code:: python\n\n #%PDF-1.3 23 0 obj << /Type /EmbeddedFile /Length 124 >> stream\n import pypdfplot as plt\n import numpy as np\n\n x = np.arange(-10,20,0.1)\n y = x**2\n\n plt.plot(x,y,'r')\n plt.publish()\n\n \"\"\"\n endstream\n endobj\n 1 0 obj\n\n <...>\n\n startxref\n 8829\n %%EOF\n 0000009410 00000 \n \"\"\"\n\nThe first line is the PDF header that helps the PDF reader to determine this is a valid PDF file.\nIt also includes the object header for the EmbeddedFile object of our ``example.py`` file. \nThis line may not be altered, as it will result in corruption of the PyPDF file.\n\nWhat follows is our original python script, followed by a massive multiline string. \nThis multiline string contains all the PDF objects including the data for any remaining embedded files (see `PyPDF File specification`_).\nMaking any edits in this string will again likely result in corruption of the file, so it is strongly discouraged as well.\n\nIn between the first line and the multiline string is our original python script, which may be edited in any way.\nFor example, let's give the plot a title and change the color to blue:\n\n.. code:: python\n\n #%PDF-1.3 23 0 obj << /Type /EmbeddedFile /Length 124 >> stream\n import pypdfplot as plt\n import numpy as np\n\n x = np.arange(-10,20,0.1)\n y = x**2\n\n plt.plot(x,y,'b')\n plt.title('Blue Example')\n plt.publish()\n\n \"\"\"\n endstream\n endobj\n 1 0 obj\n\n <...>\n\n startxref\n 8829\n %%EOF\n 0000009410 00000 \n \"\"\"\n\nAgain, after running the script the ``example.py`` file is replaced by the ``example.pdf`` file.\nWhen we open ``example.pdf``, we should find the updated blue plot with caption:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/plot_pdf2.png\n\n\nEmbedding Files\n===============\n\nIn many cases we would like to plot data that is stored in a separate file.\nIn order for this to work, the external data file must be included in the PyPDF file as well.\nWhat follows is an example how to embed external files with ``pypdfplot``.\n\nWe will write a script that opens data from an external excel file and reads the title and axis label from an extrnal text file.\n\nCreate an excel file called ``data.xlsx``.\nFor this example, we will fill the file with the first 10 numbers of the Fibonacci sequence:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/excel_data.png\n\nThen we create a text file with our title and axis labels called ``title.txt``:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/notepad_title.png\n\nFinally, we create a new python file called ``packing.py``. \n\nAs before, let's first have a look at how this script would look using ``Matplotlib``.\nWe will use ``Pandas`` to import the Excel file into Python.\nOpen ``packing.py`` and enter the following script:\n\n.. code:: python\n\n import matplotlib.pyplot as plt\n import pandas as pd\n\n df = pd.read_excel('data.xlsx')\n plt.plot(df.x,df.y,'r.')\n\n with open('title.txt','r') as f:\n title = f.readline()\n xlabel = f.readline()\n ylabel = f.readline()\n\n plt.title(title)\n plt.xlabel(xlabel)\n plt.ylabel(ylabel)\n\n plt.show()\n\nAfter running this script, the following figure should pop up:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/plot2.png\n\nIn order to use ``pyplotpdf`` to publish this as a PyPDF file, we change *matplotlib.pyplot* to *pypdfplot* and *show()* to *publish()* as before.\n\nAdditional files can be embedded in the PyPDF file by calling the function *pack(flist)*. The argument *flist* is a list of filenames that are to be embedded.\n\nBy calling *cleanup()* after the *publish()* function, the local files are deleted after they are successfully embedded in the PyPDF file.\n\nThe script now looks as follows:\n\n.. code:: python\n\n import pypdfplot as plt\n import pandas as pd\n\n df = pd.read_excel('data.xlsx')\n plt.plot(df.x,df.y,'r.')\n\n with open('title.txt','r') as f:\n title = f.readline()\n xlabel = f.readline()\n ylabel = f.readline()\n\n plt.title(title)\n plt.xlabel(xlabel)\n plt.ylabel(ylabel)\n\n plt.pack(['data.xlsx',\n 'title.txt'])\n\n plt.publish()\n plt.cleanup()\n\nAfter running the script, the output file ``packing.pdf`` is generated and all three files ``packing.py``, ``data.xlsx``, and ``title.txt`` are deleted after being embedded in ``packing.pdf``.\nThis can be confirmed by opening ``packing.pdf``:\n\n.. image:: https://pypdfplot.readthedocs.io/en/latest/_images/plot_pdf3.png\n\nTo maximize integration with ``Matplotlib``, the PyPDF file is checked for embedded files at the time the ``pypdfplot`` package is imported. If embedded files are found, they are extracted provided there are no local files with the same filename. If a local file is found with the same filename, it is assumed this is a more recent version (e.g. a file that was extracted and then updated), and should therefore have precedence over the embedded file.\n\nIn case you want to keep the files that are extracted from the PyPDF file, simply comment out the *cleanup()* function.\n\n\n************************\nPyPDF File specification\n************************\n\n*This document is work in progress*\n\nThe file generated by pypdfplot is both a PDF file and a Python file.\nIt would be more accurately to describe it as the intersection of both speficifications, i.e. a PyPDF file.\n\nA PyPDF file can come in either Class I or Class II:\n\nClass I\n=======\nA PyPDF file that is unedited, and therefore compliant with both PDF and Python file specification.\n\nClass II-A\n==========\nA PyPDF file that has been saved (likely after edits) by a Python editor. It should be expected that the offsets in the xref table and the xrefstart address are not pointing to the right locations anymore. The *filesize* entry in the trailer must still be at the second to last line in order to qualify as Class II-A. It is assumed that only the Python script has been edited, so the offset difference can be retrieved from the difference between the *filesize* entry and the actual filesize.\n\nClass II-B\n==========\nA PyPDF file that has been saved (possibly after edits) by a PDF writer. The '#' at the start of the file will be absent and the generating script may not appear first in the file anymore and could be encoded. The *filesize* entry will also be absent, but the offsets in xref table will still be correct. This file can therefore not be read by a Python interpreter. The file can be restored to Class I by retrieving its Python script via the /PyFile key in the trailer. This fix can be applied by running *pypdf_fix *.\n\nA PyPDF compliant reader must be able to read Class I, Class II-A, and Class II-B files.\nA PyPDF compliant writer may only write Class I files.\n\n************\nFunctions\n************\n\n*This document is work in progress*\n\nDescription of the functions\n\n\n\n************\nClasses\n************\n\n*This document is work in progress*\n\nDescription of the two classes\n\n\n************\nChangelog\n************\n\nHere we list all changes\n\n\n", "description_content_type": "text/x-rst", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "pypdfplot", "package_url": "https://pypi.org/project/pypdfplot/", "platform": "", "project_url": "https://pypi.org/project/pypdfplot/", "project_urls": { "Documentation": "https://pypdfplot.readthedocs.io/", "GitHub": "https://github.com/dcmvdbekerom/pypdfplot" }, "release_url": "https://pypi.org/project/pypdfplot/0.4.1/", "requires_dist": [ "matplotlib", "PyPDF4", "numpy" ], "requires_python": "", "summary": "Saves plots as PDF with embedded generating script", "version": "0.4.1" }, "last_serial": 5532655, "releases": { "0.3.1": [ { "comment_text": "", "digests": { "md5": "eec05ee379a185e29ed0e4a00f3bf993", "sha256": "9fb9886128852cfd6c19f97afc4d36334f685286b00b0fa6b05c14cef82bcd49" }, "downloads": -1, "filename": "pypdfplot-0.3.1-py2-none-any.whl", "has_sig": false, "md5_digest": "eec05ee379a185e29ed0e4a00f3bf993", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 11658, "upload_time": "2019-05-27T18:49:24", "url": "https://files.pythonhosted.org/packages/e2/23/61f34894cf3aa4e4c5f42b222385482d2cd8486bd67e9acc3a64cf9b5304/pypdfplot-0.3.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b790b7ed1bfcab58d14a6d86d16c1f5", "sha256": "d6b83e66cd51c07f60408eff6c1bbdd16b757ebbadc3be0b99a79a2d96d18ff9" }, "downloads": -1, "filename": "pypdfplot-0.3.1.tar.gz", "has_sig": false, "md5_digest": "8b790b7ed1bfcab58d14a6d86d16c1f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11295, "upload_time": "2019-05-27T18:49:26", "url": "https://files.pythonhosted.org/packages/6e/9d/25584d48b8144fb2ef2ed79e8a1406629da1569393f032923219bbd828ca/pypdfplot-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "f07ce79d34f9ff15750d6a082d68018a", "sha256": "70ccb7086bf28fb3b14ef0fdfb4c9efb997d9308947a6eef176c1f72a14d2f3f" }, "downloads": -1, "filename": "pypdfplot-0.3.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f07ce79d34f9ff15750d6a082d68018a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11666, "upload_time": "2019-05-27T18:56:47", "url": "https://files.pythonhosted.org/packages/ff/e6/db34ed1e5ddc564a42a6fd60b86d6d28ced5883810227523b7070ae1f877/pypdfplot-0.3.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1eb5423f6b959b18cc5eeecf2c7cfec4", "sha256": "bc17eba69df0de46d52db48b624afdfbd8d51d38bc503f250833501786420e5b" }, "downloads": -1, "filename": "pypdfplot-0.3.2.tar.gz", "has_sig": false, "md5_digest": "1eb5423f6b959b18cc5eeecf2c7cfec4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11298, "upload_time": "2019-05-27T18:56:48", "url": "https://files.pythonhosted.org/packages/b4/ac/d0c30289e6d57f0fcad799d35f5f2fbf5cd7cd181a6276f3356edfc775eb/pypdfplot-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "953715ce93b7533023e68bc31380a52c", "sha256": "b8c40f9b886cb357c6e9cb2b4b29cab10f1eb3a5040826f89a8d3155cf05316b" }, "downloads": -1, "filename": "pypdfplot-0.3.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "953715ce93b7533023e68bc31380a52c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11670, "upload_time": "2019-05-27T21:13:06", "url": "https://files.pythonhosted.org/packages/b9/45/870fdf82be3ca8f6328c37f3c169c54173b025202744fefb3886ca89e51e/pypdfplot-0.3.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e76263df0f20f1846e1ba395064a7c3", "sha256": "326725912d037676c95e63d3875b3bf7c79a40c354be42a41719c80074f5e695" }, "downloads": -1, "filename": "pypdfplot-0.3.3.tar.gz", "has_sig": false, "md5_digest": "1e76263df0f20f1846e1ba395064a7c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11292, "upload_time": "2019-05-27T21:13:08", "url": "https://files.pythonhosted.org/packages/f0/85/bc7b55c476655fbe891efd394f90946155a6ac220ba8b7b12416e98541f0/pypdfplot-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "d27ad44475613ced3144e194455b6f70", "sha256": "07e8ef8c20cd9f482d77f733c4b554a8afff3d78ac1acd28c27645e87dbebf8f" }, "downloads": -1, "filename": "pypdfplot-0.3.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d27ad44475613ced3144e194455b6f70", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12883, "upload_time": "2019-06-15T21:13:29", "url": "https://files.pythonhosted.org/packages/86/60/26f64ec78747a9d441b6064906acebe2d5f19e2d4d7cfa486d831babf64a/pypdfplot-0.3.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bdc3a0df66239183526826c812120659", "sha256": "12b255132c07937ad1785209e9070c7b8e4836863aecbc086512f172d01cf51c" }, "downloads": -1, "filename": "pypdfplot-0.3.4.tar.gz", "has_sig": false, "md5_digest": "bdc3a0df66239183526826c812120659", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12744, "upload_time": "2019-06-15T21:13:31", "url": "https://files.pythonhosted.org/packages/b5/43/2753f202e2c59c11695308f3b7f3ebc7335fa60f71650d221c19ee9053a6/pypdfplot-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "9a61ddf81374bd9dd54198c67ec7cf99", "sha256": "8758415988d2ca4f325f868656ba3b6cdd55099ceca9fda3d727d5dded9306f7" }, "downloads": -1, "filename": "pypdfplot-0.3.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9a61ddf81374bd9dd54198c67ec7cf99", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16068, "upload_time": "2019-06-15T22:01:11", "url": "https://files.pythonhosted.org/packages/8c/a3/f735eb3e6554efe10dd2d0018741efbf6cbb1b6de7f49a31e7080ccc22a0/pypdfplot-0.3.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5e4028c4664d00b39a5c35708b2e2c6c", "sha256": "6b0b04cfc09e0edcf60995c8b0110fb58efa2961bb3ec577ede59259c126b753" }, "downloads": -1, "filename": "pypdfplot-0.3.5.tar.gz", "has_sig": false, "md5_digest": "5e4028c4664d00b39a5c35708b2e2c6c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19542, "upload_time": "2019-06-15T22:01:13", "url": "https://files.pythonhosted.org/packages/36/dd/4e96c73213651632341f68c893a917adb5c57942c618eef0e673a92ab027/pypdfplot-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "f0f49ced1a26e2bab521b24f393d7c4a", "sha256": "24040a5d829eaa08acbc1d37122ca431ff2363c5d3180529750df7fd6836f9a6" }, "downloads": -1, "filename": "pypdfplot-0.3.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f0f49ced1a26e2bab521b24f393d7c4a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16068, "upload_time": "2019-06-15T22:25:49", "url": "https://files.pythonhosted.org/packages/45/86/2757c804e391159b5656965970bd1931c6a508a9b5069239079064fbc502/pypdfplot-0.3.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "69df16c19a401f0be7352ac7ced16c4b", "sha256": "dd77740d09e469081cd2bfaebabbc34b4b5f5f6c4f070694ff9674b230a9fa88" }, "downloads": -1, "filename": "pypdfplot-0.3.6.tar.gz", "has_sig": false, "md5_digest": "69df16c19a401f0be7352ac7ced16c4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19546, "upload_time": "2019-06-15T22:25:51", "url": "https://files.pythonhosted.org/packages/73/52/51265363a133e506a069f3e3f902ef6d3e05479719bcdf16aeebc32d9ba8/pypdfplot-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "be6337cb061ae4b8697a0096d173cd44", "sha256": "51de020ce036c0c6cc01222b2f35d3bd4f92d216d9dbd4607a6b0f5b4594b42b" }, "downloads": -1, "filename": "pypdfplot-0.3.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "be6337cb061ae4b8697a0096d173cd44", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16071, "upload_time": "2019-06-15T22:43:26", "url": "https://files.pythonhosted.org/packages/27/5b/0046007283a3f9793666f47ebe045294384f4231648e8f1814b06e3c33c2/pypdfplot-0.3.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b4a99bd8282d55a0baf389d346463da", "sha256": "e5b1e748044ad7f16bea07b796bee374d3d54835e15856186cca1ca34bb38411" }, "downloads": -1, "filename": "pypdfplot-0.3.7.tar.gz", "has_sig": false, "md5_digest": "0b4a99bd8282d55a0baf389d346463da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19599, "upload_time": "2019-06-15T22:43:28", "url": "https://files.pythonhosted.org/packages/92/13/41f02b59f04a4705b21fe3fac3a238c262714a14c2f4448173fb9ab6810a/pypdfplot-0.3.7.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "5d113cde024c22e857daea004e3be4bd", "sha256": "3878f72e90ffa63b8e640197b7e339bc5a32b0ec7a7a3a7156aaac5b7c9f296e" }, "downloads": -1, "filename": "pypdfplot-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5d113cde024c22e857daea004e3be4bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30239, "upload_time": "2019-07-14T23:59:03", "url": "https://files.pythonhosted.org/packages/e1/c5/a02ae58bb85b379af220188e90ac74f2edaf386e5c7a8283df36e0c04b48/pypdfplot-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bbd5384ab07b8abadade2a2ff9fc9110", "sha256": "20e49922327df8b144254f4ece74ffd07e34c3c6269f6e7505b5dcaf61abc05c" }, "downloads": -1, "filename": "pypdfplot-0.4.0.tar.gz", "has_sig": false, "md5_digest": "bbd5384ab07b8abadade2a2ff9fc9110", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21638, "upload_time": "2019-07-14T23:59:05", "url": "https://files.pythonhosted.org/packages/c5/d3/64b145ee07008d37914a5bfa6e8078867b2510989ee0101b48c4d20f98b0/pypdfplot-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "a60cbb24193e36c037fdc9ddc43a4a96", "sha256": "f10719b3d4e4a1922fa22210eb4efc78afcd8dbc8c8e4d7cc7a7a34be1ec24c4" }, "downloads": -1, "filename": "pypdfplot-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a60cbb24193e36c037fdc9ddc43a4a96", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30372, "upload_time": "2019-07-15T00:42:22", "url": "https://files.pythonhosted.org/packages/2a/04/db342eac1d1a315f56bf397284b334737a38abe63762075d1930a965a37f/pypdfplot-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9644668785e9c464ef6057780ca84113", "sha256": "ab85fa04a40867c75362cb09e5c54bf59f304322a9fe44da240e771f74ce7734" }, "downloads": -1, "filename": "pypdfplot-0.4.1.tar.gz", "has_sig": false, "md5_digest": "9644668785e9c464ef6057780ca84113", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21990, "upload_time": "2019-07-15T00:42:24", "url": "https://files.pythonhosted.org/packages/f5/3e/d77cd1065ae946c2b838c294b56a6d77f13b823b2fe79be713bbbef623d5/pypdfplot-0.4.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a60cbb24193e36c037fdc9ddc43a4a96", "sha256": "f10719b3d4e4a1922fa22210eb4efc78afcd8dbc8c8e4d7cc7a7a34be1ec24c4" }, "downloads": -1, "filename": "pypdfplot-0.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a60cbb24193e36c037fdc9ddc43a4a96", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 30372, "upload_time": "2019-07-15T00:42:22", "url": "https://files.pythonhosted.org/packages/2a/04/db342eac1d1a315f56bf397284b334737a38abe63762075d1930a965a37f/pypdfplot-0.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9644668785e9c464ef6057780ca84113", "sha256": "ab85fa04a40867c75362cb09e5c54bf59f304322a9fe44da240e771f74ce7734" }, "downloads": -1, "filename": "pypdfplot-0.4.1.tar.gz", "has_sig": false, "md5_digest": "9644668785e9c464ef6057780ca84113", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21990, "upload_time": "2019-07-15T00:42:24", "url": "https://files.pythonhosted.org/packages/f5/3e/d77cd1065ae946c2b838c294b56a6d77f13b823b2fe79be713bbbef623d5/pypdfplot-0.4.1.tar.gz" } ] }