PDF 압축 후 검증하기 - 품질 확인 및 오류 점검 완벽 가이드
PDF를 압축한 후 단순히 사용하면 안 됩니다. 텍스트 손상, 이미지 흐려짐, 파일 오류 등을 사전 검증해야 합니다. 올바른 검증 방법으로 품질을 보증하면서도 비용을 절감할 수 있습니다.
압축 후 검증이 중요한 이유
- 품질 보증: 압축으로 손실된 부분 확인
- 파일 무결성: 파일 손상 여부 확인
- 규정 준수: 법적 문서는 완전성 검증 필수
- 사용자 신뢰: 배포 전 오류 최소화
- 성능 최적화: 재압축 여부 판단
검증 항목 12단계 체크리스트
| 번호 | 항목 | 확인 방법 | 통과 기준 |
|---|---|---|---|
| 1 | 파일 열림 | PDF 리더로 열기 | 정상 열림 |
| 2 | 파일 크기 | 원본과 압축본 비교 | 예상 감소율 도달 |
| 3 | 페이지 수 | 전체 페이지 확인 | 원본과 동일 |
| 4 | 텍스트 인식 | 텍스트 선택 및 복사 | 복사 가능 |
| 5 | 이미지 품질 | 확대하여 픽셀 확인 | 선명함, 손상 없음 |
| 6 | 색상 정확도 | 원본과 비교 | 일치 (색차 <5) |
| 7 | 폰트 렌더링 | 특수 폰트 표시 | 정상 렌더링 |
| 8 | 하이퍼링크 | 링크 클릭 테스트 | 모두 작동 |
| 9 | 표 및 형식 | 표 정렬 및 경계 | 정확한 정렬 |
| 10 | 파일 무결성 | pdfinfo, qpdf 실행 | 오류 없음 |
| 11 | 메타데이터 | 파일 속성 확인 | 손상 없음 |
| 12 | 최종 승인 | 모든 항목 검토 | 모두 통과 |
시각적 검증
1단계: 전체 문서 스캔
- 첫 페이지: 레이아웃 및 텍스트 확인
- 중간 페이지: 이미지 품질 확인
- 마지막 페이지: 형식 손상 여부
2단계: 상세 검증
- 텍스트: 100% 줌으로 픽셀 단위 선명도
- 이미지: 색감·명도·콘트라스트 비교
- 표·그래프: 경계선·정렬 정확도
커맨드라인 검증
파일 정보 확인
# PDF 기본 정보 pdfinfo compressed.pdf페이지 수 확인
pdfinfo compressed.pdf | grep Pages
파일 손상 여부
gs -sDEVICE=nullpage -dNOPAUSE -dBATCH compressed.pdf 2>&1 | grep -i error
고급 검사
qpdf --check compressed.pdf
텍스트 추출 검증
# 텍스트 추출 가능 여부 pdftotext compressed.pdf - | head -20전체 텍스트 통계
pdftotext compressed.pdf - | wc -l
특정 단어 검색
pdftotext compressed.pdf - | grep -i "keyword"
이미지 추출 검증
# 이미지 추출 pdftoppm -jpeg compressed.pdf page추출된 이미지 크기 확인
ls -lh page-*.jpg | head -5
이미지 속성 확인
identify page-1.jpg
Python 자동화: 일괄 검증
from PyPDF2 import PdfReader import osdef validate_compressed_pdf(original_pdf, compressed_pdf): """압축 전후 PDF 검증"""
print("=== PDF 압축 검증 === ") # 원본 정보 orig_reader = PdfReader(original_pdf) orig_pages = len(orig_reader.pages) orig_size = os.path.getsize(original_pdf) / (1024 * 1024) # 압축본 정보 comp_reader = PdfReader(compressed_pdf) comp_pages = len(comp_reader.pages) comp_size = os.path.getsize(compressed_pdf) / (1024 * 1024) # 비교 reduction = (1 - comp_size / orig_size) * 100 print(f"원본:") print(f" 크기: {orig_size:.1f} MB") print(f" 페이지: {orig_pages}") print() print(f"압축본:") print(f" 크기: {comp_size:.1f} MB") print(f" 페이지: {comp_pages}") print() print(f"검증 결과:") # 페이지 수 확인 if orig_pages == comp_pages: print(f" ✓ 페이지 수: 일치 ({orig_pages})") else: print(f" ✗ 페이지 수: 불일치 ({orig_pages} → {comp_pages})") # 파일 크기 감소율 print(f" ✓ 용량 감소: {reduction:.1f}%") # 첫 페이지 텍스트 추출 시도 try: first_page = comp_reader.pages[0] text = first_page.extract_text() if text and len(text.strip()) > 0: print(f" ✓ 텍스트 추출: 가능 ({len(text)} 글자)") else: print(f" ⚠ 텍스트 추출: 불가능 (OCR 필요)") except Exception as e: print(f" ✗ 텍스트 추출: 오류 ({str(e)})") # 최종 결론 print() if orig_pages == comp_pages and reduction > 20: print("✓ 검증 통과: 배포 가능") elif orig_pages == comp_pages: print("⚠ 검증 부분 통과: 감소율 낮음 (재압축 고려)") else: print("✗ 검증 실패: 재압축 필요")사용 예
validate_compressed_pdf('original.pdf', 'compressed.pdf')
검증 보고서 템플릿
| 항목 | 상태 | 세부사항 | 결과 |
|---|---|---|---|
| 파일 무결성 | ✓ | 손상 없음, pdfinfo 정상 | 통과 |
| 페이지 수 | ✓ | 원본 100 = 압축본 100 | 통과 |
| 파일 크기 | ✓ | 원본 100 MB → 압축본 35 MB (65% 감소) | 통과 |
| 텍스트 인식 | ✓ | 모든 텍스트 추출 가능 | 통과 |
| 이미지 품질 | ✓ | 100% 줌에서 선명함, 손상 없음 | 통과 |
| 색상 정확도 | ✓ | 원본과 일치, 색차 < 5 | 통과 |
| 링크·책갈피 | ✓ | 모두 작동 | 통과 |
| 최종 결론 | ✓ 승인 | 모든 항목 통과, 배포 준비 완료 | 배포 가능 |
색상 정확도 검증
#!/bin/bash # 색상 정확도 검증 (ImageMagick 필요)ORIGINAL="original.pdf" COMPRESSED="compressed.pdf"
첫 페이지 이미지로 변환
convert -density 150x150 "$ORIGINAL"[0] original_page.jpg convert -density 150x150 "$COMPRESSED"[0] compressed_page.jpg
색상 비교
compare -metric RMSE original_page.jpg compressed_page.jpg diff.jpg
echo "색상 차이 분석 완료: diff.jpg"
배치 검증 스크립트
#!/bin/bash # 모든 압축 파일 일괄 검증COMPRESSED_DIR="./compressed_pdfs" REPORT_FILE="validation_report.txt"
{ echo "=== PDF 압축 검증 보고서 ===" echo "생성일: $(date)" echo ""
total_files=$(ls "$COMPRESSED_DIR"/*.pdf 2>/dev/null | wc -l) error_count=0 echo "개별 파일 검증:" for pdf in "$COMPRESSED_DIR"/*.pdf; do filename=$(basename "$pdf") if pdfinfo "$pdf" > /dev/null 2>&1; then pages=$(pdfinfo "$pdf" | grep Pages | awk '{print $2}') size=$(du -h "$pdf" | cut -f1) echo " ✓ $filename ($pages 페이지, $size)" else echo " ✗ $filename (오류)" ((error_count++)) fi done echo "" echo "검증 결과:" echo "총 파일: $total_files" echo "오류: $error_count" if [ $error_count -eq 0 ]; then echo "결론: ✓ 모든 파일 검증 완료, 배포 가능" else echo "결론: ✗ $error_count개 파일 오류, 재처리 필요" fi} | tee "$REPORT_FILE"
echo "보고서 저장: $REPORT_FILE"
문제 발견 시 대응
| 문제 | 원인 | 해결책 |
|---|---|---|
| 텍스트 흐려짐 | 해상도 과도 감소 | 더 높은 DPI로 재압축 (/printer) |
| 이미지 뭉침 | JPEG 품질 과도 감소 | JPEG 품질 85% 이상으로 재압축 |
| 색상 손실 | 색상 공간 변환 | sRGB 유지하여 재압축 |
| 파일 손상 | 압축 오류 | Ghostscript로 복구 후 재압축 |
FAQ
- Q: 검증에 소요 시간? A: 100개 파일 약 10~20분, 자동화 스크립트 사용 권장.
- Q: 텍스트 손상 여부 확인? A: 모든 페이지에서 선택·복사 시도.
- Q: 이미지 품질 기준? A: 100% 줌에서 픽셀 보이지 않을 정도.
- Q: 색상 정확도? A: 색차 ΔE < 5 (눈으로 구분 불가).
- Q: 법적 문서 기준? A: 모든 12개 항목 통과 필수.