epub / app.py
Zatimm's picture
Update app.py
ae870cd verified
import os
import gradio as gr
from transformers import VisionEncoderDecoderModel, NougatProcessor
import torch
import pypdfium2 as pdfium
from ebooklib import epub
import uuid
import markdown2
# --- Model ve İşlemci Yükleme ---
try:
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Kullanılan cihaz: {device}")
model_name = "facebook/nougat-base"
processor = NougatProcessor.from_pretrained(model_name)
model = VisionEncoderDecoderModel.from_pretrained(model_name).to(device)
print("Nougat modeli ve işlemcisi başarıyla yüklendi.")
except Exception as e:
print(f"Model yüklenirken bir hata oluştu: {e}")
model, processor = None, None
# --- Ana Fonksiyon ---
def pdf_to_epub_nougat(pdf_file):
# KODUN GÜNCELLENDİĞİNİ KONTROL ETMEK İÇİN KONTROL MESAJI
print(">>> SÜRÜM 2: DÜZELTİLMİŞ KOD BAŞARIYLA ÇALIŞIYOR! <<<")
if model is None or processor is None:
raise gr.Error("Model yüklenemedi. Lütfen Space loglarını kontrol edin.")
if pdf_file is None:
raise gr.Error("Lütfen bir PDF dosyası yükleyin.")
pdf_path = pdf_file.name
try:
print(f"'{os.path.basename(pdf_path)}' dosyası işleniyor...")
# 1. PDF dosyasını PIL resim listesine çevir (DOĞRU FONKSİYON)
images = pdfium.render_pdf_to_pil(pdf_path)
total_pages = len(images)
print(f"{total_pages} sayfa bulundu ve resimlere dönüştürüldü.")
all_markdown_pages = []
# 2. Her bir sayfa resmini Nougat ile işle
for i, image in enumerate(images):
print(f"Sayfa {i + 1}/{total_pages} Nougat tarafından işleniyor...")
pixel_values = processor(images=image, return_tensors="pt").pixel_values
outputs = model.generate(
pixel_values.to(device),
min_length=1,
max_new_tokens=4096,
)
sequence = processor.batch_decode(outputs, skip_special_tokens=True)[0]
sequence = processor.post_process_generation(sequence, fix_markdown=False)
all_markdown_pages.append(sequence)
print("Tüm sayfalardan metinler (Markdown) başarıyla çıkarıldı.")
# 3. EPUB Dosyasını Oluştur
print("EPUB dosyası oluşturuluyor...")
full_markdown_content = "\n\n".join(all_markdown_pages)
html_content = markdown2.markdown(full_markdown_content, extras=["tables", "fenced-code-blocks"])
epub_filename = f"converted_{uuid.uuid4()}.epub"
book = epub.EpubBook()
book.set_identifier(f'urn:uuid:{uuid.uuid4()}')
book.set_title(os.path.basename(pdf_path).replace('.pdf', ''))
book.set_language('en')
chapter = epub.EpubHtml(title='İçerik', file_name='chap_1.xhtml')
chapter.content = html_content
book.add_item(chapter)
book.toc = [epub.Link('chap_1.xhtml', 'İçerik', 'content')]
book.spine = ['nav', chapter]
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
epub.write_epub(epub_filename, book, {})
print(f"EPUB dosyası başarıyla oluşturuldu: {epub_filename}")
return epub_filename
except Exception as e:
print(f"Bir hata oluştu: {e}")
raise gr.Error(f"İşlem sırasında bir hata meydana geldi: {e}")
# --- Gradio Arayüzü ---
with gr.Blocks() as iface:
gr.Markdown(
"""
# 📚 PDF'ten EPUB'a Dönüştürücü (Nougat Modeli ile)
Bu araç, yüklediğiniz bir PDF dosyasının sayfalarını **Meta's Nougat** modelini kullanarak okur ve metinleri birleştirerek indirilebilir bir EPUB dosyası oluşturur.
**Not:** Bu işlem, ücretsiz CPU donanımında yavaş olabilir. Lütfen sabırlı olun.
"""
)
pdf_input = gr.File(label="PDF Dosyasını Yükle", file_types=[".pdf"])
epub_output = gr.File(label="İndirilebilir EPUB Dosyası")
convert_button = gr.Button("Dönüştür", variant="primary")
convert_button.click(fn=pdf_to_epub_nougat, inputs=pdf_input, outputs=epub_output)
if __name__ == "__main__":
iface.launch()