E-Book에서 PDF추출하기(With Python)

JunMyung Lee·2023년 11월 15일
0

파이썬

목록 보기
4/4

E-Book으로 책을 결제 하고 책을 다 보고 나면, 원하는 순간 간편하게 검색해서 찾고 싶을때가 있다. 그런데 E-Book은 몇가지 문제점이 있다.

  • 해당 프로그램을 통해서 보지 않으면 볼 수가 없다
  • 스크린샷을 찍어도 저장이 안된다
  • 기기별 등록 및 찾아가야하는 절차가 필요하다

내가 직접 결제한 책을 원하는 상황에 따라 보기 위해 직접 검색이 가능한 PDF를 만들어 보기로 했다.

개인이 배포를 하지 않고 직접 사용하는것은 불법이 아니라고 한다. (물론 배포되면 안된다) 무료로 사용하기 위함이 아니라 직접 결제한 책을 좀더 자유로운 환경에서 보기 위함이다.

Step 1. 촬영하기

  • 맥 기준으로 촬영할 영상 사이즈를 맞추고 재생 버튼을 클릭한다 (CMD + SHIFT + 5)
  • 3초마다 오른쪽 화살표 버튼을 자동으로 눌러주는 Python 코드를 실행한다
import pyautogui  
import time  
  
# 3초마다 오른쪽 방향키를 누르는 함수  
def press_right_arrow_every_3_seconds():  
    while True:        pyautogui.press('right')  # 오른쪽 방향키 누르기  
        time.sleep(3)  # 3초 대기  
  
press_right_arrow_every_3_seconds()

E-Book으로 촬영하면 내용이 보이기 때문이다

Step 2. 스크린샷 저장하기

  • 이제 3초마다 지정된 좌표(영상 사이즈)로 스크린샷을 저장하는 코드를 실행한다
import multiprocessing  
import os  
import time  
from datetime import datetime  
  
import pyautogui  
  
  
def print_hello_and_sleep():  
    print("Hello, World!")  
    time.sleep(5)  
  
  
def save(a, b):  
    print_time()  
    screenshot = pyautogui.screenshot(region=a)  
    screenshot.save(os.path.join('/data/screenshot_auto', b))  
    print(f"{b} 저장완료")  
  
  
def print_time():  
    print(datetime.now().strftime("%H:%M:%S.%f"))  
  
  
if __name__ == "__main__":  
    x1, y1 = 120, 100  
    x2, y2 = 3650, 2350  
  
    count = 0  
    while True:  
        process = multiprocessing.Process(target=save,  
                                          args=[(x1, y1, x2 - x1, y2 - y1), f"screenshot_{str(count).zfill(3)}.png"])  
        process.start()  
        count = count + 1  
        time.sleep(3)
  • /data/screenshot_auto 폴더에 순차적으로 저장한다
  • 맥 기준으로 스크린샷을 저장하려면 권한을 휙득해야 해서 terminal에서 sudo로 실행한다

이미지를 저장할때 3초마다 실행이 되질 않고 대략 1초에서 1.2초 정도 사이마다 시간이 벌어지게 된다. 이는 이미지를 다 저장할때까지 프로세스가 기다렸다가 다음 프로세스가 진행되기 때문인데 해당 이슈를 해결하기 위해 Python MultiProcessing방식으로 처리하여 3초마다 진행될 수 있게끔 한다

Step 3. 잘못된 스크린샷 수동 저장

만들어진 스크린샷 대부분은 정상적으로 잘 나오지만 영상의 프레임이 바뀌는 순간에 촬영이 되거나, 이미지 저장시 깨지는 경우가 발생한다. 이 부분은 수동으로 다시 촬영을 해야한다. ( 폴더 위치는 서로 다르게 해야 안겹친다 ) 이때는 자동으로 촬영이 아니라 Space bar 버튼을 누를때마다 촬영이 되도록 한다.

import multiprocessing  
import os  
from datetime import datetime  
  
import pyautogui  
import keyboard  
  
  
def save(a, b):  
    print_time()  
    screenshot = pyautogui.screenshot(region=a)  
    screenshot.save(os.path.join('/data/screenshot_manual', b))  
    print(f"{b} 저장완료")  
  
  
def print_time():  
    print(datetime.now().strftime("%H:%M:%S.%f"))  
  
  
if __name__ == "__main__":  
    x1, y1 = 120, 100  
    x2, y2 = 3650, 2350  
    count = 0  
    while True:  
        keyboard.wait("space")  
        process = multiprocessing.Process(target=save,  
                                          args=[(x1, y1, x2 - x1, y2 - y1),  
                                                f"screenshot_{str(count).zfill(3)}.png"])  
        process.start()  
        count = count + 1
  • /data/screenshot_manual 폴더에 순차적으로 저장한다
  • 맥 기준으로 스크린샷을 저장하려면 권한을 휙득해야 해서 terminal에서 sudo로 실행한다

잘못된 영상은 삭제 처리 해야한다. (파일 이름 순서는 신경쓰지 않는다) 이후 수동으로 찍은 영상의 번호를 맞추어 스크린샷을 삽입한다.

Step 4. 스크린샷 파일 이름 재 정렬

이 작업은 없어도 되지만 0번 스크린샷 순서를 누락하거나 변경하고자 할때 사용하고 기록용으로 남겨둔다

#!/bin/bash  
  
# 대상 폴더  
target_folder="/data/screenshots"  
rename_folder="/data/screenshots_order"  
  
# 폴더 내의 파일 목록을 숫자순으로 정렬  
file_list=($(ls -1 "$target_folder" | sort -n -t_ -k2))  
  
# 파일 이름을 변경  
#echo ${#file_list[@]}-1  
for ((i=0; i<${#file_list[@]}; i++)); do  
  original_file="${target_folder}/${file_list[$i]}"  
  new_number=$(printf "%03d" $((i+5)))  
  new_file="${rename_folder}/screenshot_${new_number}.png"  
  cp "$original_file" "$new_file"  
  echo "Renamed $original_file to $new_file"  
done
  • /data/screenshots 폴더의 파일 리스트를 가져온다
  • $((i+5)) 를 최초 넘버링을 부여해서 새로운 파일로 저장한다. ( 새로이 저장되는 번호가 5 )

$((i+5))는 5번부터 시작이 되게 한다. 누락되는 파일이 1개여서 앞에 하나의 파일만 추가하면 될시, $((i+1)) 로 하여 최초 넘버링을 1로 하게 하고, 추가되는 파일은 0의 넘버링을 부여해서 넣자.

Step 5. PDF 생성

다음의 절차로 만들어진 스크린샷으로 PDF를 만든다

  • 맥 기준으로 미리보기 앱을 실행
  • 열기로 만들어진 스크린샷 파일 전체 선택
  • 파일 - 프린트 - PDF - PDF로 저장 ( 방향은 책 기준이면 가로로 변경 )

Step 5. OCR 추출

만들어진 PDF는 검색기능이 없으므로 검색기능이 가능하도록 하자 ( 용량도 줄어들게 한다 ).
해당 방식은 다음 블로그를 따라해서 만들었다

OCR을 통해 PDF를 검색하고 글자를 복사해오자. (pinedance.github.io)

Python에서도 가능하다고 하지만 한글이나 영문이 제대로 출력되질 않았다. 버그인지 잘못된것인지는 모르지만 원하는 결과가 나오질 않았다. 또한 이것저것 설치해야할 부분이 많아서 도커 리눅스 서버에서 진행했다.

Debian 서버

  • Python3 설치
apt-get install python3 python-setuptools # Python3 및 pip3 설치
  • Ocrmypdf 설치
apt-get install ocrmypdf # PDF 추출 Python module

# 설치 제대로 안되면 업데이트 이후 재설치
apt-get update
  • pymupdf 설치
pip3 install -U pymupdf # 작업 이후 PDF용량 증가 방지
  • tesseract 설치 (다른 언어 필요시 추가 설치)
apt-get install tesseract-ocr-kor # 한글 팩
apt-get install tesseract-ocr-eng # 영문 팩

# tesseract 예외시 tesseract 선 설치
apt-get install tesseract
  • Docker 파일 전송
docker cp {로컬 PDF파일} {도커 서비스명}:{전송받을 PDF 파일 위치}
  • OCR 실행
ocrmypdf  -l kor+eng --deskew --force-ocr --output-type pdfa --pdfa-image-compression jpeg  {PDF파일} {OCR PDF파일}

--pdfa-image-compression 옵션으로 인해서 기존 파일 용량보다 많이 작아진다

블로그에 보면 pdfsandwich로 하는 방식도 소개하는데 따라해보니 스크린샷이 흑백으로 나온다. 해서 정상적으로 된 하나의 방식만을 소개한다

0개의 댓글