티스토리 뷰

✅ 업무 흐름을 방해하는 무거운 PDF, PyMuPDF Pro로 가볍게 최적화하세요
고해상도 이미지, 삽입된 폰트, 숨겨진 메타데이터 등으로 인해 PDF 파일이 과도하게 커지면 이메일 첨부 전송이 느려지고, 저장 공간을 낭비하며, 모바일 사용자에게 불편을 주는 등 업무 흐름 전체에 영향을 미칠 수 있습니다. 이럴 때는 명확한 목표를 가진 최적화 전략이 필요합니다.
이 글에서는 다음의 세 가지 핵심 기법을 중심으로, PyMuPDF Pro를 활용해 과도하게 커진 PDF를 더 작고 빠르게 만드는 방법을 소개합니다:
- 메타데이터 및 불필요한 요소 제거
- 이미지 압축
- 폰트 서브세팅(Font Subsetting)
PyMuPDF Pro는 직관적인 API를 제공하여,
복잡한 PDF 최적화 작업도 간단한 코드 몇 줄로 처리할 수 있습니다.
1. 불필요한 요소 제거 (Dead-Weight Removal)
🔎 왜 중요한가요?
PDF에는 시간이 지남에 따라 저자 정보, 수정 이력, 타임스탬프 같은 메타데이터, 페이지 썸네일, 첨부 파일, 불필요한 주석 체인, 오래된 폼 필드 값 등 **숨겨진 데이터(Dead Weight)**가 쌓이기 쉽습니다.
이런 요소들은 파일 크기를 부풀릴 뿐만 아니라, 민감한 정보 유출 위험까지 동반합니다.
📌 대표적인 Dead Weight 사례
- 기업 백서나 기술 문서의 공개 배포 전 정리
- 웹사이트나 앱 내 PDF 임베딩 전 경량화
- 외부 공유 전 개인정보/내부 정보 제거
🛠 PyMuPDF Pro로 해결하는 방법
PyMuPDF Pro에서는 Document.scrub() 메서드 한 줄만으로 불필요한 모든 요소를 한 번에 정리할 수 있습니다:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
import pymupdf
doc = pymupdf.open("input.pdf")
doc.scrub(
metadata=True, # Clears basic metadata
xml_metadata=True, # Removes XML metadata
attached_files=True, # Deletes file attachments
embedded_files=True, # Deletes embedded files
thumbnails=True, # Strips page thumbnails
reset_fields=True, # Reverts form fields to their defaults
reset_responses=True, # Removes annotation replies
)
doc.ez_save("lean.pdf")
|
cs |
여기서 scrub() 메서드는 불필요한 객체들을 제거하고,
ez_save()(발음: "이지 세이브")는 논리적으로 삭제된 콘텐츠가 실제 출력 파일에서도 완전히 제거되도록 보장합니다.
이 과정을 거치면, 더 작고 개인 정보 보호에 안전한 PDF를 만들 수 있습니다.
📌 최상의 결과를 얻으려면, 이 메서드들은 파일을 저장하기 직전에 단 한 번만 실행하는 것이 좋습니다.
2. 폰트 서브세팅(Font Subsetting)
🔎 왜 중요한가요?
PDF에 전체 폰트 파일을 삽입하면, 문서에서 단 몇 글자만 사용하더라도 폰트 하나당 수십에서 수백 KB의 용량이 추가될 수 있습니다. 이로 인해 원래는 단순한 PDF가 불필요하게 큰 파일이 되어 다운로드나 공유 시 부담이 됩니다.
📌 대표적인 사례
- 다국어 매뉴얼 제작 시, 다양한 문자셋 포함
- 서식 있는 주석(rich-text annotation) 생성
- 폼 필드 위젯에 서식 있는 텍스트 입력 또는 수정 시
🛠 PyMuPDF Pro로 해결하는 방법
PyMuPDF Pro는 **내장된 폰트를 자동으로 서브세팅(subset)**하여,
실제로 사용된 글자(glyph)만 포함되도록 처리합니다.
이 기능 덕분에 시각적으로는 동일한 문서를 유지하면서도,
불필요한 폰트 데이터를 제거하여 파일 용량을 크게 줄일 수 있습니다.
doc.subset_fonts()
doc.ez_save("output.pdf")
이 과정은 시각적 품질을 해치지 않으면서도,
폰트로 인한 불필요한 용량 부담을 크게 줄여줍니다.
⚠️ 중요
이 메서드는 파일을 저장하기 직전에 단 한 번만 실행해야 합니다.
3. 고급 이미지 압축 (Advanced Image Compression)
🔎 왜 중요한가요?
고해상도 이미지는 PDF 용량을 키우는 가장 큰 원인 중 하나입니다.
300DPI의 사진 몇 장만으로도 수십 MB가 추가되어 업로드 속도를 느리게 하고 이메일 첨부에 부담을 주며 모바일 사용자에게는 불편을 유발할 수 있습니다.
📌 대표적인 사례
- 슬라이드 자료, 제품 카탈로그, 브로셔 등을 이메일로 공유할 때
- 모바일 앱에 최적화된 가벼운 PDF 게시
- 용량이 제한된 저장소에 스캔 문서 보관 시
🛠 PyMuPDF Pro로 해결하는 방법
PyMuPDF Pro의 Document.rewrite_images() 메서드는 이미지를 픽셀 수준까지 제어할 수 있게 해줍니다.
- 해상도 줄이기 (downsampling)
- 재압축 (recompressing)
- 흑백(그레이스케일) 변환 등
필요에 따라 이미지 용량을 최소화하면서도 시각적 품질은 유지할 수 있도록 설계되어 있습니다.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import pymupdf
doc = pymupdf.open("input.pdf")
doc.rewrite_images(
dpi_threshold=100, # only process images above 100 DPI
dpi_target=72, # downsample to 72 DPI
quality=60, # JPEG quality level
lossy=True, # include / exclude lossy images
lossless=True, # include / exclude lossless images
bitonal=True, # include / exclude monochrome images
color=True, # include / exclude colored images
gray=True, # include / exclude gray-scale images
set_to_gray=True, # convert to gray-scale before conversion
)
doc.ez_save("compressed_images.pdf")
|
cs |
이 예제에서는 100 DPI를 초과하는 모든 이미지를 해상도 72 DPI, 그레이스케일, **JPEG 포맷 (품질 60%)**으로 변환합니다.
이렇게 하면 이미지 용량이 70~90%까지 줄어드는 경우도 많습니다.
이미지가 전혀 필요 없다면, PyMuPDF의 레닥션(redaction) 주석 기능을 활용해 이미지를 완전히 제거할 수도 있습니다.
|
1
2
3
4
5
6
7
8
|
for page in doc:
page.add_redact_annot(page.rect)
page.apply_redactions(
images=pymupdf.PDF_REDACT_IMAGE_REMOVE, # remove images
graphics=pymupdf.pymupdf.PDF_REDACT_LINE_ART_NONE, # don't touch graphics
text=pymupdf.PDF_REDACT_TEXT_NONE, # don't touch text
)
doc.ez_save("images_stripped.pdf")
|
cs |
🧹 이미지 완전 제거: Redaction 주석
redaction 주석을 사용하면, 페이지 내 모든 이미지를 완전히 삭제하고 텍스트 및 벡터 그래픽만 남길 수 있습니다.
→ 시각 요소를 최소화한 극단적인 파일 용량 절감이 가능합니다.
💾 4. 고급 저장 옵션 (Advanced Save Options)
지금까지 수행한 scrub(), 이미지 다운샘플링, 폰트 서브세팅 등은 모두 메모리 상에서만 적용된 작업입니다.
만약 참조되지 않는 객체(“유령 객체”)를 물리적으로 제거하거나, 내부 스트림(이미지, 폰트 등)을 압축하지 않으면, 파일 크기는 여전히 최적화되기 전과 크게 다르지 않을 수 있습니다.
✅ PyMuPDF Pro의 Document.save() 옵션 활용하기
PyMuPDF Pro의 save() 메서드는 다음과 같은 최적화 파라미터를 통해
불필요한 객체 제거 및 스트림 압축을 수행할 수 있습니다:
| garbage=3 | 사용되지 않는 객체를 찾아 제거 및 중복 제거 수행 |
| deflate=True | 압축되지 않은 스트림(이미지, 폰트 등)에 zlib 압축 적용 |
| use_objstms=True | PDF 내 텍스트 기반 객체를 스트림 구조로 전환하여 추가 압축 수행 → 보통 추가로 25% 이상 용량 절감 가능 |
이러한 옵션들을 조합하면 최종 저장 시 진짜로 작고 효율적인 PDF를 생성할 수 있습니다.
필요하다면 save() 전체 파라미터를 적용한 예제 코드도 제공해 드릴게요.
|
1
2
3
4
5
6
7
8
|
doc.save(
"output.pdf",
garbage=3, # de-duplicate and drop unreferenced objects
deflate=True, # zlib-compress any loose streams
use_objstms=True # convert text objects into compressible streams
)
# Or simply:
doc.ez_save("output.pdf")
|
cs |
💡 ez_save()로 간편하게 최종 저장
ez_save() 메서드는 위에서 설명한 모든 최적화 옵션을 내부적으로 자동 적용하여, 디스크에 저장되는 PDF가 실제로 모든 최적화를 반영하도록 보장해줍니다.
✅ 결론
불필요한 요소 제거, 이미지 최적화, 폰트 서브세팅을 결합하면 과도하게 큰 PDF 파일을 작고 효율적인 문서로 탈바꿈시킬 수 있습니다. 이러한 최적화는 특히 이메일 첨부, 모바일 앱용 경량 문서, 웹에 업로드할 PDF에 유용하게 활용할 수 있습니다.
PyMuPDF Pro의 직관적인 API는 이 모든 강력한 최적화 기법들을 간단한 코드로 손쉽게 구현할 수 있게 해줍니다.이제 콘텐츠 품질에 집중하고, 파일 크기나 전송 문제는 PyMuPDF Pro에게 맡기세요.
💬 더 알아보기
제품에 대해 궁금하신 내용은 언제든 문의해주세요!
> 홈페이지 바로가기
'PyMuPDF Pro' 카테고리의 다른 글
| PDF를 페이지별로 분할하는 가장 쉬운 방법: 'PyMuPDF Pro' (샘플 코드 포함) (5) | 2025.08.11 |
|---|---|
| 'PyMuPDF Pro'를 활용한 PDF 주석 및 강조 표시: 샘플 코드 포함 (5) | 2025.08.08 |
| 'PyMuPDF Pro'로 PDF에 워터마크 삽입하기 완벽 가이드: 샘플 코드 포함 (2) | 2025.08.06 |
| 'PyMuPDF Pro'로 PDF 문서에서 표 추출하기: 샘플 코드 포함 (4) | 2025.08.01 |
| 'PyMuPDF Pro'를 활용한 PDF 양식 자동 작성 및 flatten 처리 자동화: 코드 샘플 포함 (2) | 2025.07.31 |
- Total
- Today
- Yesterday
- 페이퍼리스
- 문서ai
- djvu
- 전자문서
- 이파피루스
- ocr
- PDF변환
- 아티펙스
- 고장예측
- 인공지능
- pdf뷰어
- 모터센스
- pdf추출
- PDF-Pro
- Ai
- pdf프로그램
- 이벤트
- PDF편집
- 전자서식
- 피터팬
- paperless
- 예지보전
- PyMuPDFPro
- PDFpro
- 파이썬라이브러리
- 스마트공장
- epapyrus
- 피터펜
- pdf프로
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |