File size: 4,624 Bytes
d0000f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 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()