Raspberry Pi'de Kendi PDF Dönüştürme API Aracınızı Kurun
Raspberry Pi'de Kendi PDF Dönüştürme API'nizi Kurun: Flask + ImageMagick + Cloudflare Tunnel
Bu yazıda, Raspberry Pi üzerinde çalışan, güvenli ve hızlı bir PDF dönüştürme API'sinin nasıl kurulacağını adım adım anlatacağız. Çıktı olarak PDF dosyalarını görsellere (örn. JPG) çevirip, tekrar PDF olarak oluşturan ve bu süreci dışarıya Cloudflare Tunnel ile açan bir sistem elde edeceğiz.
1. Hazırlıklar
1.1 Klasör Yapısını Oluşturalım
Terminalde aşağıdaki komutla proje klasörünü oluşturuyoruz:
mkdir -p /home/serdar/pdf-image-stack/app
chmod -R 755 /home/serdar/pdf-image-stack
chown -R serdar:serdar /home/serdar/pdf-image-stack
1.2 app.py
Dosyasını Oluşturma
nano /home/serdar/pdf-image-stack/app/app.py
Açılan editöre aşağıdaki kodu yapıştırın:
from flask import Flask, request, send_file
import os, uuid, subprocess, glob
app = Flask(__name__)
# Güvenli API anahtarı
API_KEY = "GUCLU_API_KEY"
@app.route('/convert', methods=['POST'])
def convert_pdf():
token = request.args.get("token")
if token != API_KEY:
return "Unauthorized", 401
try:
dpi = int(request.args.get("dpi", "600"))
except ValueError:
return "Invalid dpi parameter", 400
if 'file' not in request.files:
return 'No file provided', 400
file = request.files['file']
uid = str(uuid.uuid4())
input_pdf = f"/tmp/{uid}.pdf"
output_img_prefix = f"/tmp/{uid}"
output_pdf = f"/tmp/{uid}-final.pdf"
file.save(input_pdf)
subprocess.run(["pdftoppm", "-jpeg", "-r", str(dpi), input_pdf, output_img_prefix], check=True)
jpg_files = sorted(glob.glob(f"{output_img_prefix}-*.jpg"))
if not jpg_files:
return 'No images generated', 500
subprocess.run([
"convert",
*jpg_files,
"-units", "PixelsPerInch",
"-density", str(dpi),
"-page", "595x842",
"-quality", "95",
output_pdf
], check=True)
return send_file(output_pdf, mimetype="application/pdf")
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)
1.3 Dockerfile Oluşturma
nano /home/serdar/pdf-image-stack/app/Dockerfile
Açılan dosyaya şu içeriği yapıştır:
FROM python:3.11-slim
RUN apt-get update && \
apt-get install -y poppler-utils imagemagick && \
pip install flask && \
apt-get clean
WORKDIR /app
COPY app.py .
CMD ["python", "app.py"]
Dockerfile için ImageMagick üzerindeki PDF yazma engelini kaldırmak için konteyner içinde şu komutu da eklemeyi unutmayın (Dockerfile sonrası):
sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/' /etc/ImageMagick*/policy.xml
Bunu yapsanız bile sıkıntı yaşayabiliyorsunuz. Eğer hata alırsanız bir de şu adımları deneyin;docker exec -it pdf-image-converter bash
sed -i 's/<policy domain="coder" rights="none" pattern="PDF" \/>/<policy domain="coder" rights="read|write" pattern="PDF" \/>/' /etc/ImageMagick*/policy.xml
2. Docker İmajını Oluştur ve Çalıştır
cd /home/serdar/pdf-image-stack/app
docker build -t serdar/pdf-image-converter .
docker run -d --name pdf-image-converter -p 5010:5000 \
-v /tmp:/tmp \
-v $(pwd):/app \
serdar/pdf-image-converter
Alternatif olarak Portainer üzerinden bir Stack de tanımlayabilirsiniz.
version: "3.8"
services:
pdf-image-converter:
image: serdar/pdf-image-converter
container_name: pdf-image-converter
restart: unless-stopped
ports:
- "5010:5000"
volumes:
- /home/serdar/pdf-image-stack/app:/app
- /tmp:/tmp
working_dir: /app
environment:
PDF_CONVERTER_API_KEY: "GUCLU_API_KEY"
command: ["python", "app.py"]
3. Cloudflare Tunnel ile Dışarıya Açmak
Cloudflare Zero Trust üzerinden pdf.serdar.cc
subdomain'ini aşağıdaki gibi tanımlayın:
-
Subdomain: pdf
-
Domain: yoursite.com
-
Service:
http://192.168.68.67:5010
Bu sayede şu URL uzerinden dönüşüm API'sine erişim sağlanabilir:
https://pdf.yoursite.com/convert?token=GUCLU_API_KEY&dpi=600
4. Test
Windows komut istemcisinden test etmek için:
curl -X POST -F "file=@D:\Deneme\deneme.pdf" "https://pdf.yoursite.com
/convert?token=GUCLU_API_KEY&dpi=600" --output D:\Deneme\sonuc.pdf
Sonuç: Artık Raspberry Pi'nizde özelleştirilmiş, API key korumalı, Cloudflare tünelli ve Yüksek DPI destekli bir PDF dönüştürme servisine sahipsiniz! ✅
Yorumlar