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
pipinstaliran:pip3 --version - Ako nije instaliran, instalirajte ga pomoću:
sudo apt-get install python3-pip
- Instalacija Python biblioteka:
- Instalirajte potrebne biblioteke pomoću
pipkomande:pip3 install PyMuPDF googletrans==4.0.0-rc1 fpdf
Napomena: Verzijagoogletransbiblioteke je specificirana kao4.0.0-rc1zbog kompatibilnosti.
- SRBFreeSerif.ttf font:
- Preuzmite
SRBFreeSerif.ttffont 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: