API w FastAPI do:
- scalania PDF-ów,
- dzielenia PDF-ów na strony,
- uploadu rozbitych stron na Google Drive,
- inspekcji folderów Google Drive z PDF-ami,
- uruchamiania długich inspekcji w tle jako joby.
Serwer działa z pliku main.py.
- Python 3.11+
client_secrets.jsondla Google OAuth- zmienne środowiskowe
API_AUTH_TOKENiAUTH_USERS_JSON
Aplikacja ładuje .env przy starcie. Przy pierwszym użyciu operacji Google Drive utworzy lokalny token.json.
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python main.pyDomyślny adres:
http://localhost:5555
Swagger:
http://localhost:5555/docs
Minimalny .env:
API_AUTH_TOKEN=super-sekretowy-token
AUTH_USERS_JSON="{\"admin\":{\"password\":\"twoje-haslo\",\"display_name\":\"Administrator\"}}"
FRONTEND_URL=http://localhost:5173Obsługiwane zmienne:
API_AUTH_TOKEN- globalny token Bearer dla integracji serwisowychAUTH_USERS_JSON- konta doPOST /auth/loginw formacie JSONFRONTEND_URL- dodatkowy origin dopisywany do CORS
Przykład AUTH_USERS_JSON z dwoma kontami:
{
"admin": {
"password": "haslo-admina",
"display_name": "Administrator"
}Publiczne są tylko:
GET /healthPOST /auth/login
Pozostałe endpointy wymagają:
Authorization: Bearer <API_AUTH_TOKEN>
Alternatywnie frontend może zalogować użytkownika przez POST /auth/login i używać zwróconego access_token jako Bearer tokenu sesyjnego.
Operacje Drive używają OAuth użytkownika i plików:
client_secrets.jsontoken.json
Konto zapisane w token.json wykonuje wszystkie operacje na Google Drive.
Budowanie:
docker build -t py-pdf .Uruchomienie:
docker run --rm -p 5555:5555 -e API_AUTH_TOKEN=super-sekretowy-token -e AUTH_USERS_JSON="{\"admin\":{\"password\":\"twoje-haslo\",\"display_name\":\"Administrator\"}}" py-pdfCompose:
docker compose up --buildProsty healthcheck:
{
"status": "ok"
}Logowanie użytkownika z AUTH_USERS_JSON.
Body:
{
"username": "admin",
"password": "twoje-haslo"
}Odpowiedź:
{
"access_token": "SESSION_TOKEN",
"token_type": "bearer",
"user": {
"username": "admin",
"display_name": "Administrator"
}
}Zbiorczy endpoint dla uploadowanych PDF-ów.
multipart/form-data:
operation:mergealbosplitfiles: jeden lub wiele plików PDF
Zachowanie:
mergezwracamerged.pdfsplitzwracasplit_pdf.zip
Rozbija jeden uploadowany PDF do ZIP-a.
multipart/form-data:
file: jeden PDF
Odpowiedź: <nazwa>_split.zip
Rozbija uploadowany PDF i wgrywa strony na Google Drive.
multipart/form-data:
folder_idfile
Zwraca metadane utworzonych plików i dimensions_table_html.
Rozbija PDF już istniejący na Google Drive.
Body:
{
"file_id": "GOOGLE_DRIVE_FILE_ID",
"folder_id": "GOOGLE_DRIVE_PARENT_FOLDER_ID"
}Tworzy nowy podfolder na Drive, zapisuje tam strony jako osobne PDF-y i zwraca:
- dane folderu docelowego,
- listę stron,
dimensions_table_html
Starszy wariant split-pdf.
Różnica:
- nie tworzy nowego podfolderu,
- zapisuje pliki bezpośrednio do podanego
folder_id, - zwraca samą listę stron.
Synchroniczna inspekcja folderu Google Drive.
Body:
{
"folder_link": "https://drive.google.com/drive/folders/..."
}folder_link może być:
- pełnym linkiem,
- linkiem z
id=..., - samym
folder_id
Wynik zawiera listę znalezionych PDF-ów, ścieżki folderów, liczbę stron i wymiary stron w mm.
Tworzy asynchroniczny job inspekcji i zwraca:
job_idstatusstatus_urlresult_url
Zwraca listę zapisanych jobów z job_data.
Zwraca status i postęp joba.
Statusy:
queuedrunningcompletedfailedcancelled
Zleca miękkie anulowanie joba.
Zwraca wynik joba:
200gdy job jest zakończony,409gdy nadal trwa,500gdy zakończył się błędem,- dla
cancelledzwraca wynik częściowy, jeśli powstał.
Logowanie:
curl.exe -X POST "http://localhost:5555/auth/login" `
-H "Content-Type: application/json" `
-d "{\"username\":\"admin\",\"password\":\"twoje-haslo\"}"Start joba inspekcji:
curl.exe -X POST "http://localhost:5555/inspect-drive-folder/jobs" `
-H "Authorization: Bearer super-sekretowy-token" `
-H "Content-Type: application/json" `
-d "{\"folder_link\":\"https://drive.google.com/drive/folders/FOLDER_ID\"}"Pobranie statusu joba:
curl.exe "http://localhost:5555/inspect-drive-folder/jobs/TWOJ_JOB_ID" `
-H "Authorization: Bearer super-sekretowy-token"