2025년 7월 28일 월요일

[2025-07-28] python 에서 html to pdf 변환 비교

[2025-07-28] python 에서 html to pdf 변환 비교

안녕하세요. 클스 입니다.


html로 작성된 문서를 RAG를 하기위해서 html을 그대로 사용해도 되지만, 불필요한 테그가 있어 비효율 적입니다. 그렇다고 테그를 제거하면 표 등 레이아웃이 깨지게 됩니다.

일반적으로  pdf가 많이 사용됩니다. 그래서 macos에서 많이 사용하는 2개의 라이브러리를 비교해보고자 합니다.

1. html 을 바로 변환하는 방법 : weasyprint    [장점] 가볍다.

2. html 을 브라우저로 열어서 변환하는 방법 : playwright  
   [장점] 풍부하게 css를 처리한다.

코드

###### html to pdf #########
'''
외부망에서 해야 함
brew install pango
uv pip install weasyprint
'''
from weasyprint import HTML

html_file = '~/doc/test.html'
# 1. 문자열 경로를 Path 객체로 만듭니다.
path_obj = Path(html_file)
# 2. .with_suffix() 메서드로 확장자를 변경합니다.
pdf_file = path_obj.with_suffix('.pdf')
HTML(filename=html_file).write_pdf(pdf_file)


'''
외부망에서 해야함.
# 1. Playwright 라이브러리 설치
uv pip install playwright

# 2. Playwright가 제어할 브라우저(Chromium 등) 설치 (라이브러리 엄청 크네)
python -m playwright install
'''


import asyncio
from pathlib import Path
from playwright.async_api import async_playwright

async def convert_local_html_to_pdf_async(html_file_path: str, output_pdf_path: str):
"""
(비동기) 로컬 HTML 파일을 Playwright를 사용하여 PDF 파일로 변환합니다.
IPython/Jupyter 환경에 최적화되었습니다.

:param html_file_path: 변환할 원본 HTML 파일의 전체 경로
:param output_pdf_path: 저장할 PDF 파일의 전체 경로
"""
# pathlib.Path를 사용하여 파일 경로를 브라우저가 인식하는 file:// URI 형식으로 변환합니다.
# 이렇게 하면 공백이나 한글 등 특수문자가 포함된 경로도 안전하게 처리됩니다.
html_file_uri = Path(html_file_path).as_uri()
print("Playwright를 시작합니다...")
# 'async with'를 사용하여 비동기 컨텍스트 매니저를 실행합니다.
async with async_playwright() as p:
# 모든 I/O 작업(네트워크, 파일 시스템 등) 앞에 'await' 키워드를 붙여줍니다.
browser = await p.chromium.launch()
page = await browser.new_page()
try:
print(f"HTML 파일 로딩 중: {html_file_uri}")
# 페이지로 이동하고 로딩이 끝날 때까지 기다립니다.
await page.goto(html_file_uri)

print(f"PDF 파일 생성 중: {output_pdf_path}")
# PDF 생성이 완료될 때까지 기다립니다.
await page.pdf(
path=output_pdf_path,
print_background=True, # 배경 그래픽(색상, 이미지 등) 인쇄
format='A4' # 용지 형식 지정
)
print(f"✅ 성공: '{output_pdf_path}' 파일이 생성되었습니다.")

except Exception as e:
print(f"❌ 오류 발생: {e}")
finally:
print("브라우저를 닫습니다.")
# 브라우저 종료가 완료될 때까지 기다립니다.
await browser.close()

async def main():
"""
비동기 작업을 실행하기 위한 메인 함수
"""
# 1. 변환할 원본 HTML 파일 경로를 설정하세요.
'~/doc/test.html'

# 2. 저장할 PDF 파일 이름을 자동으로 설정합니다 (확장자만 .pdf로 변경).
output_file = Path(html_file).with_suffix('.pdf')

# 3. 위에서 정의한 비동기 변환 함수를 호출합니다.
await convert_local_html_to_pdf_async(html_file, str(output_file))


# IPython/Jupyter 환경에서는 'await'를 직접 사용하여 비동기 함수를 실행할 수 있습니다.
await main()


결론

둘다 레이아웃의 깨짐 없이 잘 변환해준다. 내가 선택하려면 자동화를 위해서 1번을 선택하는것이 맞다.

또 하나는 결과 파일의 크기 이다.

1) 51KB

2) 520KB


이상 클스 였습니다.


라벨: , , , ,

2021년 1월 12일 화요일

Google Colab 에 영구적인 Package 설치 방법

Google Colab 에 영구적인 Package 설치 방법


1. 개요

Google Colab을 이용하면 머신러닝에 필요한 자원을 할당받아 활용할 수 있다.

그러나 주어진 세션의 한계 (12시간 마다 초기화), 혹은 런타임 초기화 시 모든 설치된 Package가 사라진다.

여러 패키지를 사용한다면 매번 설치하는 번거로움 있다.

그래서 영구적인 설정 법을 설명한다.


2. 개념

Colab을 연결해서 사용하기 시작하면 구글 드리이브에 아래 2개 디렉토리가 자동으로 생성된다.

'/content/notebooks'
'/content/mnt/My Drive/Colab Notebooks'

Colab을에서 기본으로 만들어주다 보니 
'/content/notebooks' 이 디렉토리는 세션이 종료되거나,
런타임을 초기화 하면 전부 지워진다.


그래서 내 드라이브 하위에 생성된 '/content/mnt/My Drive/Colab Notebooks' 이 디렉토리와
심볼릭 링크를 걸어서 사용하면 된다.


3. 방법 및 소스

소스는 Colab에 붙혀넣고 실행하면 된다. 나는 다른 폴더에 만들고 싶었으나 오류가 발생하였다.

# 구글 드라이브에 Python Package 영구 설치
# 이후 모든 Notebook 파일 시작에 상단을 추가해서 실행해줘야 함. 단 1회만 하면됨

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

nb_path = '/content/notebooks'
nb_package_path = nb_path + '/packages'
my_path = '/content/mnt/My Drive/Colab Notebooks'

os.symlink(my_path, nb_path, target_is_directory=True)
sys.path.insert(0, nb_package_path)


# Python Package 설치

!pip install --target=$nb_package_path jdc
!pip install --target=$nb_package_path ray
!pip install --target=$nb_package_path modin[ray]

# 설치된 패키지 테스트

!ls '/content/notebooks/packages'
!ls '/content/notebooks'
!ls '/content/mnt/My Drive/Colab Notebooks/packages'

# 세션 / 런타임 초기화

1) 메뉴 > 런타임 > 런타임 초기화
2) 구글 드라이브 마운트

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

3) 디렉토리 내용 보기
!ls '/content/mnt/My Drive/Colab Notebooks/packages'



!ls '/content/notebooks/packages'
여기는 마운트가 안되서 오류남

4) 마운트하고 심볼릭 링크 연결함

import os, sys
from google.colab import drive

drive.mount('/content/mnt')

nb_path = '/content/notebooks'
nb_package_path = nb_path + '/packages'
my_path = '/content/mnt/My Drive/Colab Notebooks'

os.symlink(my_path, nb_path, target_is_directory=True)
sys.path.insert(0, nb_package_path)

5) 파일 확인
!ls '/content/notebooks/packages'

여기서 sys.path.insert(0, nb_package_path) 이렇게 Path를 넣어줘야 패키지 로딩시 기본위치가 됨

이상입니다.


라벨: , , ,

2020년 12월 23일 수요일

AI, ML, Bigdata 아키텍쳐에 대한 정리

 안녕하세요. KEULSTAR 입니다.


AI, ML, Bigdata 아키텍쳐에 대한 정리를  하고자 합니다.

App을 만들거나, 프로젝트를 진행하다 보면 어떤것이 좋을까? 에 대한 고민은 항상   수반됩니다.


머신러닝, AI 알고리즘을 구동하려면 GPU가 있어야 되지만, 그것도 효과적으로 활용할 수 있는

Framewrok이 있어야 하고, 잘 활용할 수 있어야 합니다.


이런 것들에 대해 프로젝트 진행과 함께 포스팅 해보고자 합니다.

라벨: , , ,