도구 · 제작기
PDF를 JPG·PNG로
PDF를 쪽마다 JPG나 PNG 이미지로 바꾼다. 파일은 서버로 올라가지 않고 브라우저 안에서만 변환된다. 72·150·300dpi 해상도와 JPG 화질, 쪽 범위를 고르고 한 장씩 또는 ZIP으로 받는다. 암호 걸린 PDF도 비밀번호를 넣으면 열린다.
프로젝트 소개
무엇인가
PDF를 쪽마다 JPG나 PNG 이미지로 바꾸는 도구입니다. 발표 자료 한 장을 메신저로 보내거나, 스캔한 서류를 이미지로만 받는 곳에 올리거나, 논문 그림 한 쪽을 슬라이드에 붙일 때 씁니다. 가장 큰 특징은 파일이 서버로 올라가지 않는다는 점입니다. PDF를 읽고 그리는 일을 모두 이 브라우저 안에서 하므로 계약서나 신분증 사본처럼 남에게 보내기 싫은 문서도 그대로 변환할 수 있습니다.
이렇게 써보세요
- PDF를 화면에 끌어다 놓거나 상자를 눌러 고릅니다. 쪽마다 미리보기가 나타납니다.
- 형식은 JPG와 PNG 중에서 고릅니다. 사진이나 스캔본은 JPG가 훨씬 작고, 글자와 도표가 많은 문서는 PNG가 더 선명합니다.
- 해상도는 72dpi(화면용), 150dpi(기본, 메신저·문서용), 300dpi(인쇄용) 가운데 고릅니다. 고르는 즉시 1쪽 기준 픽셀 크기가 표시됩니다.
- 쪽 범위 칸에 "1-3, 5, 8-"처럼 적거나 미리보기를 눌러 쪽을 고릅니다. 한 쪽이면 이미지 한 장으로, 여러 쪽이면 ZIP 하나로 받습니다. 미리보기 아래 '저장'은 그 쪽만 바로 받습니다.
- 비밀번호가 걸린 PDF는 비밀번호를 넣으면 열립니다. 비밀번호도 브라우저 밖으로 나가지 않습니다.
자료와 방법
PDF를 그리는 데는 모질라가 만든 오픈소스 PDF 엔진 pdf.js(3.11.174)를, ZIP을 묶는 데는 JSZip(3.10.1)을 씁니다. 두 라이브러리는 공개 CDN에서 받아 오고, 한글 글꼴이 들어간 PDF를 위해 pdf.js의 문자표(CMap)도 함께 불러옵니다. 각 쪽은 고른 해상도에 맞춰 흰 바탕 캔버스에 그린 뒤 브라우저의 이미지 저장 기능으로 JPG나 PNG가 됩니다. 이미 압축된 이미지라서 ZIP은 다시 압축하지 않고 묶기만 합니다. 이 페이지에는 사이트 공통의 방문 통계와 광고 스크립트가 있지만, PDF 내용과 변환 결과는 어디에도 전송하지 않습니다.
한계와 주의
- 브라우저마다 캔버스 하나에 그릴 수 있는 크기에 한도가 있습니다(아이폰 사파리는 약 1,670만 화소). 큰 도면을 300dpi로 바꾸면 이 한도에 맞춰 해상도를 자동으로 낮추고 그 사실을 알려 드립니다.
- 수백 쪽을 고해상도로 바꾸면 휴대폰에서는 느리거나 멈출 수 있습니다. 이럴 때는 150dpi로 낮추거나 쪽 범위를 나눠 여러 번 받으세요.
- pdf.js가 지원하지 않는 특수한 글꼴이나 효과는 원본과 조금 다르게 보일 수 있습니다. 투명 배경은 흰색으로 채워집니다.
- 이미지로 바꾸면 글자를 선택하거나 검색할 수 없게 됩니다. 원본 PDF는 따로 보관하세요.
PDF를 올리면 JPG나 PNG로 바꿔 주는 기능을 만들 수 있느냐는 질문에서 시작했다. 검색하면 이런 사이트는 수십 개가 나온다. 거의 다 파일을 서버로 올려서 변환한 뒤 다시 내려 주는 방식이다. 그래서 하나만 다르게 하기로 했다. 파일이 이 컴퓨터 밖으로 나가지 않게 하는 것이다.
서버 없이 그리기
PDF를 화면에 그리는 일은 파이어폭스에 들어 있는 pdf.js가 이미 잘한다. 쪽 하나를 캔버스에 그리고, 캔버스를 이미지 파일로 저장하면 끝이다. 해상도는 PDF 단위(1인치에 72포인트)에 배율을 곱하는 것으로 정했다. 150dpi면 약 2.08배, 300dpi면 약 4.17배로 그린다. A4 한 쪽을 300dpi로 그리면 2480 × 3508 픽셀이 된다.
아이폰 사파리의 캔버스 한도
큰 도면 PDF를 300dpi로 그리면 캔버스가 수억 화소가 된다. 아이폰 사파리는 캔버스 하나가 약 1,670만 화소를 넘으면 오류도 없이 빈 그림을 내놓는다. 그래서 1,600만 화소를 넘는 쪽은 그 안에 들어오도록 배율을 줄여서 그리고, 몇 쪽이 줄었는지 결과 메시지에 적게 했다. 다 그린 캔버스는 바로 크기를 0으로 만들어 메모리를 돌려준다. 수백 쪽을 연달아 바꿀 때 이게 없으면 휴대폰 탭이 죽는다.
한글 PDF와 비밀번호
한글 글꼴을 문서에 넣지 않은 PDF는 pdf.js가 문자표(CMap)를 따로 받아야 글자가 제대로 나온다. 이 파일들은 라이브러리와 같은 CDN에서 필요할 때만 받는다. 비밀번호가 걸린 PDF는 pdf.js가 비밀번호를 물어 오면 화면 안의 입력칸으로 받는다. 틀리면 같은 칸에서 다시 묻는다.
ZIP은 압축하지 않는다
여러 쪽은 ZIP 하나로 묶는다. JPG와 PNG는 이미 압축된 형식이라 ZIP에서 한 번 더 압축해도 거의 줄지 않고 시간만 든다. 그래서 묶기만 하는 방식(STORE)을 썼다. 파일 이름은 원래 PDF 이름 뒤에 쪽 번호를 세 자리로 붙여서, 탐색기에서 이름순으로 정렬해도 순서가 맞게 했다.