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;

- Container içine girin.
docker exec -it pdf-image-converter bash
- 1 defaya mahsus, imajı düzeltmeden konteyner içinde iken alttaki kodu çalıştırın.
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

Lütfen bizimle fikrinizi paylaşmaktan çekinmeyin. Yorumlarınız bizim için önemli.