Python program koji prevodi PDF sa engleskog na srpski i formira novi srpski PDF sa postojećim slikama

Ovaj Python program prevodi sadržaj PDF dokumenta sa engleskog na srpski jezik i generiše novi PDF sa prevedenim tekstom i slikama iz originalnog dokumenta. Program koristi biblioteke fitz (PyMuPDF) za rad sa PDF-ovima, googletrans za prevođenje teksta, i fpdf za kreiranje novog PDF-a.

Da bi program prevodio sa engleskog na hrvatski jezik potrebno je u 8-moj liniji koda zameniti sr sa hr, primer:

def translate_pdf(input_pdf, output_pdf, output_image_dir, target_language="sr"):
def translate_pdf(input_pdf, output_pdf, output_image_dir, target_language="hr"):

Detaljno objašnjenje rada programa:

  1. Inicijalizacija i priprema:
  • Program prihvata tri argumenta iz komandne linije: putanju do ulaznog PDF fajla, putanju za izlazni PDF fajl i direktorijum za čuvanje slika.
  • Inicijalizuje se prevodilac (Translator) i otvara se ulazni PDF dokument pomoću fitz.open().
  • Proverava se da li postoji navedeni direktorijum za slike; ako ne postoji, kreira se novi direktorijum.
  1. Obrada svake stranice PDF-a:
  • Za svaku stranicu u PDF dokumentu:
    • Ekstrahuje se tekst sa stranice pomoću page.get_text("text").
    • Ako tekst nije prazan, prevodi se sa engleskog na srpski jezik koristeći translator.translate().
    • Dodaje se nova stranica u izlazni PDF dokument.
    • Prevedeni tekst se deli na linije i proverava se za stilove (bold, italic, underline) na osnovu posebnih oznaka (** za bold, _ za italic, __ za underline).
    • Svaka linija se dodaje u PDF sa odgovarajućim stilom.
  1. Ekstrakcija i dodavanje slika:
  • Za svaku sliku na stranici:
    • Ekstrahuje se slika iz PDF-a i čuva se na disk u prethodno definisanom direktorijumu za slike.
    • Dodaje se slika u izlazni PDF na odgovarajućoj poziciji.
  1. Završetak:
  • Generisani PDF sa prevedenim sadržajem i slikama se čuva na zadatoj putanji.

Instalacija zavisnosti na Linuxu:

Da bi ovaj program radio bez problema na Linuxu, potrebno je instalirati sledeće zavisnosti:

  1. Python 3:
  • Uverite se da je Python 3 instaliran na vašem sistemu.
  • Možete proveriti verziju Python-a komandom:
    python3 --version
  • Ako Python 3 nije instaliran, instalirajte ga pomoću:
    sudo apt-get update sudo apt-get install python3
  1. pip (Python paket menadžer):
  • Proverite da li je pip instaliran:
    pip3 --version
  • Ako nije instaliran, instalirajte ga pomoću:
    sudo apt-get install python3-pip
  1. Instalacija Python biblioteka:
  • Instalirajte potrebne biblioteke pomoću pip komande:
    pip3 install PyMuPDF googletrans==4.0.0-rc1 fpdf
    Napomena: Verzija googletrans biblioteke je specificirana kao 4.0.0-rc1 zbog kompatibilnosti.
  1. SRBFreeSerif.ttf font:
  • Preuzmite SRBFreeSerif.ttf font i sačuvajte ga u direktorijumu gde se nalazi vaš Python skript.
  • Možete preuzeti font sa sledećeg linka:
    https://abel.rs/as/SRBFreeSerif.ttf
  • Uverite se da je font dostupan u istom direktorijumu gde je i vaš Python skript ili navedite punu putanju do fonta u liniji gde se dodaje font:
    python pdf_writer.add_font('SRBFreeSerif', '', '/putanja/do/SRBFreeSerif.ttf', uni=True)

Nakon što su sve zavisnosti instalirane i font je dostupan, možete iskopirati programski kod u novoformirani fajl translate.py

import fitz  # PyMuPDF
from googletrans import Translator
from fpdf import FPDF
import os
import sys


def translate_pdf(input_pdf, output_pdf, output_image_dir, target_language="sr"):
    try:
        # Inicijalizacija prevoditelja i otvaranje PDF-a
        translator = Translator()
        pdf_document = fitz.open(input_pdf)

        # Proveri i kreiraj folder za slike
        if not os.path.exists(output_image_dir):
            os.makedirs(output_image_dir)

        # Inicijalizacija novog PDF-a
        pdf_writer = FPDF()
        pdf_writer.set_auto_page_break(auto=True, margin=15)

        # Dodavanje DejaVu fonta
        # pdf_writer.add_font('DejaVu', '', 'DejaVuSans.ttf', uni=True)  # Dodaj DejaVu font
        # pdf_writer.set_font('DejaVu', '', 10)  # Koristi DejaVu font sa 10pt
        pdf_writer.add_font('SRBFreeSerif', '', 'SRBFreeSerif.ttf', uni=True)  # Dodaj SRB FreeSerif font
        pdf_writer.set_font('SRBFreeSerif', '', 10)  # Postavi SRB FreeSerif font sa veličinom 10pt

        # Prolazak kroz stranice PDF-a
        for page_num in range(len(pdf_document)):
            page = pdf_document[page_num]
            text = page.get_text("text")  # Ekstrakcija teksta sa stranice
            print(f"Prevodim stranicu {page_num + 1}...")

            try:
                # Prevod cele stranice
                if text.strip():  # Prevedi samo ako tekst nije prazan
                    translated_text = translator.translate(text, src="en", dest=target_language).text
                else:
                    translated_text = text  # Ako je tekst prazan, koristi original

                # Preveden tekst dodaj u PDF
                pdf_writer.add_page()

                # Ekstrakcija i primena stilova
                lines = translated_text.splitlines()
                for line in lines:
                    # Provera za stilove (Bold, Italic, Underline)
                    if line.startswith("**") and line.endswith("**"):
                        pdf_writer.set_font('SRBFreeSerif', 'B', 10)  # Bold
                        line = line[2:-2]  # Uklanjanje ** sa početka i kraja
                    elif line.startswith("_") and line.endswith("_"):
                        pdf_writer.set_font('SRBFreeSerif', 'I', 10)  # Italic
                        line = line[1:-1]  # Uklanjanje _ sa početka i kraja
                    elif line.startswith("__") and line.endswith("__"):
                        pdf_writer.set_font('SRBFreeSerif', 'U', 10)  # Underline
                        line = line[2:-2]  # Uklanjanje __ sa početka i kraja
                    else:
                        pdf_writer.set_font('SRBFreeSerif', '', 10)  # Standard

                    # Dodaj liniju u PDF
                    pdf_writer.cell(0, 10, line, ln=True)

            except Exception as e:
                print(f"Greška pri prevođenju stranice {page_num + 1}: {e}")
                translated_text = text  # Ako dođe do greške, koristi originalni tekst

            # Ekstrakcija slika
            for img_index, img in enumerate(page.get_images(full=True)):
                xref = img[0]  # Reference ID slike
                base_image = pdf_document.extract_image(xref)
                image_bytes = base_image["image"]
                image_ext = base_image["ext"]
                image_filename = f"page{page_num + 1}_img{img_index + 1}.{image_ext}"
                image_path = os.path.join(output_image_dir, image_filename)

                # Snimi sliku na disk
                with open(image_path, "wb") as image_file:
                    image_file.write(image_bytes)

                # Dodaj sliku u PDF
                pdf_writer.image(image_path, x=10, y=pdf_writer.get_y() + 10, w=180)

        # Snimi generisani PDF
        pdf_writer.output(output_pdf)
        print(f"Prevedeni PDF je generisan: {output_pdf}")

    except Exception as e:
        print(f"Došlo je do greške: {e}")

# Provera da li su argumenti ispravno uneti
if len(sys.argv) != 4:
    print("Korišćenje: python3 translate.py <PDF fajl> <izlazni PDF fajl> <direktorijum za slike>")
else:
    input_pdf_path = sys.argv[1]  # Putanja do ulaznog PDF-a
    output_pdf_path = sys.argv[2]  # Putanja za izlazni PDF
    image_dir = sys.argv[3]  # Fascikla za slike

    translate_pdf(input_pdf_path, output_pdf_path, image_dir)

Sada možete pokrenuti program iz terminala komandom:

python3 translate.py ulazni.pdf izlazni.pdf direktorijum_za_slike

Zamenite ulazni.pdf sa putanjom do vašeg PDF fajla koji želite da prevedete, izlazni.pdf sa željenom putanjom za prevedeni PDF, i direktorijum_za_slike sa putanjom do direktorijuma gde će se čuvati slike.

Za prevođenje PDF-a na različite jezike pomoću funkcije translate_pdf, potrebno je koristiti odgovarajuće dvoslovne ISO 639-1 kodove jezika. Evo kodova za tražene jezike:

  • Ruski: ru
  • Ukrajinski: uk
  • Slovački: sk
  • Češki: cs
  • Mađarski: hu
  • Nemački: de
  • Francuski: fr
  • Španski: es
  • Italijanski: it
  • Beloruski: be
  • Poljski: pl
  • Makedonski: mk
  • Slovenački: sl
  • Grčki: el
  • Čečenski: ce
  • Turski: tr
  • Albanski: sq

Ovi kodovi se koriste kao vrednost parametra target_language u funkciji translate_pdf. Na primer, za prevođenje na ruski jezik, poziv funkcije bi izgledao ovako:

translate_pdf(input_pdf, output_pdf, output_image_dir, target_language="ru")

Za više informacija o ISO 639-1 kodovima jezika, možete posetiti sledeći izvor:

By Abel

Leave a Reply

Your email address will not be published. Required fields are marked *