[PYTHON] Erstellen Sie eine API zum Konvertieren von PDF-Dateien in TIF-Bilder mit FastAPI und Docker

Einführung

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.

Was ist FastAPI?

FastAPI ist Pythons Webframework, ähnlich wie Flask.

Entwicklungsumgebung

Implementierung

Verzeichnisaufbau

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.

Lauf

Starten Sie Docker

  1. Build

    docker build -t fastapi .
    
  2. Run

    docker run --rm -it -p 8000:8000 fastapi
    

API-Anfrage

 > 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.

Zusammenfassung

Ich brauchte "Python-Multipart", um die Datei hochzuladen, und ich hatte einige Stolpersteine, aber ich fand die Fast-API sehr einfach zu schreiben.

Recommended Posts

Erstellen Sie eine API zum Konvertieren von PDF-Dateien in TIF-Bilder mit FastAPI und Docker
Konvertieren Sie verstümmelte gescannte Bilder mit Pillow und PyPDF in PDF
Konvertieren Sie PDF-Dateien mit GIMP in PNG-Dateien
Erstellen Sie eine API mit Django
Minimales Makefile und buildout.cfg, um eine Umgebung mit buildout zu erstellen
Konvertieren Sie PDF in Image mit ImageMagick
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Konvertieren Sie in Python usw. geschriebene Dateien in PDF mit Syntax-Hervorhebung
Herausforderung beim Erstellen eines Zeitachsenlistenberichts mit der Toggl-API und Python
So erstellen Sie eine NVIDIA Docker-Umgebung
Konvertieren Sie mit pdfplumber von PDF in CSV
Bereiten Sie eine Umgebung zum Berühren von Dateien im Grib2-Format mit Python vor (Docker Edition).
[Python] Erstellen Sie schnell eine API mit Flask
Erstellen Sie mithilfe der Gesetzes-API ein einfach zu lesendes PDF mit Gesetzen und Regierungsverordnungen
Erstellen Sie eine saubere Datenbank zum Testen mit FastAPI und führen Sie Unittest of API mit pytest aus
DICOM zu PNG Konvertierung mit aufsteigend und absteigend
Konvertieren Sie PDF in Bilder (JPEG / PNG) mit Python
Konvertieren Sie PDFs mit Python in Massenbilder
Konvertieren Sie mehrere JPG-Dateien in eine PDF-Datei
Stapelkonvertierung von PSD-Dateien im Verzeichnis in PDF
Erstellen Sie schnell einen API-Server mit Python + Falcon
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern
Erstellen Sie eine einfache API, um JSON-Dateien einzugeben und auszugeben ~ Python / Flask Edition ~
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Mit matplotlib erstellte Bilder werden von dvi nach pdf verschoben
Anfänger versuchen, Word-Dateien sofort in PDF zu konvertieren
Freigeben von Ordnern für Docker und Windows mit Tensorflow
Konvertieren Sie das Bild in .zip mit Python in PDF
Eine einfache Möglichkeit, ein Importmodul mit jupyter zu erstellen
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Schritte zum Erstellen eines Jobs, der ein Docker-Image abruft und mit Github-Aktionen testet
Schritte zum Einrichten von Pipenv, Erstellen einer CRUD-App mit Flask und Containerisieren mit Docker
Konvertieren Sie 202003 bis 2020-03 mit Pandas
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie mit Docker eine Umgebung für "Deep Learning von Grund auf neu"
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Demosaic Bayer FITS-Dateien und konvertieren sie in Farbe TIFF
Stapelkonvertierung von in MS Forms / Google Forms hochgeladenen Bilddateien in PDF
Konvertieren Sie Bilder mit PIL (Python Imaging Library) in Sepia.
Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
[Python Kivy] So erstellen Sie mit pyinstaller eine exe-Datei
Konvertieren Sie Videos mit ffmpeg + python + opencv in Schwarzweiß
So erstellen Sie einen Datenrahmen und spielen mit Elementen mit Pandas
Laden Sie Dateien mit Django-Speicher in Google Cloud Storages hoch und löschen Sie sie
Skript zum Konvertieren zwischen Xcode-Sprachdateien und tabulatorgetrenntem Text
Bis die von Flask + MySQL erstellte API in Docker konvertiert wird
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Erstellen einer Cognito-Benutzerliste in S3 mit SQS Stellen Sie mit SAM Warteschlangenverarbeitungsfunktionen und APIs für Lambda bereit