전자책(eBook)을 수험서처럼 활용하거나 필기를 하려면 Goodnote나 Notability 같은 어플에서 열고 싶을 때가 많죠. 그러나 이런 기능이 기본 앱에서는 제한적이라 불편할 수 있습니다.
이번에 소개할 코드는 알라딘 전자책을 캡처해서 PNG 이미지로 만드는 과정을 자동화한 것입니다.(windows 환경) 이 매크로 도구는 페이지를 빠르고 정확하게 스캔해주는 기능을 제공합니다. 이를 통해 공부 자료로 활용하기 쉽게 전자책을 정리할 수 있습니다.
매크로 도구 소개
이 매크로 도구의 핵심은 알라딘 eBook 서비스에서 eBook 페이지를 캡처하는 반복 작업을 자동화하는 Python 스크립트입니다. pyautogui를 사용한 자동화, pynput을 사용한 마우스 제어, 그리고 실시간 확대를 위한 tkinter와 같은 강력한 Python 라이브러리 조합을 사용하여 이 스크립트는 전체 과정을 단순화합니다. 최소한의 수동 입력으로 몇 번의 클릭만으로 콘텐츠를 추출할 수 있습니다.
이 매크로를 효과적으로 사용하는 방법과 기능을 좀 더 자세히 살펴보겠습니다.
매크로 도구의 주요 기능
- 마우스 좌표 캡처: 스크립트는 화면에서 캡처하려는 영역을 정의할 시작과 끝 좌표를 선택하도록 합니다. 사용자는 두 지점(시작과 끝)을 클릭하여 영역을 설정할 수 있으며, 도구는 이 지점을 기록하여 정확한 스크린샷 작업을 준비합니다.
- 정밀한 선택을 위한 실시간 확대기: 주요 기능 중 하나는 tkinter와 PIL(Pillow) 라이브러리로 구축된 실시간 확대 창입니다. 이 확대기는 마우스 포인터 주변의 확대된 뷰를 제공하여, eBook 페이지의 시작과 끝 지점을 정확하게 선택할 수 있게 합니다. 작은 텍스트나 세부 사항을 다룰 때 특히 유용하여 오류를 최소화하는 데 도움을 줍니다.
- 자동 핫키 및 드래그 동작: 좌표가 설정되면, 스크립트는 기본 Windows 화면 캡처 도구를 불러오는 Win + Shift + S 단축키를 누릅니다. 이후 마우스 커서를 시작 지점으로 이동시킨 후 끝 지점까지 자동으로 드래그하여 페이지를 캡처합니다.
- 페이지 넘기기: 효율성을 더욱 높이기 위해, 스크립트는 오른쪽 화살표 키를 눌러 eBook의 다음 페이지로 이동하는 동작을 자동으로 수행합니다. 이 기능은 책을 수동으로 넘기는 시간을 최소화하여 연속적으로 페이지를 캡처할 수 있게 합니다.
코드 리뷰 및 설명
이제 각 코드의 주요 부분을 코드 리뷰 형식으로 분석해 보겠습니다.
1. 라이브러리 임포트
import time
import pyautogui
from pynput.mouse import Listener, Controller
import threading
import numpy as np
import tkinter as tk
from PIL import Image, ImageTk, ImageDraw
- pyautogui: 마우스 이동, 키 입력 시뮬레이션, 화면 캡처 등 자동화 작업에 사용됩니다. 다소 직관적이지만 Windows 환경에서는 권한 문제로 인해 정상 동작하지 않을 수도 있으므로, 관리자 권한으로 실행해야 할 수 있습니다.
- pynput.mouse: 마우스 이벤트를 제어하고 좌표를 설정하는 데 사용됩니다. Listener는 클릭 이벤트를 감지하고, Controller는 마우스를 프로그램적으로 제어하는 역할을 합니다.
- tkinter & PIL: GUI 구성 및 이미지 처리를 위해 사용됩니다. 특히 확대기를 만들어 더 정밀한 좌표 설정이 가능하게 합니다.
2. 실시간 확대기 기능
def live_magnifier():
global root
root = tk.Tk()
root.title("Magnifier")
label = tk.Label(root)
label.pack()
zoom_size = 100
zoom_factor = 3
def update_frame():
if start_point is None or end_point is None:
x, y = mouse.position
try:
screenshot = pyautogui.screenshot(region=(x - zoom_size // 2, y - zoom_size // 2, zoom_size, zoom_size))
frame = screenshot.resize((zoom_size * zoom_factor, zoom_size * zoom_factor), Image.LANCZOS)
draw = ImageDraw.Draw(frame)
pointer_x = zoom_size * zoom_factor // 2
pointer_y = zoom_size * zoom_factor // 2
radius = 5
draw.ellipse((pointer_x - radius, pointer_y - radius, pointer_x + radius, pointer_y + radius), fill='red')
tk_image = ImageTk.PhotoImage(frame)
label.config(image=tk_image)
label.image = tk_image
except Exception as e:
print(f"Error with live magnifier: {e}")
root.after(100, update_frame)
else:
root.destroy()
update_frame()
root.mainloop()
- Tkinter UI 구성: 확대기 창을 생성하고 Label 위젯에 이미지를 표시합니다.
- 스크린샷 및 확대: pyautogui.screenshot()을 사용하여 마우스 주변을 캡처하고 확대합니다. 이 과정에서 성능 문제가 발생할 수 있으므로 너무 높은 확대 배율은 피하는 것이 좋습니다.
- 마우스 포인터 표시: 현재 확대된 이미지 중앙에 마우스 포인터를 빨간 원으로 표시하여 사용자가 정확한 위치를 파악할 수 있도록 도와줍니다.
3. 마우스 클릭 이벤트 리스너
def on_click(x, y, button, pressed):
global start_point, end_point
if pressed:
if start_point is None:
start_point = (x, y)
print(f"Start point set at: {start_point}")
elif end_point is None:
end_point = (x, y)
print(f"End point set at: {end_point}")
return False
- 시작 및 끝 좌표 설정: 첫 번째 클릭은 시작 좌표, 두 번째 클릭은 끝 좌표를 설정합니다. 이렇게 설정된 좌표는 이후 스크린샷에 사용됩니다.
- Listener 종료: 두 번째 좌표 설정 후 return False로 리스너를 종료합니다. 불필요한 이벤트 감지를 막아 성능을 개선합니다.
4. 매크로 동작
def macro():
for _ in range(1):
time_s = 0.3
pyautogui.hotkey('win', 'shift', 's')
time.sleep(time_s)
if start_point is not None and end_point is not None:
start_x, start_y = start_point
end_x, end_y = end_point
pyautogui.moveTo(start_x, start_y)
pyautogui.dragTo(end_x, end_y, duration=0.5, button='left')
time.sleep(time_s)
else:
print("Error: Start and end points are not set.")
return
pyautogui.press('right')
time.sleep(time_s)
- 화면 캡처 호출: pyautogui.hotkey('win', 'shift', 's')로 화면 캡처 도구를 호출합니다. 여기서 time.sleep(time_s)을 통해 적절한 대기 시간을 주어 도구가 실행될 시간을 확보합니다.
- 드래그 캡처: 설정된 좌표를 사용해 드래그하여 영역을 선택합니다. 이때 duration을 통해 드래그 속도를 조절할 수 있습니다. 너무 빠르게 설정하면 정확한 영역을 선택하지 못할 수도 있으니 적절히 조정합니다.
- 페이지 넘김: 캡처 후 다음 페이지로 이동하기 위해 오른쪽 화살표 키를 누릅니다.
주요 이점 및 코드 개선 아이디어
- 효율성: 반복 작업을 최소화하고 빠른 캡처가 가능합니다.
- 정확성: 확대 기능을 통해 캡처 영역의 경계를 정확하게 지정할 수 있습니다.
- 코드 개선: pyautogui의 다양한 기능을 활용해 사용자의 작업 패턴에 맞게 매크로를 커스터마이징할 수 있습니다. 추가적으로, 스레딩과 최적화 기법을 사용해 확대기 성능을 개선할 여지도 있습니다.
결론
이 매크로 도구를 사용하면 알라딘 서비스에서 eBook 페이지를 손쉽고 간편하게 캡처할 수 있습니다. 반복 작업에 대한 효율적인 솔루션을 찾고 있는 사람에게 이 매크로는 상당한 시간을 절약해 줄 수 있습니다.
더 많은 자동화 도구에 관심이 있거나 다른 서비스에 맞게 스크립트를 맞춤화하는 방법에 대해 깊이 알아보고 싶다면, 댓글로 알려주세요! 함께 자동화를 좀 더 연구해 봅시다.