epub1 / app.py
Zatimm's picture
Create app.py
d0000f0 verified
raw
history blame
4.62 kB
# Gerekli kütüphaneleri içe aktar
import gradio as gr
import torch
import pypandoc
from pathlib import Path
from nougat import NougatModel
from nougat.utils.device import move_to_device
import os
# Pandoc'un yolunu belirtmek, özellikle Hugging Face Spaces gibi ortamlarda önemlidir.
# Genellikle /usr/bin/pandoc altında bulunur. Eğer yoksa pypandoc kendi kendine indirmeyi dener.
# os.environ.setdefault('PYPANDOC_PANDOC', '/usr/bin/pandoc')
# --- Model Yükleme ---
# Model, uygulama başladığında yalnızca bir kez yüklenir.
# Bu, her dönüştürme işleminde modeli tekrar yüklemenin önüne geçer.
print("Nougat modeli yükleniyor...")
# Kullanılabilir bir GPU varsa modeli GPU'ya, yoksa CPU'ya taşı
device = "cuda" if torch.cuda.is_available() else "cpu"
model = NougatModel.from_pretrained("facebook/nougat-base").to(device)
model.eval()
print(f"Model başarıyla '{device}' üzerine yüklendi.")
def convert_pdf_to_epub(pdf_file):
"""
Bu fonksiyon bir PDF dosyası alır, Nougat ile Markdown'a çevirir
ve Pandoc ile EPUB formatına dönüştürür.
"""
if pdf_file is None:
raise gr.Error("Lütfen bir PDF dosyası yükleyin!")
pdf_path = Path(pdf_file.name)
print(f"İşlem başlıyor: {pdf_path.name}")
try:
# --- 1. Adım: PDF'i Nougat ile Markdown'a çevirme ---
print("Nougat ile metin ve yapı analizi yapılıyor...")
# `model.inference` metodu, PDF dosyasının yolunu alarak işlem yapar.
# Bu işlem, PDF'in sayfa sayısına ve karmaşıklığına bağlı olarak zaman alabilir.
result = model.inference(image_paths=[pdf_path])
# Nougat çıktısı bir sözlüktür ve 'markdown' anahtarı metni içerir.
markdown_content = result['markdown']
if not markdown_content.strip():
raise gr.Error("PDF'den metin çıkarılamadı. Dosya bozuk veya sadece resim içeriyor olabilir.")
print("Markdown içeriği başarıyla oluşturuldu.")
# --- 2. Adım: Markdown'ı Pandoc ile EPUB'a dönüştürme ---
print("Pandoc ile EPUB dosyası oluşturuluyor...")
# Çıktı dosyasının adını oluştur
output_filename = pdf_path.stem + ".epub"
# Geçici bir dizine kaydet
output_path = Path("/tmp") / output_filename
# pypandoc kullanarak dönüştürme işlemi
# `extra_args` ile EPUB dosyasına başlık gibi metadata ekleyebiliriz.
pypandoc.convert_text(
source=markdown_content,
to='epub',
format='markdown',
outputfile=str(output_path),
extra_args=[f'--metadata=title:{pdf_path.stem}']
)
print(f"EPUB dosyası başarıyla oluşturuldu: {output_path}")
# Oluşturulan dosyanın yolunu döndürerek Gradio'nun indirme linki sunmasını sağla
return str(output_path)
except Exception as e:
print(f"Bir hata oluştu: {e}")
# Kullanıcıya anlamlı bir hata mesajı göster
raise gr.Error(f"Dönüştürme sırasında bir hata oluştu: {e}")
# --- Gradio Arayüzü ---
# `gr.Blocks()` ile daha esnek ve özelleştirilebilir bir arayüz oluşturuyoruz.
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown(
"""
# 📖 PDF'den EPUB'a Dönüştürücü
Facebook'un **Nougat** modelini kullanarak akademik makaleler ve diğer PDF dosyalarınızı
kolayca okunabilir EPUB formatına dönüştürün.
"""
)
with gr.Row():
with gr.Column(scale=1):
pdf_input = gr.File(
label="PDF Dosyası Yükle",
file_types=[".pdf"]
)
convert_button = gr.Button("Dönüştür", variant="primary")
with gr.Column(scale=1):
epub_output = gr.File(
label="İndirilebilir EPUB Dosyası",
interactive=False # Kullanıcının buraya dosya yüklemesini engelle
)
# Butona tıklandığında `convert_pdf_to_epub` fonksiyonunu çalıştır
# Girdi olarak `pdf_input` bileşenini, çıktı olarak `epub_output` bileşenini kullan
convert_button.click(
fn=convert_pdf_to_epub,
inputs=pdf_input,
outputs=epub_output,
api_name="pdf_to_epub" # API üzerinden erişim için bir isim
)
gr.Examples(
[["ornek_makale.pdf"]],
inputs=[pdf_input],
label="Örnek Dosyalar (Space'e bir örnek PDF yüklediyseniz buraya ekleyebilirsiniz)"
)
# Arayüzü başlat
if __name__ == "__main__":
demo.launch()