Der tatsächliche Code könnte nicht einfacher sein:
pdf=pdfkit.from_string(data)
Hier ist data der zu konvertierende Html-String und pdfkit ein Python Wrapper für wkhtmltopdf - https://pypi.org/project/pdfkit
Damit wir es aber benutzen können, fügen wir es einer WebApp hinzu, die in einem Container deployed wird.
App Code
fromflaskimportrequest, Response
importpdfkit
importuuid
@app.route('/', methods= ['POST'])
defconvert():
try:
data=request.data
out_filename=str(uuid.uuid4()) +'.pdf'
pdf=pdfkit.from_string(data.decode('utf-8'), configuration=config)
returnResponse(pdf_str, status=200, mimetype='application/pdf', headers={"Content-Disposition": "attachment; filename="+out_filename})
exceptExceptionase:
returnResponse(e, status=500)
Hier wird ein HTML String gepostet und ein PDF im Response zurückgegeben.
Dockerfile
# For more information, please refer to aka.ms/vscode-docker-python
FROMsurnet/alpine-python-wkhtmltopdf:3.11.4-0.12.6-full
EXPOSE5000
# Keeps Python from generating .pyc files in the container
ENVPYTHONDONTWRITEBYTECODE=1
# Turns off buffering for easier container logging
ENVPYTHONUNBUFFERED=1
# Install pip requirements
COPYrequirements.txt.
RUNpython-mpipinstall-rrequirements.txt
WORKDIR/app
COPY./app
COPY--from=surnet/alpine-python-wkhtmltopdf:3.11.4-0.12.6-full/bin/wkhtmltopdf/bin/libwkhtmltox.so/bin/
# Serve the app on port 5000
CMD["gunicorn","--bind","0.0.0.0:5000","app:app"]
Ein paar Punkte gilt es hier zu beachten: alpine Images sind die kleinstmöglichen Images, die man herleiten kann. Das alpine-python-wkhtmltopdf Image ist ein Alpine Image, das schon die wkhtmltopdf beinhaltet. Nur weil das Tool im Image ist, bedeutet das nicht, das wir es vom Code abrufen können. Wir müssen es deswegen zuerst in das bin Verzeichnis kopieren. Am Ende wird die App mit Gunicorn bereitgestellt: 'Green Unicorn' ist ein Python WSGI HTTP-Server für UNIX. - https://gunicorn.org/
Requirements File
Die requirements.txt Datei enthält die notwendigen Libraries, die installiert werden müssen.
Flask>=1.1
pdfkit
gunicorn
azure.storage.blob