Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

28.5. pypandoc

		
pip install pypandoc
pip install pypandoc_binary		
		
		
		
#!/usr/bin/env python
# -*- coding: utf-8 -*-
##############################################
# Home	: https://www.netkiller.cn
# Author: Neo <netkiller@msn.com>
# Upgrade: 2025-06-20
##############################################
import os.path

try:
    import uvicorn, logging
    from typing import Union
    from fastapi import FastAPI
    from fastapi.params import Form
    from fastapi.responses import FileResponse
    import uuid
    import pypandoc
    # import os
    # os.environ.setdefault('PYPANDOC_PANDOC', '/home/x/whatever/pandoc')
except ImportError as err:
    print("Import Error: %s" % (err))
    exit()

app = FastAPI()

workdir = "/tmp/doc"
if not os.path.exists(workdir):
    os.makedirs(workdir)

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.post("/markdown/{appid}/{device}/word")
async def word(markdown: str = Form()):

    filename = uuid.uuid1()
    input_file=f"/{workdir}/{filename}.md"
    output_file = f"/{workdir}/{filename}.docx"
    with open(input_file,'w') as file:
        file.write(markdown)

    pypandoc.convert_file(input_file, 'docx', format="markdown", outputfile=output_file)
    # media_type = "application/msword"
    media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    return FileResponse(output_file,media_type=media_type, filename=os.path.basename(output_file))

@app.post("/markdown/{appid}/{device}/ppt")
async def powerpoint(markdown: str = Form()):

    filename = uuid.uuid1()
    input_file=f"/{workdir}/{filename}.md"
    output_file = f"/{workdir}/{filename}.pptx"
    with open(input_file,'w') as file:
        file.write(markdown)

    pypandoc.convert_file(input_file, 'pptx', format="markdown", outputfile=output_file)
    # media_type = "application/vnd.ms-powerpoint"
    media_type = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
    return FileResponse(output_file,media_type=media_type, filename=os.path.basename(output_file))

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    try:
        # uvicorn.run('main:app', port=8000, reload=True)
        uvicorn.run(app="main:app", host="0.0.0.0", port=8080, log_level="info")
    except KeyboardInterrupt:
        print("Crtl+C Pressed. Shutting down.")		
		
		

		
uvicorn main:app --reload