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:
- 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ćufitz.open()
. - Proverava se da li postoji navedeni direktorijum za slike; ako ne postoji, kreira se novi direktorijum.
- 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.
- Ekstrahuje se tekst sa stranice pomoću
- 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.
- 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:
- 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
- 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
- Instalacija Python biblioteka:
- Instalirajte potrebne biblioteke pomoću
pip
komande:pip3 install PyMuPDF googletrans==4.0.0-rc1 fpdf
Napomena: Verzijagoogletrans
biblioteke je specificirana kao4.0.0-rc1
zbog kompatibilnosti.
- 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: