Како 780 слика у jpg формату, ротирати, обрезати и направити PDF књигу са живим текстом и конвертовати у MsWord за 10 минута!

Пише: Александар Маричић, dipl.ecc.

Зашто прочитати овај чланак?

Својевремено сам имао задатак да скенирам једну стару књигу штампану ћириличним писмом, која је имала 780 страна и да направим, од њених скенираних слика у jpg формату, PDF и MsWord документе. PDF је требало да се објави на Веб-у, а MsWord документ је послат на лектуру и коректуру како би било објављено њено ново, ревидирано и проширено издање.

Ту прву књигу са великим бројем страна радио сам месец дана, пешице, у уобичајеним Windows програмима, скенирајући страницу по страницу огромне књиге, и размишљајући како себи да олакшам живот, како да станем поред скенера, извадим књигу и окренем нову страну а да ме опет не заболе леђа. Кад сам почео да ротирам и обрезујем слике, размишљао сам да л’ да скочим са Савског моста у Ибар или да направим одговарајуће програме који ће аутоматизовати неизмерно досадан посао. После завршетка прве књиге, прионуо сам страсно на посао и написао збирку програма, коју вам представљам овде. Њих сам одмах пробао на претходно скенираним страницама. Цео процес обраде је трајао нешто више од сат времена, јер сам Линукс инсталирао на неком старом, трећеразредном рачунару, који је фирма одавно отписала. Можда сам мало много претерао са минутаром у наслову чланка, али морао сам некако да вам привучем пажњу. За утеху, верујем да бих са овим новим рачунаром са I7 процесором, 16Gb RAM-а и SSD диском, на коме тренутно радим, то трајало десетак минута. Другу књигу од приближно 200 страна фотографисао сам и обрадио за само сат времена! Најдуже је трајало фотографисање, обрада књиге приложеним програмима је трајала, ако ме сећање добро служи, десетак минута. Збирка програма коју вам представљам је оригинално писана у Python 3.2, 2011. године, а дорађена је за Python 3.10. и испробана на Elementary OS 7. новембра 2024. године.

Зашто пишем овај чланак?

Овај чланак је настао од фрагмената мог дневника који сам водио док сам се бавио дигитализацијом књига и администрацијом и уређивањем сајта, сервисирањем рачунара и рачунарске мреже Музеја. У дневнику су забележени многобројни интересантни догађаји и анегдоте везане за одржавање Windows OS-а, сервисирање рачунара, инсталације разноликих програма, спасавање обрисаних података, застоја на мрежи итд. Из тог дневника сам решио да објавим најинтересантније и најупотребљивије записе. На овај начин, који описујем у овом чланку, и уз коришћење програма које сам наменски за ту сврху написао, успео сам да за 7 година, колико сам радио тај посао, брзо и ефикасно дигитализујем сва стара и нова музејска издања монографија, књига и каталога објављена од 1998. до 2018. године, која нису била већ дигитализована, и све скупа објавим на Музејском сајту. Пошто ускоро почињем да газим седму деценију живота, пишем да не заборавим, а вама на корист и да ме не заборавите…

Кренимо на посао!

До краја овог чланка сазнаћете како да направите PDF који ћете моћи одмах објавити на Web-у и MsWord документ који је спреман за коректуру, а потом и за прелом и припрему за штампу у јако кратком року. Али да кренемо од почетка. Поступак следи корак по корак:

1.Фотографисати књигу страну по страну.

2. Ротирати све фотографисане странице за 90 степени улево.

3. Обрезати све странице да буду истих димензија, тако да се одбаци оно што је фотоапарат снимио ван странице.

4. Направити PDF од обрезаних страница.

5. Оживети текст у PDF-у – или како испод слике сваког слова поставити одговарајући карактер, да би PDF могао да се претражује, а његов садржај копира.

6. PDF конвертовати у MsWord документ.

Упозорење: Пре почетка поступка копирати фолдер са свим фотографисаним/скенираним страницама у нови фолдер који можете да насловите НЕ_ДИРАЈ, како у случају да нешто пође у погрешном смеру не би морали опет све испочетка да скенирате или фотографишете!!!

А сад редом следе детаљна објашњења и програмски кôд.

1.Фотографисати књигу страну по страну.

Фотоапарат мора бити:

а) стабилно фиксиран за неки сталак тако да има увек исту удаљеност од страница које слика,

б) повезан са компјутером како би се се свака фотографија одмах испоручивала компјутеру, тако да одмах имате увид на великом екрану да ли је фотографија исправна за даљу обраду. Ако није, исправите шта није у реду и фотографишите поново, а неисправну фотографију одмах обришите, да је не би после тражили и губили време.

За фотографисање свих страница потребно је имати исто осветљење! Не радите у просторији у коју продире природна светлост, јер се њен квалитет стално мења и не можете добити све фотографије истоветног квалитета. Ако је квалитет свих фотографија исти, онда можете да направите неопходне корекције на свим сликама одједном; али ако фотографије нису истог квалитета, онда морате да коригујете једну по једну што је изузетно дуготрајан и напоран посао.

Да би објектив фотоапарата снимио што већу површину странице, оне су фотографисане положене, да би цела страница попунила сензор фотоапарата. Али, ретко кад се догоди да то буде савршено. Објектив готово увек ухвати нешто са стране што или није књига, или је део књиге који не треба да се види, нпр. рубови страница или прелом по средини књиге, где се лева и десна страница спајају. Исти проблем је и код скенирања. Сваку страницу књиге је потребно фотографисати на исти начин и под истим осветљењем. Никако не фотографишите из руке, јер ћете себи само направити велики посао ако због тога аутоматику не будете могли користити.

2. Ротирати све фотографисане стране за 90 степени улево.

То сам решио израдом Python3 програма који ће ротирати све слике у једном фолдеру улево за 90 степени, користећи библиотеку Pillow (Python Imaging Library). Прво, морате да инсталирате Pillow библиотеку, ако већ није инсталирана. Програм покренути у конзоли уписивањем следеће наредбе (ознака <ENTER> значи да треба после уписивања команде притиснути тастер Enter):

pip install Pillow <ENTER>

Затим, следи Python кôд који ће ротирати све слике у фолдеру за 90 степени улево:

import os
from PIL import Image

# Putanja do foldera sa slikama
folder_path = '/putanja/do/foldera'

# Funkcija za rotiranje slika
def rotate_images_left(folder_path):
    # Prolazi kroz sve fajlove u datom folderu
    for filename in os.listdir(folder_path):
        if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):  # Filtriranje samo slika
            image_path = os.path.join(folder_path, filename)
            
            # Otvara sliku
            with Image.open(image_path) as img:
                # Rotira sliku za 90 stepeni ulevo
                rotated_img = img.rotate(90, expand=True)
                
                # Čuva rotiranu sliku pod istim imenom
                rotated_img.save(image_path)
                print(f"{filename} je uspešno rotirana.")

# Pozivanje funkcije za rotaciju
rotate_images_left(folder_path)

Објашњење:

folder_path: Треба да замените ову варијаблу стварном путањом до фолдера у којем се налазе слике. Програм пролази кроз све фајлове у фолдеру, проверава да ли су то слике (.png, .jpg, .jpeg, .bmp, .gif). Свака слика се ротира за 90 степени улево (rotate(90)), а затим се сачува назад у исту датотеку.

Како користити:

Направи нови фајл obrni.py и Python програмски кôд копирај у њега. Постави слике које желиш да ротираш у неки фолдер, нпр.: „slike“. Покрени овај Python кôд након што унесеш исправну путању до тог фолдера. У Линуксу се путања од фолдера где је програм, до фолдера где су слике, ако је фолдер у којем су слике по хијерархији у вишем директоријуму, дефинише са „./slike“. Уписује се само оно што је између наводника. Све слике ће бити ротиране улево за 90 степени и сачуване са истим именима. Програм покрени у конзоли уписивањем следеће наредбе и притисни <ENTER> :

python3 obrni.py <ENTER>

3. Обрезати све странице књиге да буду истих димензија, тако да се одсече оно што је фотоапарат снимио ван странице

Ево Python3 програма који ће обрезати све слике у једном фолдеру. Користићемо библиотеку Pillow како бисмо обрезали слике. Можеш одредити које димензије обреза желиш да примениш. Ево кôда који ће обрезати све слике у датом фолдеру:

import os
from PIL import Image

# Putanja do foldera sa slikama
folder_path = '/putanja/do/foldera'

# Koordinate za obrezivanje (levo, gore, desno, dole)
# Ove vrednosti možeš prilagoditi prema tvojim potrebama
crop_box = (85,300,1030,1600)  # Na primer, obrezuje na središnji deo slike

# Funkcija za obrezivanje slika
def crop_images_in_folder(folder_path, crop_box):
    # Prolazi kroz sve fajlove u datom folderu
    for filename in os.listdir(folder_path):
        if filename.endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):  # Filtriranje samo slika
            image_path = os.path.join(folder_path, filename)
            
            # Otvara sliku
            with Image.open(image_path) as img:
                # Obrezuje sliku prema zadatom crop_box
                cropped_img = img.crop(crop_box)
                
                # Čuva obrezanu sliku pod istim imenom
                cropped_img.save(image_path)
                print(f"{filename} je uspešno obrezana.")

# Pozivanje funkcije za obrezivanje
crop_images_in_folder(folder_path, crop_box)

Објашњење:

folder_path: Треба да замениш ову варијаблу стварном путањом до фолдера, где се налазе слике које желиш да обрежеш.

crop_box: Дефинише обрезивање слике у формату (лево, горе, десно, доле), где су то координате пиксел по пиксел од леве горње ивице слике. На пример, (85,300,1030,1600) ће обрезати слику почевши од 85 пиксела од леве ивице и 300 пиксела од горње ивице слике, па све до 1030 пиксела од леве ивице и 1600 пиксела од горње ивице слике.

Програм пролази кроз све слике у назначеном фолдеру, обрезује их према задатом crop_box, и чува обрезане слике под истим именом.

Како користити:

Упозорење: Пре но што пробаш на свим сликама, одвој неколико слика у засебан фолдер и пробај док не добијеш обрезивање какво желиш. Са координатама које си опитом добио у пробном моделу можеш да обрадиш све слике. Препоручујем да користиш неки програм за обраду слика који има очитавање координата миша у оквирима слике. На Линуксу користим програм Pinta који се одлично показао.

Направи нови фајл obrezi.py и Python програмски кôд копирај у њега. Постави слике које желиш да обрежеш у неки фолдер. Унеси исправну путању до тог фолдера у варијаблу folder_path. Прилагоди вредности у crop_box према димензијама обрезивања које желиш. Покрени Python програм у конзоли:

python3 obrezi.py <ENTER>

4. Направити PDF од обрезаних страница

Ово је кôд Python3 програма који ће направити PDF документ од свих слика из једног фолдера. Слике ће бити поређане по називу од најмањег до највећег, а затим ће бити спојене у један PDF.

Програм користи библиотеку Pillow за рад са сликама и PyPDF2 за рад са PDF-ом. Можеш инсталирати потребне библиотеке тако да укуцаш у конзолу:

pip install Pillow PyPDF2 <ENTER>

Ево и Python кода који формира PDF документ од свих слика из једног фолдера:

import os
from PIL import Image

# Putanja do foldera sa slikama
folder_path = '/putanja/do/foldera'
# Ime rezultujućeg PDF fajla
output_pdf = 'output.pdf'

# Funkcija koja pravi PDF od slika
def create_pdf_from_images(folder_path, output_pdf):
    # Dobavljanje svih fajlova iz foldera i sortiranje po imenu
    image_files = [f for f in os.listdir(folder_path) if f.endswith(('.png', '.jpg', '.jpeg', '.bmp'))]
    image_files.sort()  # Sortiranje fajlova po imenu

    # Lista za čuvanje otvorenih slika
    images = []

    for filename in image_files:
        image_path = os.path.join(folder_path, filename)
        img = Image.open(image_path).convert('RGB')  # Pretvori u RGB format
        images.append(img)

    # Prva slika pravi PDF, ostale slike se dodaju nakon prve
    if images:
        images[0].save(output_pdf, save_all=True, append_images=images[1:])
        print(f"PDF je uspešno kreiran kao {output_pdf}.")
    else:
        print("Nema slika u folderu.")

# Pozivanje funkcije za pravljenje PDF-a
create_pdf_from_images(folder_path, output_pdf)

Како да користиш:

Направи нови фајл napravi_pdf.py и Python програмски кôд копирај у њега. Припреми фолдер са сликама које желиш да спојиш у PDF. Постави исправну путању до фолдера у варијаблу folder_path. Покрени Python програм и резултујући PDF фајл ће бити сачуван под именом које си дефинисао у output_pdf. Програм покрени у конзоли:

python3 napravi_pdf.py <ENTER>

5. Оживети текст у PDF-у, или како испод слике сваког слова поставити одговарајући карактер, да би PDF могао да се претражује а његов садржај копира.

Постоји неколико алата који могу аутоматски обрадити PDF фајлове и оживети текст. Један од најпопуларнијих алата за ову сврху је OCRmyPDF. Овај алат може додати препознати текст (OCR) директно у PDF фајлове, без потребе да прво конвертује PDF у слике, а затим назад у PDF.

Инсталација OCRmyPDF: Инсталирај потребне пакете: Прво, инсталирај OCRmyPDF и потребне зависности на Линуксу. Можеш то урадити помоћу следеће команде укуцане у конзолу:

sudo apt-get install ocrmypdf tesseract-ocr tesseract-ocr-srp <ENTER>

Коришћење OCRmyPDF:
Једном када је OCRmyPDF инсталиран, можеш га користити на следећи начин да оживиш текст у PDF-у. Упиши у конзолу и притисни <ENTER>

ocrmypdf -l srp ulazni_fajl.pdf izlazni_fajl.pdf <ENTER>

Објашњење команде:

-l srp: Ова опција поставља језик за препознавање текста на српски (ћирилицу). Да би се поставио језик за препознавање текста на српску латиницу команда је „-l srp+lat „:

ocrmypdf -l srp+lat ulazni_fajl.pdf izlazni_fajl.pdf <ENTER>

А за препознавање текста у којем је и српска латиница и ћирилица команда је “ -l srp+srp+lat“.

ocrmypdf -l srp+srp+lat ulazni_fajl.pdf izlazni_fajl.pdf <ENTER>


ulazni_fajl.pdf: Улазни PDF фајл који желиш да обрадиш.
izlazni_fajl.pdf: Назив излазног PDF фајла са препознатим текстом.
Предности OCRmyPDF-а
Аутоматска обрада: OCRmyPDF аутоматски пролази кроз сваку страницу PDF-а, конвертује је у слике, врши препознавање текста и враћа све назад у PDF.
Задржавање оригиналног формата: Овај алат чува оригинални изглед PDF-а, укључујући слике и форматирање.
Једноставност: Може се користити директно из командне линије са једноставном синтаксом.
Додатне опције: Можеш додати додатне опције ако желиш да оптимизујеш PDF или промовишеш квалитет препознавања текста. На пример, ако желиш да компресујеш излазни PDF, можеш додати „–optimize“:

ocrmypdf --optimize -l srp ulazni_fajl.pdf izlazni_fajl.pdf <ENTER>

6. PDF конвертовати у Word

Конвертовати PDF фајл са оживљеним текстом у Word документ (најчешће .docx формат). Прво инсталирај потребну библиотеку. Укуцај у конзолу и притисни <ENTER>:

pip install pdf2docx <ENTER>

Потом употреби пратећу Python скрипту да конвертујеш PDF у Word документ:

from pdf2docx import Converter

pdf_file = 'izlazni_fajl.pdf'
docx_file = 'Knjiga.docx'

# Create a converter object
cv = Converter(pdf_file)

# Convert PDF to Word
cv.convert(docx_file)

# Close the converter
cv.close()

izlazni_fajl.pdf је фајл који је креиран програмом OCRmyPDF за препознавање текста и овде је у улози улазног фајла. Направи нови фајл pdf2word.py и Python програмски кôд копирај у њега. Програм покрени у конзоли:

python3 pdf2word.py <ENTER>

На крају све ове програме можеш повезати у bash скрипти:

#!/bin/bash
python3 obrni.py
python3 obrezi.py
python3 napravi_pdf.py
ocrmypdf --optimize -l srp knjiga.pdf izlaz.pdf
python3 pdf2word.py

Направи нови фајл radi.sh и bash скрипту копирај у њега. Помоћу конзолне команде chmod направи да скрипта буде извршна:

chmod +x radi.py <ENTER>

Bash скрипту у конзоли покрени овако:

./radi.sh <ENTER>

И уживај у кафици док програми не одраде посао. На крају у фирми покупи сву славу тог дана као страшан хакер!

Ако на исти начин фотографишеш исте формате можеш само да мењаш садржај фолдера у којем су скениране странице. Програм и фотоапарат једном подесиш и не бринеш више да ћеш бескрајно дуго окретати и обрезивати разноразне jpg-ове.

И ето, на крају овог чланка добили смо PDF који може одмах да буде објављен на Web-у и Word документ који је спреман за коректуру и лектуру. Надам се да вам је овај чланак био од користи.

Срдачан поздрав.

(Visited 6 times, 1 visits today)

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *