from fastapi import FastAPI,Request from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse,Response import os,io,base64 as b64 from pdf2image import convert_from_path, convert_from_bytes from pdf2image.exceptions import ( PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError ) class BaseImage: img:str=None def format(codigo:str,size:float): return f"""\\documentclass[12pt]{{article}} \\usepackage[fontsize={size}pt]{{fontsize}} \\begin{{document}} {codigo} \\end{{document}}""" from subprocess import run app=FastAPI(); def get_bytes_value(image): img_byte_arr = io.BytesIO() image.save(img_byte_arr, format='JPEG') img_byte_arr.seek(0) return img_byte_arr.getvalue() imags=BaseImage() templates = Jinja2Templates(directory="templates") @app.get("/image",response_class=Response) def img(request: Request): return Response(content=b64.b64decode(imags.img),media_type="image/jpeg") if imags.img else "No image" @app.get("/",response_class=HTMLResponse) def test(request: Request,q:str="ls",body:bool=True,x:int=1024,y:int=1024,font:float=50): with open("./v.tex","w") as k: k.write(format(q,font) if body else q) r=run("pdflatex v.tex".split(" "),capture_output=True) if r.stderr: return r.stderr else: images=convert_from_path("v.pdf",size=(x,y)) images[0].save("v.jpg",format="JPEG") with open("v.jpg","rb") as t: v=b64.b64encode(t.read()).decode('UTF-8') imags.img=v return templates.TemplateResponse("latex.html", { "q":q, "request":request, "result":v })