파일 업로드
  1. base64hub
  2. 파일 도구
  3. Base64 → PDF

Base64를 PDF로

API 응답, 전자 세금계산서, 이메일 첨부 파일에서 가져온 Base64를 붙여넣으면 PDF가 이 페이지에서 다운로드 버튼과 함께 열립니다. 디코딩과 미리보기는 브라우저에서 이루어집니다.

무료 가입 없음, 제한 없음 로컬 업로드 없음 검사 버전, 페이지, 제목, 암호화 업데이트 2026. 10. 27.
입력 –출력 –크기 –

브라우저에서 처리됩니다. 이 페이지는 데이터를 어디로도 보낼 수 없습니다 – 확인 방법

Base64를 PDF로 디코딩하는 방법

  1. Base64 또는 data URI에 문자열을 붙여넣으세요. data:application/pdf;base64,… URI 전체도 되고, 줄 바꿈, 앞뒤 따옴표, URL-safe Base64(-와 _), 누락된 = 패딩도 괜찮습니다. 파일에 저장된 긴 문자열은 .txt 파일 열기를 쓰거나 파일을 입력란에 놓으세요. 4 MB가 넘으면 텍스트 영역에 표시하지 않고 디코딩합니다.
  2. 버튼 아래에 미리보기가 열립니다. 붙여넣는 즉시 디코딩이 시작되며, 직접 디코딩을 누르고 싶다면 실시간을 해제하세요.
  3. 파일 이름을 확인하세요. 처음에는 decoded이지만, data URI의 name= 파라미터나 연 텍스트 파일의 이름을 가져옵니다. invoice.pdf.b64.txt는 invoice.pdf가 됩니다.
  4. 파일 다운로드를 누르세요. 미리보기 아래의 새 탭에서 여세요 링크를 누르면 같은 PDF를 전체 크기로 볼 수 있습니다.

페이지를 열면 예시 PDF가 들어 있으므로, 직접 붙여넣기 전에 정상적인 결과가 어떻게 보이는지 확인할 수 있습니다.

Base64 PDF가 나오는 곳

JSON은 원시 바이트를 담을 방법이 없으므로, JSON API로 문서를 돌려주는 서비스는 이를 Base64 문자열로 보냅니다. 필드 이름은 흔히 content, document, file, label 같은 것입니다.

  • 라벨과 물류 API는 인쇄용 배송 라벨을 Base64 PDF로 돌려줍니다. 같은 요청이 형식 파라미터에 따라 ZPL이나 PNG를 만들기도 하므로, “PDF” 필드가 항상 PDF인 것은 아닙니다(아래 표 참고).
  • 전자 서명 서비스는 서명된 문서와, 흔히 별도의 감사 인증서를 완료 응답이나 웹훅에 Base64로 담아 돌려줍니다.
  • UBL XML 형식의 전자 세금계산서는 <cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf" filename="INV-1001.pdf"> 같은 요소 안에 사람이 읽을 수 있는 PDF 사본을 담습니다. 태그 사이의 텍스트를 복사하고, filename 속성을 보고 파일 이름에 입력할 값을 정하세요.
  • 이메일 원본 소스에서 PDF 첨부 파일은 Content-Transfer-Encoding: base64가 붙은 76자 줄들로 된 MIME 파트입니다. 인코딩된 블록만 붙여넣거나, 메시지 전체를 EML 디코더에서 열면 모든 첨부 파일이 나열됩니다. 구조는 이메일 속 Base64에서 설명합니다.
  • 데이터베이스 BLOB 열에 저장된 문서는 텍스트로 내보내는 경우가 많습니다. PostgreSQL의 encode(data, 'base64')와 MySQL, MariaDB의 TO_BASE64()는 모두 76자마다 줄 바꿈을 넣는데, 디코더는 이를 건너뜁니다.

인코딩된 필드가 여러 개 있는 JSON 응답이라면 JSON 안의 Base64 디코딩이 한 번에 모두 찾아 디코딩합니다. 반대로 PDF 파일을 문자열로 바꾸려면 PDF를 Base64로를 사용하세요.

미리보기에 표시되는 내용

필드출처
PDF 버전헤더 줄, 예: %PDF-1.7
페이지파일의 페이지 객체로 셈(아래 참고)
제목일반 텍스트로 저장된 경우 문서 정보의 제목
암호화됨파일에 암호화 사전이 있을 때 표시: 열기 비밀번호, 또는 권한 제한만
SHA-256디코딩된 바이트의 해시. 보낸 쪽의 sha256sum invoice.pdf와 비교하면 파일이 온전히 도착했음을 증명할 수 있음

미리보기 자체는 로컬 blob: URL에서 디코딩된 바이트를 보여 주는 브라우저의 PDF 뷰어입니다. Chrome, Edge, Firefox, 데스크톱 Safari는 페이지 안에 표시합니다. 브라우저가 PDF를 열지 않고 다운로드하도록 설정되어 있으면 미리보기가 비어 있습니다(Chrome: 설정, 개인정보 보호 및 보안, 사이트 설정, 추가 콘텐츠 설정, PDF 문서 / Firefox: 설정, 일반, 프로그램, Portable Document Format). 모바일 브라우저 상당수는 페이지 안에서 PDF를 아예 렌더링하지 못합니다. 그럴 때도 새 탭에서 여세요와 파일 다운로드는 작동하며, 미리보기 위의 정보 목록은 어느 경우든 채워집니다.

페이지 수를 세는 방식

도구는 페이지를 세려고 PDF를 렌더링하지 않습니다. 파일의 처음 32 MB에서 페이지 객체(/Type /Page)를 셉니다. 하나도 보이지 않으면 페이지 트리의 /Count 항목을 읽고, 그것도 숨겨져 있으면 알 수 없음을 표시합니다. 다음 두 경우에는 뷰어의 수와 달라집니다.

  • 페이지가 너무 많게 나옴. 만든 뒤에 편집, 주석, 서명을 거친 PDF는 증분 저장되는 경우가 많습니다. 바뀐 페이지가 새 객체로 덧붙고 이전 버전은 파일에 남습니다. 2페이지 중 한 페이지를 다시 쓴 테스트 파일은 3으로 셉니다.
  • 알 수 없음. PDF 1.5부터 객체를 압축된 객체 스트림에 묶을 수 있으며, 그러면 압축을 풀지 않고는 페이지 객체도 페이지 트리도 읽을 수 없습니다.

둘이 다를 때는 뷰어의 페이지 수가 맞습니다.

결과가 PDF가 아닐 때

디코딩된 바이트가 다른 것이라면 필드 위의 안내가 찾은 형식을 알려 줍니다. 예를 들어 “PDF이(가) 아니라 HTML(으)로 보입니다.“와 함께 .html(으)로 다운로드 버튼이 나옵니다. Base64의 시작 부분을 보면 무슨 일이 있었는지 알 수 있는 경우가 많습니다.

Base64 시작 부분실제 내용
JVBERi0PDF (%PDF-)
SlZCRVJpMH두 번 인코딩된 PDF: JVBERi0…의 Base64
H4sIgzip 압축 데이터
PCFET0NUWVBF, PCFkb2N0eXBl, PGh0bWwHTML 페이지, 대개 오류 페이지나 로그인 페이지
eyJJSON, 흔히 {"error":… 같은 오류 메시지
XlhB감열 프린터용 ZPL 라벨(^XA)
iVBORw0KGgoPNG 이미지

두 번 인코딩된 문자열이나 gzip 데이터라면 도구가 다시 디코딩이 있는 두 번째 안내를 보여 주며, 이를 누르면 입력이 안쪽 층으로 바뀝니다. 뒤로는 붙여넣은 원래 내용으로 돌아갑니다. 손상되었거나 인식할 수 없는 파일이라면 “PDF 형식으로 보이지 않습니다"라는 안내와 함께 감지된 형식이 표시되고, 확장자는 .pdf로 남으므로 바이트를 다운로드해 다른 리더로 시도해 볼 수 있습니다.

디코딩 전의 오류에는 각각의 원인이 있습니다.

  • 원본 JSON의 이스케이프. \/(PHP의 json_encode가 슬래시를 이렇게 씀)나 줄 사이의 리터럴 \n은 자동으로 제거됩니다. 다른 \ 이스케이프 때문에 여전히 잘못된 문자 \ 오류가 난다면 Base64 복구를 쓰거나, 먼저 JSON을 파싱하고 값을 복사하세요.
  • 잘못된 문자 % 는 문자열이 URL 인코딩되었다는 뜻입니다. +, /, =의 이스케이프(%2B, %2F, %3D)는 자동으로 고쳐지며, 그 밖의 경우에는 먼저 URL 디코더를 거치세요.
  • PDF로 감지되지만 아무것도 표시되지 않는 경우는 대개 잘린 것입니다. 헤더는 남아 있어 감지는 성공하지만, 상호 참조 표가 있는 파일 끝부분이 사라졌습니다. 다른 흔한 원인은 Base64 오류를 참고하세요.

코드에서 Base64를 PDF로 디코딩하기

Python, JSON 응답에서:

import base64, json

with open("response.json") as f:
    b64 = json.load(f)["document"]

if b64.startswith("data:"):
    b64 = b64.split(",", 1)[1]

pdf = base64.b64decode(b64)
if not pdf.startswith(b"%PDF-"):
    raise ValueError(f"not a PDF, starts with {pdf[:16]!r}")

with open("document.pdf", "wb") as f:
    f.write(pdf)

b64decode는 표준 알파벳 밖의 문자를 조용히 버리므로, -와 _가 든 URL-safe 문자열은 오류 없이 엉터리로 디코딩됩니다. 그런 문자열에는 base64.urlsafe_b64decode를 쓰세요. Node.js는 한 번의 호출로 두 알파벳을 모두 받습니다.

import { readFile, writeFile } from "node:fs/promises";

const { document } = JSON.parse(await readFile("response.json", "utf8"));
const pdf = Buffer.from(document.replace(/^data:[^,]*,/, ""), "base64");

if (pdf.toString("latin1", 0, 5) !== "%PDF-") throw new Error("not a PDF");
await writeFile("document.pdf", pdf);

셸에서는 jq -r이 중요합니다. -r이 없으면 값에 따옴표가 남아 base64 -d가 “invalid input"으로 멈춥니다.

jq -r '.document' response.json | base64 -d > document.pdf

키 document는 API가 해당 필드를 부르는 이름으로 바꾸세요. 더 많은 패턴은 Python에서 Base64, Node.js에서 Base64, Bash에서 Base64에 있습니다.

자주 묻는 질문

Base64 문자열을 PDF 파일로 바꾸려면 어떻게 하나요?

위 입력란에 문자열을 붙여넣고 미리보기를 확인한 뒤 파일 다운로드를 누르세요. JSON에서 가져온다면 따옴표 사이의 값만 복사하세요. data:application/pdf;base64, 접두사와 줄 바꿈은 그대로 둬도 됩니다.

디코딩한 PDF가 손상되었거나 빈 문서로 열리는 이유는 무엇인가요?

거의 항상 로그 한 줄 길이 제한, 데이터베이스 열, 복사 붙여넣기 제한 때문에 문자열이 잘려 파일 끝부분이 사라진 것입니다. 완전한 PDF는 %%EOF로 끝나므로, 디코딩된 크기를 보낸 쪽이 알려 준 크기와 비교하세요.

비밀번호로 보호된 PDF도 볼 수 있나요?

네. 정보 목록에 암호화됨: 예가 표시되고, Chrome과 Firefox의 내장 뷰어가 미리보기 안에서 비밀번호를 묻습니다. 다운로드한 파일은 바뀌지 않으며 같은 비밀번호로 열립니다.

도구가 Base64가 PDF가 아니라고 하는 이유는 무엇인가요?

디코딩된 바이트가 %PDF-로 시작하지 않기 때문입니다. 대개 API가 문서 대신 오류 페이지나 JSON 메시지를 보낸 경우입니다. 경고가 찾은 형식을 알려 주고, 그 확장자로 저장해 내용을 읽을 수 있게 해 줍니다.

기밀 PDF를 여기서 디코딩해도 안전한가요?

PDF는 브라우저 안에서 디코딩되고 표시되며, 페이지의 Content Security Policy가 Cloudflare 조회수 집계를 제외한 네트워크 요청을 차단합니다. 페이지를 불러온 뒤에는 오프라인 상태에서도 계속 쓸 수 있습니다.