Overview
rhel 환경에서 Chrome을 활용하여 html을 pdf 변환 하는 작업이 완료되었다. 하지만 변환된 파일이 기존 파일인 html 파일보다 최대 3~4배까지 용량이 늘어나는 현상이 있으므로 이걸 줄이는 방법을 알아보도록 하자.
PDF 용량이 큰 이유
HTML 파일이 PDF 파일로 변환 될 때 파일크기가 증가하는 이유는 여러가지가 있지만 크게 3가지로 정리할 수 있다
- Rendering Contents : HTML 페이지는 텍스트 기반의 코드로 구성되어 있지만, PDF 파일은 이를 완전한 페이지 이미지로 렌더링한다. 페이지에 CSS 스타일링, 복잡한 레이아웃, 폰트 임베딩 등 추가되면 파일의 크기가 커진다
- 이미지 및 자원 : HTML 페이지에 포함된 이미지가 고해상도이거나 외부 자원을 사용하는 경우 PDF 파일 크기가 증가할 수 있다. (PDF 변환 과정에서 이미지들이 원본 해상도로 포함되기 때문)
- Font Embedding: PDF는 문서가 어디에서나 동일하게 보이도록 설계되었다. 이를 위해 사용하는 폰트들을 문서 내부에 임베딩하는데 이 작업이 파일 크기를 증가시킨다.
PDF 변화 과정
그럼 PDF가 변환되는 과정을 조금 자세하게 알아보자. (이 문서에선 headless chrome을 사용하여 변환하는 과정을 알아볼 것)
- Web Rendering Engine 사용
- Web Rendering Engine을 이용해 주로 HTML을 PDF로 변환한다. google의 headless chrome에서는 Blink 렌더링 엔진을 사용하여 PDF로 변환한다.
Rendering Engine?
Rendering Engine은 웹 브라우저에서 웹 페이지를 화면에 렌더링하기 위해 사용하는 소프트웨어다. 웹 페이지 구성요소인 HTML,CSS, Javascript를 파싱하고, 그것들의 레이아웃을 계산해 화면에 표시될 위치를 결정한다.
- HTML/CSS 파싱
- HTML문서와 연관된 CSS를 파싱하여 웹 페이지의 구조와 스타일 정보를 해석한다. 웹 페이지에 DOM 트리를 구성하고, 각 요소에 적용할 스타일을 결정한다.
- Render tree 구성
- DOM 트리와 스타일 정보를 결합하여 렌더 트리를 구성한다. 여기서 렌더 트리는 실제 화면에 표시 되는 요소들만 포함된다. 렌더 트리를 구성하는 이유는 요소의 레이아웃을 계산하는데 사용된다.
- 레이아웃 계산
- 각 요소의 정확한 위치와 크기를 계산한다. 웹 페이지가 실제로 어떻게 보일지 결정하는 과정이다. PDF 변환의 과정에서 페이지 크기, 여백 등 PDF 형식에 특화된 레이아웃 설정이 적용된다.
- Page randering 및 PDF 생성
- 레이아웃이 결정되면, 웹 페이지를 PDF로 출력한다.
- Font 및 Image 처리
- PDF 변환 시 폰트와 이미지는 특별 처리가 필요하다. 웹 폰트는 PDF에 임베딩될 수 있어야 하며,
이미지는 PDF 파일의 크기와 품질을 고려하여 적절히 최적화 되어야 한다.
- PDF 변환 시 폰트와 이미지는 특별 처리가 필요하다. 웹 폰트는 PDF에 임베딩될 수 있어야 하며,
RHEL 환경에서 Headless Chrome을 이용한 PDF 변환
현재 오프라인 환경의 rhel에서 pdf를 변환하고 용량을 줄이는 실험을 진행하는 상태다. usb에 필요한 파일을 담아 진행해보자. (test에 진행한 html 파일은 0.94MB이다.)
- 우선 기존의 명령어를 사용해서 PDF로 변환한다.
google-chrome --no-sandbox --headless --disable-gpu --print-to-pdf=/path/to/example.pdf "/path/to/example.html" # 변환 완료된 PDF의 용량 (3.72MB) -rw-r--r--, 1 root root 3902872 Apr 30 14:52 example.pdf
- 만약 Ghostscrip가 설치되어 있지 않은 RHEL이라면, 설치를 먼저 진행해야 한다. (RHEL을 설치할 때 GUI 옵션을 선택하였다면 따라서 설치되었을 확률이 높다.)
- ghostscript 설치하기
yum install ghostscript
- 오프라인의 환경에서 사용하기 위해 ghostscript를 rpm으로 만들 상황이 생긴다면 다음과 같이 진행하자
# 관련된 의존성을 rpm으로 만들려면 yumdownloader의 명령어가 필요, 없다면 설치해주자 yum install yum-utils # 관련된 의존성들을 설치하는 명령어, rpm들을 usb에 담아 옮겨주자 yumdownloader --resolve ghostscript
- ghostscript 설치하기
- Linux 환경에서는 명령줄 기반 도구로 PDF 압축을 할 수 있다. (ghostscript를 설치했으면 동일하게 진행한다.)
# 압축을 실행하는 명령어 gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed_example.pdf /example.pdf
- 위 명령어 설정들의 설명
- -sDEVICE=pdfwrite
- 출력장치를 지정, pdfwrite는 pdf 파일을 생성하거나 수정할 때 사용되는 Ghostscript의 드라이버
- -dCompatibilityLevel=1.4
- 생성될 pdf의 버전을 설정
- -dPDFSETTINGS=/screen
- 출력 품질과 압축 수준을 설정한다.
- 품질 수준
- /screen - 가장 낮은 해상도와 최대 압축(스크린 보기용)
- /ebook - 중간 해상도 (전자책용)
- /printer - 높은 해상도 (인쇄용)
- /prepress - 높은 해상도와 인쇄를 위한 최소 압축(전문인쇄용)
- 품질 수준
- 출력 품질과 압축 수준을 설정한다.
- -dNOPAUSE
- 처리 중간에 사용자의 입력을 기다리지 않고 명령을 계속 실행
- -dQUIET
- 실행 중에 상태메시지를 표현하지 않는다.
- -dBATCH
- 명령이 완료된 후 Ghostscript가 자동으로 종료되로록 한다.
- -sDEVICE=pdfwrite
- 위 명령어 설정들의 설명
- 각 출력 품질을 변경해가면서 기존 PDF 파일과 용량이 얼마나 차이가 나는지 알아보자
# 압축을 실행하는 명령어 gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed_example.pdf /example.pdf # 기존 pdf 3.72MB, /screen 실행 시 1.64MB -rw-r--r--, 1 root root 1724686 May 2 15:19 compressed_example.pdf # 기존 pdf 3.72MB, /ebook 실행 시 1.65MB -rw-r--r--, 1 root root 1736965 May 2 15:20 compressed_example.pdf # 기존 pdf 3.72MB, /printer 실행 시 2.01MB -rw-r--r--, 1 root root 2115599 May 2 15:21 compressed_example.pdf # 기존 pdf 3.72MB, /prepress 실행 시 2.01MB -rw-r--r--, 1 root root 2115152 May 2 15:22 compressed_example.pdf
- 결과 정리
출력 품질 기존 PDF(MB) 압축 PDF(MB) /screen 3.72 1.64 /ebook 3.72 1.65 /printer 3.72 2.01 /prepress 3.72 2.01
- 결과 정리
결론
기존 pdf 파일의 용량인 3.72MB에서 최소 품질인 /screen 옵션으로 실행 시 2.08MB가 줄어든 1.64MB가 되었다. 최대 높은 해상도를 가진 /printer나 /prepress옵션도 1.71MB나 줄어듬으로 효과적이라고 생각할 수 있다. 각 상황에 맞는 옵션 설정을 하면서 압축을 진행하면 될 것 같다.
Reference
Puppeteer | Puppeteer
build
pptr.dev
wkhtmltopdf
What is it? wkhtmltopdf and wkhtmltoimage are open source (LGPLv3) command line tools to render HTML into PDF and various image formats using the Qt WebKit rendering engine. These run entirely "headless" and do not require a display or display service. The
wkhtmltopdf.org
Understanding Role of Rendering Engines in Browsers | BrowserStack
Deep dive to understand the role of browser engine and the rendering engine in how the Browser works making its performance seamless
www.browserstack.com
'인프라' 카테고리의 다른 글
RHEL 리눅스 권한 체계 (0) | 2025.02.20 |
---|---|
RHEL 디렉토리 구조 (0) | 2025.02.20 |
Docker에서 rhel8.8 설치하기/rhel8.8 Container에 chrome headless 설치하기 (0) | 2025.02.18 |
PM2 살펴보기 (0) | 2025.02.18 |
Offline에서 Docker 설치하기 (0) | 2023.02.02 |