PDF 회전 검증 및 품질 관리 - 완벽한 정렬 확인 가이드
PDF 회전 후 검증 및 품질 보증
PDF 회전 완료 후 회전이 제대로 적용되었는지, 페이지가 손상되지 않았는지, 메타데이터가 보존되었는지 검증하는 것이 중요합니다. 페이지 크기 확인, 콘텐츠 검증, 메타데이터 보존, 시각적 확인 등 단계별 품질 관리 방법을 제시합니다.
회전 검증 단계별 프로세스
| 단계 | 검증 항목 | 도구/명령 | 예상 시간 |
|---|---|---|---|
| 1 | 기본 파일 정보 | pdfinfo | 1 s |
| 2 | 회전 적용 여부 | 페이지 크기 비교 | 1 s |
| 3 | 파일 무결성 | qpdf --check | 2~3 s |
| 4 | 콘텐츠 검증 | 시각적 확인 | 10~30 s |
| 5 | 메타데이터 보존 | exiftool | 1 s |
| 6 | 전체 검증 | 배치 검증 | 5~10 s |
Step 1: 기본 파일 정보 확인
명령어 (CLI)
# Linux/Mac/Windows (Git Bash) pdfinfo rotated.pdf출력:
Title:
Author:
Subject:
Creator: PDFtk
Producer: (ghostscript)
CreationDate: Mon Mar 15 10:30:45 2026
ModDate: Mon Mar 21 14:22:10 2026
Trapped: False
Pages: 100
Encrypted: no
Page size: 612 x 792 pts (A4)
Page rot: 0
File size: 25641234 bytes
Optimized: no
PDF version: 1.4
정보 파싱 (Python)
import subprocessdef get_pdf_info(pdf_file): result = subprocess.run(['pdfinfo', pdf_file], capture_output=True, text=True) info = {} for line in result.stdout.split(' '): if ':' in line: key, value = line.split(':', 1) info[key.strip()] = value.strip() return info
pdf_info = get_pdf_info('rotated.pdf') print(f"✓ 페이지 수: {pdf_info.get('Pages')}") print(f"✓ 파일 크기: {pdf_info.get('File size')}") print(f"✓ 페이지 크기: {pdf_info.get('Page size')}") print(f"✓ 회전: {pdf_info.get('Page rot')}")
Step 2: 회전 적용 여부 확인
페이지 크기 비교 (회전 감지)
#!/bin/bash ORIGINAL="input.pdf" ROTATED="output.pdf"원본 페이지 크기
ORIG_SIZE=ORIGINAL" | grep "Page size" | head -1) echo "원본 페이지 크기: $ORIG_SIZE"
회전 후 페이지 크기
ROT_SIZE=ROTATED" | grep "Page size" | head -1) echo "회전 후 페이지 크기: $ROT_SIZE"
크기 변경 확인 (90도 회전 시 가로세로 바뀜)
if [ "ROT_SIZE" ]; then echo "✓ 회전 적용됨 (페이지 크기 변경)" else echo "⚠ 회전 미적용 또는 원래 정사각형" fi
Python로 회전 각도 검증
from PyPDF2 import PdfReaderdef verify_rotation(original_pdf, rotated_pdf): """회전 각도 검증""" orig_reader = PdfReader(original_pdf) rot_reader = PdfReader(rotated_pdf)
orig_page = orig_reader.pages[0] rot_page = rot_reader.pages[0] # 원본 크기 orig_w = float(orig_page.mediabox.width) orig_h = float(orig_page.mediabox.height) # 회전 후 크기 rot_w = float(rot_page.mediabox.width) rot_h = float(rot_page.mediabox.height) print(f"원본: {orig_w:.0f} × {orig_h:.0f}") print(f"회전 후: {rot_w:.0f} × {rot_h:.0f}") # 회전 각도 추론 if abs(orig_w - rot_h) < 1 and abs(orig_h - rot_w) < 1: print("✓ 90도 또는 270도 회전 감지") elif orig_w == rot_w and orig_h == rot_h: print("✓ 회전 미적용 또는 0도 회전") else: print("✓ 복잡한 변환 적용")
verify_rotation('input.pdf', 'output.pdf')
Step 3: 파일 무결성 검사
qpdf 검증
# 기본 검사 qpdf --check rotated.pdf출력:
PDF version: 1.4
File is not encrypted
According to the PDF spec, this file is a valid PDF.
(No errors found)
상세 검사
qpdf --check --verbose rotated.pdf
손상된 경우 복구
qpdf --recompile-pdf rotated.pdf rotated_repaired.pdf
Ghostscript 검증
gs -sDEVICE=nullpage -dNOPAUSE -dBATCH rotated.pdf오류 없으면 성공
오류 있으면 수정된 파일 생성:
gs -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -sOutputFile=fixed.pdf rotated.pdf
Step 4: 콘텐츠 검증
첫 페이지와 마지막 페이지 시각적 확인
#!/bin/bash ROTATED="rotated.pdf"첫 페이지 이미지로 변환 (확인)
gs -sDEVICE=png256 -dNOPAUSE -dBATCH -dFirstPage=1 -dLastPage=1
-sOutputFile=first_page.png "$ROTATED" echo "✓ 첫 페이지 생성: first_page.png"마지막 페이지 이미지로 변환
TOTAL_PAGES=ROTATED" | grep Pages | awk '{print $2}') gs -sDEVICE=png256 -dNOPAUSE -dBATCH -dFirstPage=TOTAL_PAGES
-sOutputFile=last_page.png "$ROTATED" echo "✓ 마지막 페이지($TOTAL_PAGES) 생성: last_page.png"시각적 검사 (첫/마지막 페이지가 올바른 방향인지 확인)
텍스트 콘텐츠 추출 및 검증
#!/bin/bash ROTATED="rotated.pdf"전체 텍스트 추출
pdftotext "$ROTATED" rotated_text.txt echo "✓ 텍스트 추출 완료"
라인 수로 콘텐츠 확인
LINE_COUNT=$(wc -l < rotated_text.txt) echo "✓ 콘텐츠 라인 수: $LINE_COUNT"
텍스트 방향 확인 (좌에서 우로 읽히는지)
head -20 rotated_text.txt
Python 콘텐츠 검증
from PyPDF2 import PdfReaderdef verify_content_readability(pdf_file): """회전 후 콘텐츠 읽기 가능 여부 검증""" reader = PdfReader(pdf_file) all_text = ""
for page_num, page in enumerate(reader.pages, 1): try: text = page.extract_text() all_text += text + " " # 페이지별 텍스트 길이 확인 if len(text) < 50: print(f"⚠ 페이지 {page_num}: 텍스트 부족 ({len(text)}자)") else: print(f"✓ 페이지 {page_num}: 텍스트 정상 ({len(text)}자)") except Exception as e: print(f"✗ 페이지 {page_num} 텍스트 추출 실패: {e}") print(f" ✓ 총 {len(all_text)} 문자 추출됨") # 읽기 가능 여부 판단 if len(all_text) > 100: print("✓ 콘텐츠 읽기 가능") else: print("⚠ 콘텐츠 부족 또는 텍스트 추출 실패")
verify_content_readability('rotated.pdf')
Step 5: 메타데이터 보존 확인
메타데이터 비교
#!/bin/bash ORIGINAL="input.pdf" ROTATED="output.pdf"echo "=== 메타데이터 비교 ===" echo "원본:" pdfinfo "$ORIGINAL" | grep -E "^(Title|Author|Subject|Creator|Producer)"
echo "" echo "회전 후:" pdfinfo "$ROTATED" | grep -E "^(Title|Author|Subject|Creator|Producer)"
차이 확인
echo "" echo "=== 비교 결과 ===" if diff <(pdfinfo "ROTATED" | sort) > /dev/null; then echo "✓ 메타데이터 동일" else echo "⚠ 메타데이터 변경됨" diff <(pdfinfo "ROTATED" | sort) fi
메타데이터 검증 (Python)
from PyPDF2 import PdfReaderdef check_metadata_preserved(original_pdf, rotated_pdf): """메타데이터 보존 확인""" orig_reader = PdfReader(original_pdf) rot_reader = PdfReader(rotated_pdf)
orig_meta = orig_reader.metadata or {} rot_meta = rot_reader.metadata or {} print("=== 원본 메타데이터 ===") for key, value in orig_meta.items(): print(f" {key}: {value}") print(" === 회전 후 메타데이터 ===") for key, value in rot_meta.items(): print(f" {key}: {value}") # 비교 print(" === 검증 ===") if orig_meta == rot_meta: print("✓ 메타데이터 완벽 보존됨") else: print("⚠ 메타데이터 변경됨") for key in orig_meta: if orig_meta.get(key) != rot_meta.get(key): print(f" 변경: {key}")
check_metadata_preserved('input.pdf', 'output.pdf')
자동화 검증 스크립트
완전 검증 Bash 스크립트
#!/bin/bash ORIGINAL="$1" ROTATED="$2"echo "========== PDF 회전 검증 보고서 ==========" echo "원본 파일: $ORIGINAL" echo "회전 파일: $ROTATED" echo ""
1. 기본 정보
echo "--- 1. 기본 정보 ---" pdfinfo "$ROTATED" | head -15
2. 회전 여부 확인
echo "" echo "--- 2. 회전 확인 ---" ORIG_SIZE=ORIGINAL" | grep "Page size" | head -1) ROT_SIZE=ROTATED" | grep "Page size" | head -1) echo "원본: $ORIG_SIZE" echo "회전: $ROT_SIZE"
if [ "ROT_SIZE" ]; then echo "✓ 회전 적용됨" else echo "⚠ 회전 미적용" fi
3. 무결성 검사
echo "" echo "--- 3. 파일 무결성 ---" qpdf --check "$ROTATED"
4. 메타데이터
echo "" echo "--- 4. 메타데이터 ---" exiftool "$ROTATED" | head -10
5. 텍스트 콘텐츠
echo "" echo "--- 5. 콘텐츠 확인 ---" pdftotext "$ROTATED" /tmp/check.txt LINE_COUNT=$(wc -l < /tmp/check.txt) echo "콘텐츠 라인 수: $LINE_COUNT"
echo "" echo "========== 검증 완료 =========="
Python 완전 검증 스크립트
from PyPDF2 import PdfReader import subprocess import osdef full_validation_report(original_pdf, rotated_pdf): print("="*50) print("PDF 회전 완전 검증 보고서") print("="*50)
# 1. 페이지 수 orig_reader = PdfReader(original_pdf) rot_reader = PdfReader(rotated_pdf) orig_pages = len(orig_reader.pages) rot_pages = len(rot_reader.pages) print(f" ✓ 페이지 수:") print(f" 원본: {orig_pages}페이지") print(f" 회전: {rot_pages}페이지") if orig_pages == rot_pages: print(f" ✓ 페이지 수 동일") else: print(f" ✗ 오류: 페이지 수 변경됨") # 2. 파일 무결성 print(f" ✓ 파일 무결성:") result = subprocess.run(['qpdf', '--check', rotated_pdf], capture_output=True, text=True) if "not valid" in result.stdout: print(f" ✗ 파일 손상됨") else: print(f" ✓ 파일 정상") # 3. 메타데이터 print(f" ✓ 메타데이터:") orig_metadata = orig_reader.metadata or {} rot_metadata = rot_reader.metadata or {} if orig_metadata == rot_metadata: print(f" ✓ 메타데이터 보존됨") else: print(f" ⚠ 메타데이터 변경됨") # 4. 파일 크기 orig_size = os.path.getsize(original_pdf) / (1024*1024) rot_size = os.path.getsize(rotated_pdf) / (1024*1024) change = ((rot_size - orig_size) / orig_size) * 100 print(f" ✓ 파일 크기:") print(f" 원본: {orig_size:.2f} MB") print(f" 회전: {rot_size:.2f} MB") print(f" 변화: {change:+.1f}%") # 5. 콘텐츠 샘플 print(f" ✓ 콘텐츠 검증:") try: first_text = rot_reader.pages[0].extract_text()[:100] last_text = rot_reader.pages[-1].extract_text()[:100] print(f" 첫 페이지: {first_text.replace(chr(10), ' ')[:50]}...") print(f" 마지막 페이지: {last_text.replace(chr(10), ' ')[:50]}...") print(f" ✓ 콘텐츠 정상") except Exception as e: print(f" ⚠ 콘텐츠 추출 오류: {e}") print(" " + "="*50) print("검증 완료") print("="*50)사용
full_validation_report('input.pdf', 'output.pdf')
회전 검증 체크리스트
| 항목 | 확인 사항 | 정상 상태 |
|---|---|---|
| 페이지 수 | 원본과 동일 | ✓ 일치 |
| 파일 무결성 | qpdf --check 결과 | ✓ 오류 없음 |
| 회전 여부 | 페이지 크기 변경 | ✓ 90도/270도 회전 시 변경 |
| 콘텐츠 | 첫/마지막 페이지 표시 | ✓ 올바른 방향 |
| 메타데이터 | 제목, 작성자 등 | ✓ 보존 또는 의도적 제거 |
| 텍스트 추출 | pdftotext 결과 | ✓ 정상 텍스트 추출 |
회전 검증 실패 시 대응
문제 1: 페이지 수 변경
# 원본 재처리
pdftk original.pdf cat 1-endeast output rotated.pdf
echo "✓ 재처리 완료"
문제 2: 파일 손상
# qpdf로 복구
qpdf --recompile-pdf rotated.pdf rotated_fixed.pdf
echo "✓ 파일 복구 완료"
문제 3: 메타데이터 손실
# ExifTool로 복구
exiftool -overwrite_original -Title="제목" -Author="작성자" rotated.pdf
echo "✓ 메타데이터 복구 완료"
FAQ
- Q: 검증 얼마나 자주? A: 회전 직후 한 번, 배포 전 한 번 권장
- Q: 모든 검증 단계가 필요한가? A: Step 1~3은 필수, 4~6은 용도에 따라
- Q: 시간이 얼마나 걸리나? A: 전체 100 MB 파일 기준 10~15초
- Q: 검증 실패하면? A: 파일 복구 후 재회전 또는 원본에서 재시작
댓글
댓글 쓰기