Ich habe von meinem Chef gehört, dass die Fast API gut zu sein scheint, also habe ich sie berührt. Es ist langweilig, einfach eine GET-Anfrage zu stellen und Zeichen zurückzugeben. Deshalb habe ich eine API erstellt, um eine PDF-Datei in ein TIF-Bild zu konvertieren.
FastAPI ist Pythons Webframework, ähnlich wie Flask.
root
├─app.py
├─Dockerfile
├─requirements.txt
└─test.pdf
Dockerfile
Dockerfile
FROM python:3.8
#Installieren Sie den für die PDF-Konvertierung erforderlichen Poppler
RUN apt-get update && \
apt-get install -y poppler-utils
#Installieren des Python-Moduls
COPY requirements.txt .
RUN pip install --upgrade pip && \
pip install -r requirements.txt && \
rm requirements.txt
#Erstellen Sie einen Ordner, um die konvertierte Datei vorübergehend zu speichern
RUN rm -rf /app && \
mkdir -p /app/data/
#Platzieren Sie das Programm
COPY app.py /app/app.py
EXPOSE 8000
WORKDIR /app
CMD ["uvicorn", "app:api", "--host", "0.0.0.0", "--port", "8000"]
Dieses Mal habe ich das Image von python: 3.8
verwendet, aber alles ist in Ordnung, solange Python funktioniert und Poppler installiert werden kann.
requirements.txt
requirements.txt:requirements.txt
fastapi
uvicorn
python-multipart
pdf2image
Bei Verwendung von FastAPI sind fastapi
und uvicorn
erforderlich
Benötigt "Python-Multipart" beim Hochladen von Dateien
Benötigt pdf2image
, um eine PDF-Datei in ein Bild zu konvertieren
app.py
app.py
import os
from base64 import b64encode
import uvicorn
from fastapi import FastAPI, File, UploadFile
from pdf2image import convert_from_bytes
from PIL import Image
api = FastAPI()
@api.post("/")
async def post(file: UploadFile = File(...)):
pdf_file = await file.read()
tif_file = convert(pdf_file)
return tif_file
def convert(pdf_file):
output_folder = "./data"
file_name = "temporary"
output_file_path = f"{output_folder}/{file_name}.tif"
#Konvertieren Sie alle PDF-Seiten in JPG und speichern Sie sie
image_path = convert_from_bytes(
pdf_file=pdf_file,
thread_count=5,
fmt="jpg",
output_folder=output_folder,
output_file=file_name,
paths_only=True,
)
#Laden Sie alle JPG-Bilder
images = [Image.open(image) for image in image_path]
#Konvertieren Sie alle JPG-Bilder in ein TIF-Bild und speichern Sie sie
images[0].save(
output_file_path, format="TIFF", save_all=True, append_images=images[1:],
)
#Lesen Sie alle JPG-Bilder und codieren Sie mit base64
with open(output_file_path, "rb") as f:
tif_file = b64encode(f.read())
#Löscht alle gespeicherten Bilder und gibt eine Binärdatei mit TIFF-Bildern zurück
for image in image_path:
os.remove(image)
os.remove(output_file_path)
return tif_file
if __name__ == "__main__":
uvicorn.run(api)
Beachten Sie, dass, wenn Sie in "convert_from_bytes" nicht "path_only = True" festlegen, viel Speicherplatz verbraucht wird.
Build
docker build -t fastapi .
Run
docker run --rm -it -p 8000:8000 fastapi
> curl -X POST -F 'file=@./test.pdf' http://localhost:8000 | base64 -di > ./test.tif
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 206M 100 206M 100 309k 27.0M 41409 0:00:07 0:00:07 --:--:-- 47.2M
Es wird in base64 codiert und zurückgegeben, daher müssen Sie es decodieren und in base64 schreiben.
Ich brauchte "Python-Multipart", um die Datei hochzuladen, und ich hatte einige Stolpersteine, aber ich fand die Fast-API sehr einfach zu schreiben.