Package: python-pdf
PDF generation in python usingwkhtmltopdf.Wkhtmltopdf binaries are precompiled and included in the package making
pydf easier to use, in particular this means pydf works on heroku.Currently usingwkhtmltopdf 0.12.5 for Ubuntu 18.04 (bionic), requiresPython 3.6+.If you’re not on Linux amd64:pydf comes bundled with a wkhtmltopdf binary which will only work on Linux amd64
architectures. If you’re on another OS or architecture your mileage may vary, it is likely that you’ll need to supply
your own wkhtmltopdf binary and point pydf towards it by setting theWKHTMLTOPDF_PATHenvironment variable.Installpipinstallpython-pdfFor python 2 usepip installpython-pdf==0.30.0.Basic Usageimportpydfpdf=pydf.generate_pdf('<h1>this is html</h1>')withopen('test_doc.pdf','wb')asf:f.write(pdf)Async UsageGeneration of lots of documents with wkhtmltopdf can be slow as wkhtmltopdf can only generate one document
per process. To get round this pydf uses python 3’s asynciocreate_subprocess_execto generate multiple pdfs
at the same time. Thus the time taken to spin up processes doesn’t slow you down.frompathlibimportPathfrompydfimportAsyncPydfasyncdefgenerate_async():apydf=AsyncPydf()asyncdefgen(i):pdf_content=awaitapydf.generate_pdf('<h1>this is html</h1>')Path(f'output_{i:03}.pdf').write_bytes(pdf_content)coros=[gen(i)foriinrange(50)]awaitasyncio.gather(*coros)loop=asyncio.get_event_loop()loop.run_until_complete(generate_async())Seebenchmarks/run.pyfor a full example.Locally generating an entire invoice goes from 0.372s/pdf to 0.035s/pdf with the async model.Dockerpydf is available as a docker image with a very simple http API for generating pdfs.SimplePOST(orGETwith data if possible) you HTML data to/generate.pdf.Arguments can be passed using http headers; any header startingpdf-orpdf_will
have that prefix removed, be converted to lower case and passed to wkhtmltopdf.For example:dockerrun-rm-p8000:80-dsamuelcolvin/pydfcurl-d'<h1>this is html</h1>'-H"pdf-orientation: landscape"http://localhost:8000/generate.pdf>created.pdfopen"created.pdf"In docker compose:services:pdf:image:samuelcolvin/pydfOther services can then generate PDFs by making requests topdf/generate.pdf. Pretty cool.APIgenerate_pdf(source, [**kwargs])Generate a pdf from either a url or a html string.After the html and url arguments all other arguments are passed straight
to wkhtmltopdfFor details on extra arguments see the output of get_help() and
get_extended_help()All arguments whether specified or caught with extra_kwargs are
converted to command line args with'--'+original_name.replace('_','-').Arguments which are True are passed with no value eg. just –quiet,
False and None arguments are missed, everything else is passed with
str(value).Arguments:source: html string to generate pdf from or url to getquiet: boolgrayscale: boollowquality: boolmargin_bottom: string eg. 10mmmargin_left: string eg. 10mmmargin_right: string eg. 10mmmargin_top: string eg. 10mmorientation: Portrait or Landscapepage_height: string eg. 10mmpage_width: string eg. 10mmpage_size: string: A4, Letter, etc.image_dpi: int default 600image_quality: int default 94extra_kwargs: any exotic extra options for wkhtmltopdfReturns string representing pdfget_version()Get version of pydf and wkhtmltopdf binaryget_help()get help string from wkhtmltopdf binary uses -h command line optionget_extended_help()get extended help string from wkhtmltopdf binary uses -H command line
optionexecute_wk(*args)Low level function to call wkhtmltopdf, arguments are added to
wkhtmltopdf binary and passed to subprocess with not processing.HerokuIf you are deploying onto Heroku, then you will need to install a couple of dependencies before WKHTMLTOPDF will work.Add the Heroku buildpackhttps://buildpack-registry.s3.amazonaws.com/buildpacks/heroku-community/apt.tgzThen create anAptfilein your root directory with the dependencies: