피드로 돌아가기
Adding PDF support to a Rust image converter — what I learned about libvips and PDF rendering
Dev.toDev.to
Backend

libvips 기반 PDF 렌더링 최적화 및 DPI 제한을 통한 리소스 효율화

Adding PDF support to a Rust image converter — what I learned about libvips and PDF rendering

Serhii Kalyna2026년 4월 22일4intermediate

Context

Rust와 Axum, libvips를 활용한 이미지 변환 시스템에 PDF 지원 기능을 추가하는 과정 분석. 단순 이미지 처리와 달리 PDF의 다중 페이지 구조와 렌더링 엔진별 결과물 차이라는 기술적 제약 발생.

Technical Solution

  • VipsImage의 page 파라미터를 활용한 Multi-page PDF 개별 렌더링 및 Zip 압축 파이프라인 구축
  • Rendering Quality 확보를 위해 Poppler와 Pdfium(Skia) 백엔드의 텍스트 래스터화 특성 차이 분석
  • 메모리 과부하 방지를 위해 사용자 요청 DPI를 72~300 범위로 제한하는 DPI Clamping 로직 도입
  • libvips의 Tile-based streaming 방식을 통해 대용량 버퍼 처리 시 OOM(Out of Memory) 가능성 차단
  • 파일 시스템과 Registry 간의 불일치를 해결하기 위해 NotFound 에러를 처리하는 정밀한 Cleanup 로직 구현

- PDF 렌더링 도입 시 vips -l 명령어를 통해 pdfiumload 지원 여부 확인 및 Skia 백엔드 검토 - 고해상도 이미지 처리 시 OOM 방지를 위해 입력 파라미터에 대한 엄격한 상한선(Clamp) 설정 - 파일 삭제 로직 구현 시 단순 리스트 길이 기반 카운팅이 아닌 실제 I/O 결과에 기반한 상태 업데이트 적용

원문 읽기