E-Book으로 책을 결제 하고 책을 다 보고 나면, 원하는 순간 간편하게 검색해서 찾고 싶을때가 있다. 그런데 E-Book은 몇가지 문제점이 있다.
내가 직접 결제한 책을 원하는 상황에 따라 보기 위해 직접 검색이 가능한 PDF를 만들어 보기로 했다.
개인이 배포를 하지 않고 직접 사용하는것은 불법이 아니라고 한다. (물론 배포되면 안된다) 무료로 사용하기 위함이 아니라 직접 결제한 책을 좀더 자유로운 환경에서 보기 위함이다.
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초마다 진행될 수 있게끔 한다
만들어진 스크린샷 대부분은 정상적으로 잘 나오지만 영상의 프레임이 바뀌는 순간에 촬영이 되거나, 이미지 저장시 깨지는 경우가 발생한다. 이 부분은 수동으로 다시 촬영을 해야한다. ( 폴더 위치는 서로 다르게 해야 안겹친다 ) 이때는 자동으로 촬영이 아니라 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
로 실행한다잘못된 영상은 삭제 처리 해야한다. (파일 이름 순서는 신경쓰지 않는다) 이후 수동으로 찍은 영상의 번호를 맞추어 스크린샷을 삽입한다.
이 작업은 없어도 되지만 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의 넘버링을 부여해서 넣자.
다음의 절차로 만들어진 스크린샷으로 PDF
를 만든다
미리보기
앱을 실행열기
로 만들어진 스크린샷 파일 전체 선택파일 - 프린트 - PDF - PDF로 저장
( 방향은 책 기준이면 가로로 변경 )만들어진 PDF는 검색기능이 없으므로 검색기능이 가능하도록 하자 ( 용량도 줄어들게 한다 ).
해당 방식은 다음 블로그를 따라해서 만들었다
OCR을 통해 PDF를 검색하고 글자를 복사해오자. (pinedance.github.io)
Python에서도 가능하다고 하지만
한글
이나영문
이 제대로 출력되질 않았다. 버그인지 잘못된것인지는 모르지만 원하는 결과가 나오질 않았다. 또한 이것저것 설치해야할 부분이 많아서 도커 리눅스 서버에서 진행했다.
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 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
로 하는 방식도 소개하는데 따라해보니 스크린샷이 흑백으로 나온다. 해서 정상적으로 된 하나의 방식만을 소개한다