← 블로그 목록
윈도우작성 · 7분 읽기

Base64 문자열을 PDF·이미지 파일로 바꾸는 법 — 윈도우에서 설치 없이 (certutil·PowerShell)

API 응답이나 메일 원문, 로그에 JVBERi0 나 iVBORw0KGgo 같은 글자로 시작하는 긴 덩어리가 있고, 필요한 건 그 안에 든 PDF 나 이미지입니다. 검색하면 대부분 '여기에 붙여 넣으세요' 식의 변환 사이트가 나옵니다. 윈도우는 기본 명령 두 개로 내 PC 안에서 할 수 있습니다. 방법과, 글자만 보고 파일 종류를 알아보는 법, 그리고 실패하는 네 가지 경우를 이 PC 에서 재현해 정리했습니다.

JSON 포매터 — API 응답에서 Base64 칸 찾기 — 실제 실행 화면
실제 실행 화면
이 글에서 소개하는 무료 도구
JSON 포매터 — API 응답에서 Base64 칸 찾기

응답을 붙여 넣으면 구조가 보여서, 파일이 든 칸만 정확히 복사할 수 있습니다. 브라우저 안에서 동작하고 아무것도 올라가지 않습니다.

  • ✓ 무료
  • ✓ 설치·회원가입 없음
  • ✓ 브라우저에서 바로 실행
  • ✓ 파일이 서버로 올라가지 않음

🔒 파일을 서버나 다른 어떤 곳으로도 보내지 않습니다 — 내 컴퓨터의 브라우저 안에서만 처리합니다.

이동할 주소 — 지금 보고 있는 이 사이트(coding-now.com) 안의 페이지입니다
🔒 https://www.coding-now.com/json-formatter

Base64 가 뭔가요, 내 글자 안에는 뭐가 들었나

Base64 는 PDF·이미지 같은 파일을 영문자·숫자·+·/·= 만으로 적는 방법입니다. 그래서 JSON 이나 메일, 웹 페이지 안에 파일을 글자로 실어 보낼 수 있습니다. 대신 3바이트를 4글자로 적으니 크기가 늘어납니다.

같은 PDF 를 파일로, Base64 한 줄로, certutil 이 쓴 모양으로 비교했습니다.

되돌리기 전에 글자만 보고도 무슨 파일인지 대개 알 수 있습니다. 파일 종류마다 맨 앞 몇 바이트가 정해져 있고, 그게 늘 같은 Base64 글자가 되기 때문입니다. 시험한 두 파일을 Base64 로 바꿔 보니 이렇게 시작했습니다.

이렇게 시작하면파일 종류이유
JVBERi0PDF모든 PDF 는 %PDF- 로 시작
iVBORw0KGgoPNGPNG 고정 표시

그러니 JVBERi0 으로 시작하면 .pdf 로, iVBORw0KGgo 로 시작하면 .png 로 저장합니다. 확장자를 무엇으로 붙이든 속 바이트는 같지만, 어떤 프로그램이 열지는 확장자가 정합니다.

방법 1 — certutil 한 줄

certutil 은 윈도우에 기본으로 들어 있는 인증서 도구인데, Base64 를 되돌리는 기능도 있습니다. 먼저 Base64 글자를 텍스트 파일로 저장합니다(메모장이면 됩니다 — 글자만, 다른 건 넣지 않고). 그리고 명령 프롬프트나 PowerShell 에서 실행합니다.

bat
certutil -decode C:\Users\you\Downloads\base64.txt C:\Users\you\Downloads\file.pdf

이 PC 에서는 '입력 길이 = 29100 출력 길이 = 21823' 과 성공 메시지가 나왔고, 만들어진 PDF 의 SHA-256 해시가 원본과 똑같았습니다. 바이트 하나 다르지 않게 돌아왔다는 뜻입니다.

⚠️

certutil 은 덮어쓰지 않습니다. 같은 명령을 다시 실행하면 '파일이 있습니다'(0x80070050)로 멈춥니다. 바꿔 쓰려면 certutil -f -decode … 처럼 -f 를 붙입니다.

방법 2 — PowerShell

PowerShell 에서도 .NET 의 Base64 변환으로 같은 일을 합니다. 두 경로만 바꿔서 붙여 넣으세요.

powershell
$in  = "C:\Users\you\Downloads\base64.txt"   # Base64 글자가 든 텍스트 파일
$out = "C:\Users\you\Downloads\file.pdf"     # 만들 파일 (전체 경로로)
[IO.File]::WriteAllBytes($out, [Convert]::FromBase64String((Get-Content $in -Raw)))

이것도 원본과 똑같은 PDF 가 나왔습니다. 줄바꿈도 괜찮습니다 — 같은 Base64 를 76글자마다 줄을 바꿔 넣어도 그대로 되돌아왔습니다. 메일 원문이나 여러 API 가 긴 Base64 를 줄 단위로 끊어 주기 때문에 중요한 점입니다.

⚠️

경로는 전체 경로로 쓰세요. PowerShell 위치를 시험 폴더로 옮긴 뒤 파일 이름만 줬더니, 파일이 다른 폴더(.NET 이 현재 폴더로 보는 곳 — cd 를 따라가지 않습니다)에 생겼습니다. 오류도 없었습니다. 전체 경로를 쓰면 찾아 헤매지 않습니다.

안 될 때 — 원인 네 가지

되돌리기가 실패하는 네 가지와, 이 PC 에서 각각 어떻게 보였는지.

1. data:…;base64, 머리말이 붙어 있다

웹 페이지나 HTML 메일에서 복사한 Base64 는 data:application/pdf;base64, 로 시작하는 경우가 많습니다. 두 도구 모두 거부합니다. PowerShell 은 '입력에 Base-64가 아닌 문자 또는 세 개 이상의 패딩 문자가 있거나 … 유효한 Base-64 문자열이 아닙니다', certutil 은 '데이터가 올바르지 않습니다 0x8007000d' 였습니다. 쉼표까지 지우면 둘 다 됩니다.

2. URL용 Base64 (- 와 _)

주소창이나 웹 토큰에 쓰는 변형 Base64 는 + 대신 -, / 대신 _ 를 씁니다. 시험한 PDF 의 Base64 에는 + 가 366개, / 가 342개 있었는데, 이걸 URL용으로 바꾸니 PowerShell 은 같은 '유효한 Base-64 문자열이 아닙니다', certutil 은 같은 0x8007000d 로 실패했습니다. 두 글자를 되돌리면 됩니다.

3. 끝의 = 가 빠졌다

Base64 는 길이를 4의 배수로 맞추려고 끝에 = 를 붙입니다. 이걸 떼어 버리는 시스템이 있습니다. 끝의 == 를 지웠더니 PowerShell 은 'Base-64 문자 배열 또는 문자열의 길이가 잘못되었습니다' 로 실패했지만, certutil 은 그대로 되돌려 올바른 파일을 만들었습니다. PowerShell 이 길이 오류를 내면 certutil 부터 써 보세요.

4. certutil -encode 로 만든 글자는 모양이 다르다

certutil -encode 로 Base64 를 만들면 맨 위에 -----BEGIN CERTIFICATE-----, 맨 아래에 -----END CERTIFICATE----- 가 붙고 64글자마다 줄이 바뀝니다(이 PDF 는 457줄). certutil -decode 는 이걸 잘 읽지만, PowerShell 은 같은 파일을 '유효한 Base-64 문자열이 아닙니다' 로 거부했습니다. 다른 도구에 넘길 때는 위아래 두 줄을 지웁니다.

앞의 세 가지는 한 덩어리로 고칩니다. 방법 2 의 마지막 줄 대신 이걸 실행하세요.

powershell
$s = (Get-Content $in -Raw).Trim()
if ($s -match '^data:[^,]*,') { $s = $s.Substring($s.IndexOf(',') + 1) }   # data:...;base64, 떼기
$s = $s.Replace('-', '+').Replace('_', '/')                                   # URL용 → 표준
while ($s.Length % 4) { $s += '=' }                                           # 빠진 = 채우기
[IO.File]::WriteAllBytes($out, [Convert]::FromBase64String($s))

머리말이 붙은 것, URL용, = 가 빠진 것 — 망가뜨린 세 가지를 모두 이걸로 되돌렸더니 세 파일 모두 원본 PDF 와 바이트까지 같았습니다.

파이썬 함정 — 오류 대신 엉터리 파일

파이썬의 base64.b64decode 는 기본값이 너그럽습니다. data: 머리말이 붙은 채로 넣었더니 오류를 내지 않고 21,842바이트를 돌려줬는데, 맨 앞이 %PDF- 가 아니라 u\xabZj 였습니다. PDF 로 저장하면 열 때가 되어서야 알게 되는 깨진 파일입니다. validate=True 를 주면 'Only base64 data is allowed' 로 멈춥니다. 이쪽이 맞습니다.

python
import base64
text = open("base64.txt").read().strip()
data = base64.b64decode(text, validate=True)   # validate=True: 이상한 글자가 있으면 멈춘다
open("file.pdf", "wb").write(data)

URL용 Base64 는 base64.urlsafe_b64decode 를 쓰면 됩니다 — 시험 파일이 올바르게 돌아왔습니다. = 가 빠진 경우는 파이썬도 'Incorrect padding' 으로 실패합니다(PowerShell 과 같음). Python 3.11.9 에서 시험했습니다.

방법 한눈에 비교

certutilPowerShell파이썬 b64decode
설치필요 없음(기본)필요 없음(기본)파이썬
보통 Base64원본과 같은 파일원본과 같은 파일원본과 같은 파일
76글자 줄바꿈시험 안 함됨시험 안 함
data:…;base64, 머리말실패(0x8007000d)실패(오류)오류 없이 엉터리 — validate=True
URL용 - 와 _실패(0x8007000d)실패(오류)urlsafe_b64decode 사용
끝의 = 빠짐됨실패(길이 오류)실패(Incorrect padding)

온라인 변환 사이트도 동작하지만, 내용을 남의 서버에 붙여 넣어야 합니다. API 로 받은 Base64 PDF 는 영수증·계약서·신분증 사본인 경우가 많습니다. 올리고 싶지 않은 바로 그런 파일입니다. 윈도우의 두 방법은 내 PC 밖으로 나가지 않습니다.

자주 묻는 질문

Q. Base64 가 PDF 인지 이미지인지 어떻게 알아요?

앞 글자를 보세요. JVBERi0 은 되돌리면 %PDF- 라 PDF, iVBORw0KGgo 는 PNG 고정 표시입니다. 맞는 확장자로 저장합니다.

Q. certutil 이 '데이터가 올바르지 않습니다(0x8007000d)' 라고 해요.

대개 data:…;base64, 머리말이나 URL용 글자(- 와 _) 때문입니다. 쉼표까지 지우고, - 는 + 로 _ 는 / 로 바꿔서 다시 실행하세요.

Q. PowerShell 이 '길이가 잘못되었습니다' 라고 해요.

끝의 = 가 빠진 경우입니다. 길이가 4의 배수가 될 때까지 = 를 붙이거나, = 없이도 되돌린 certutil 을 쓰세요.

Q. PowerShell 은 성공했는데 파일이 안 보여요.

출력 경로를 파일 이름만 주면 .NET 의 현재 폴더(cd 를 따라가지 않음)에 생깁니다. C:\Users\you\Downloads\file.pdf 처럼 전체 경로로 쓰세요.

Q. 파일이 어디로 올라가나요?

아니요. certutil 과 PowerShell 모두 설치 없이 내 PC 안에서 동작합니다.

이 글에서 소개하는 무료 도구
JSON 포매터 — API 응답에서 Base64 칸 찾기

응답을 붙여 넣으면 구조가 보여서, 파일이 든 칸만 정확히 복사할 수 있습니다. 브라우저 안에서 동작하고 아무것도 올라가지 않습니다.

  • ✓ 무료
  • ✓ 설치·회원가입 없음
  • ✓ 브라우저에서 바로 실행
  • ✓ 파일이 서버로 올라가지 않음

🔒 파일을 서버나 다른 어떤 곳으로도 보내지 않습니다 — 내 컴퓨터의 브라우저 안에서만 처리합니다.

이동할 주소 — 지금 보고 있는 이 사이트(coding-now.com) 안의 페이지입니다
🔒 https://www.coding-now.com/json-formatter

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.

댓글은 회원만 쓸 수 있습니다.

광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침

다른 글