space ocr
가이드아티클요금문서
convert

스캔한 PDF를 엑셀로 변환하기

스캔한 PDF를 엑셀로 변환하는 방법. 각 페이지 이미지를 구조화된 필드로 읽어들이고, 원본과 대조해 검수한 뒤, 엑셀이 깔끔하게 여는 UTF-8 BOM CSV로 내보냅니다.

7 분 분량· 2026-06-25

스캔한 PDF는 파일 안에 스프레드시트가 숨어 있는 게 아닙니다. 그건 문서를 찍은 사진입니다. 각 페이지는 행과 열, 합계가 담긴 이미지라서 사람 눈에는 표처럼 보이지만 컴퓨터에는 그냥 픽셀 덩어리일 뿐이죠. 스캔본에 "엑셀로 내보내기" 버튼이 좀처럼 없는 이유도 이것입니다. 내보낼 셀이 없고 이미지만 있으니까요. 진짜 행을 얻으려면 페이지를 구조화된 필드로 다시 읽어들인 다음, 그 필드를 엑셀이 열 수 있는 파일로 써내야 합니다.

이 글에서 다루는 흐름이 바로 그것입니다. 문서 이미지(스캔한 페이지, 휴대폰으로 찍은 사진, 팩스로 받은 영수증)를 가져와서 값을 이름이 붙은 필드로 추출하고, 엑셀에서 바로 열리는 CSV로 내보냅니다. 바이트 순서 표시(BOM)가 붙은 UTF-8이라서 한국어, 일본어, 중국어 텍스트가 깨지지 않고 제 열에 정확히 들어갑니다. "스캔한 PDF를 엑셀로 변환"의 결과물이 바로 이 CSV입니다.

스캔본이 곧장 엑셀로 가지 못하는 이유

종이 청구서를 스캔하면 결과물은 래스터 이미지입니다. JPEG 사진과 똑같은 종류의 파일이죠. space-ocr은 이런 래스터 포맷을 바로 받습니다. JPEG, PNG, GIF, BMP, TIFF, WebP 입니다. 원본이 여러 페이지짜리 PDF라면 두 가지 길이 있습니다. PDF를 space-ocr 앱에 그대로 끌어다 놓으면 각 페이지를 알아서 이미지로 렌더링해 줍니다. 또는 REST API를 직접 호출하는 경우라면 각 페이지를 먼저 이미지(PNG 또는 TIFF)로 내보낸 뒤 전송하면 됩니다. 어느 쪽이든 OCR은 페이지 이미지를 대상으로 동작합니다.

엔진은 각 이미지를 읽어 값을 찾아내고, 모든 필드에 페이지상의 검증된 위치를 부여합니다. 페이지가 필드로 구조화되고 나면, 엑셀로 만드는 건 CSV 다운로드일 뿐입니다. 어렵고 또 제대로 해야 할 부분은 내보내기가 아니라 읽어들이는 과정입니다.

문서 이미지에서 구조화된 필드로

문서 이미지를 업로드하거나, 그냥 사진이나 PDF를 끌어다 놓기만 하면 값이 글자 더미가 아니라 이름이 붙은 필드로 나옵니다. 가장 빠른 길은 앱이 필드를 대신 제안하게 하는 것입니다. 페이지를 끌어다 놓으면 별도 설정도, 고를 템플릿도 없이 스키마를 자동으로 제안해 줍니다. 물론 내장 템플릿을 적용하거나(영수증과 명함은 원탭 프리셋이고, 청구서·발주서·납품서 등은 피커에 있습니다) 직접 필드를 정의할 수도 있습니다. 스캔본이 라벨이 붙은 열로 바뀌는 과정을 보세요:

문서 이미지를 끌어다 놓으면 값들이 이름이 붙은 필드로 안착합니다. 이게 바로 엑셀 파일에 담길 행들입니다.

반복되는 행이 있는 문서(청구서 품목 라인, 영수증 상품 목록)라면, 자식 열을 가진 array 필드를 선언하세요. 페이지의 각 줄이 저마다 하나의 행이 되는데, 스프레드시트에서 합계를 내야 할 때 바로 이게 필요한 형태입니다. 이런 반복 행을 특별히 다루고 있다면, 필드 스펙의 세부 사항은 청구서에서 품목 라인 추출하기 글을 참고하세요.

POST /ocr/fields → 요청 본문
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "image": "https://example.com/scanned-page-01.png",
  "imageType": "url",
  "fields": [
    { "name": "vendor", "type": "string" },
    { "name": "invoice_date", "type": "string" },
    { "name": "total", "type": "string" },
    {
      "name": "line_items", "type": "array",
      "children": [
        { "name": "description", "type": "string" },
        { "name": "unit_price", "type": "string" },
        { "name": "qty", "type": "string" }
      ]
    }
  ]
}
✓ Verified

값은 있는 그대로 돌아옵니다. 인쇄된 7,8557,855 그대로 유지됩니다. 쉼표, 소수점, 전각 문자가 페이지에 적힌 모습 그대로 보존되므로 합계가 맞아떨어집니다. 앱에서 보이는 통화 기호는 UI 장식일 뿐 값의 일부가 아닙니다. 숫자 정규화는 필드 설명에서 명시적으로 요청했을 때만 적용됩니다.

검수한 다음 엑셀로 내보내기

엑셀로 가져오기 전에 읽어들인 결과를 점검하세요. 값에 마우스를 올리면 원본 이미지에서 해당 영역이 강조되므로, 스캔본 전체를 다시 훑을 필요 없이 눈이 바로 그 지점으로 향합니다. match_ratio1.0 이면 모든 문자가 페이지에서 발견됐다는 뜻이고, 0.85 아래라면 한 번 더 확인해 볼 가치가 있습니다.

필드에 마우스를 올려 원본 스캔본과 대조해 확인하세요. 잘못 읽힌 값을 스프레드시트에 닿기 전에 잡아냅니다.

엑셀에서 열리는 CSV로 내보내기

필드가 제대로 보이면 시트를 내보냅니다. 열 이름이 담긴 헤더 행과 함께 <sheetName>.csv 가 만들어지고, array 필드는 column.child 열로 펼쳐지며 반복되는 품목 라인은 하위 행으로 전개됩니다. 파일은 BOM이 붙은 UTF-8 인데, 더블클릭만으로 엑셀이 CJK 텍스트를 깔끔하게 여는 건 바로 이 디테일 덕분입니다. 직접 수정한 부분은 내보내기에서 원래 OCR 값을 덮어씁니다.

클릭 한 번으로 UTF-8 BOM CSV 를 내보냅니다. 더블클릭하면 엑셀이 행과 열이 정렬된 상태로 열립니다.

엑셀에서 여는 법은 간단합니다. .csv 를 더블클릭하면 됩니다. BOM 덕분에 엑셀이 자동으로 UTF-8로 읽어들이므로, 텍스트 가져오기 마법사도 글자 깨짐도 없습니다. 거기서 네이티브 워크북이 필요하면 다른 이름으로 저장 → .xlsx 하면 됩니다. 최종 목표가 엑셀이라기보다 일반 CSV 파이프라인이라면, 스캔 문서를 CSV로 변환하는 자매 가이드가 동일한 내보내기 과정을 처음부터 끝까지 다룹니다.

API로 대량 처리하기

스캔본이 한 폴더 가득이라면, 열 스키마를 가진 시트를 한 번 만들어 두고 그 시트에 페이지 이미지를 업로드하세요. 각 이미지는 그 스키마에 맞춰 읽혀 행으로 추가되고, 나중에 하나의 CSV로 내보낼 수 있습니다. 전체 요청/응답 형태는 API 문서에 있습니다.

스캔한 페이지 이미지를 시트에 업로드
1
2
3
4
5
6
curl -X POST https://api.space-ocr.com/upload \
  -H "Authorization: Bearer $SPACE_OCR_API_KEY" \
  -F "path=/Invoices 2026" \
  -F "files=@scan-page-01.png" \
  -F "files=@scan-page-02.png" \
  -F "wait=true"

스캔한 PDF를 엑셀로 변환하는 방법

  1. PDF나 페이지 이미지 추가하기
    space-ocr 앱에서는 PDF를 그냥 끌어다 놓기만 하면 됩니다. 각 페이지가 알아서 이미지로 래스터화되므로 변환할 게 없습니다. REST API를 직접 호출하는 경우라면, 엔진이 PDF 바이트가 아니라 래스터 이미지(JPEG, PNG, GIF, BMP, TIFF, WebP)를 읽으므로 각 페이지를 먼저 래스터 이미지로 내보내세요.
  2. 페이지를 필드로 읽어들이기
    값을 이름이 붙은 필드로 추출하세요. 가장 빠른 방법은 앱이 페이지에서 필드를 자동으로 제안하게 하는 것입니다. 내장 템플릿을 적용하거나 직접 필드 스펙을 정의할 수도 있습니다. 반복되는 품목 라인에는 array 필드를 선언합니다.
  3. 값 검수하기
    필드에 마우스를 올려 원본 스캔본에서 값이 읽힌 위치를 강조해 보세요. match ratio가 1.0이면 모든 문자가 위치를 찾았다는 뜻이고, 0.85 아래라면 검토하거나 수정할 가치가 있는 값임을 표시합니다.
  4. CSV 내보내기
    시트를 CSV로 내보냅니다. BOM이 붙은 UTF-8이며 array 품목 라인을 하위 행으로 펼치고, 직접 수정한 부분은 원래 OCR 값을 덮어씁니다.
  5. 엑셀에서 열기
    CSV를 더블클릭하면 엑셀이 BOM을 읽어 행과 열이 정렬되고 CJK 텍스트가 온전한 상태로 엽니다. 네이티브 워크북이 필요하면 다른 이름으로 저장 .xlsx 하세요.
스캔한 PDF를 엑셀로 어떻게 변환하나요?
PDF를 space-ocr 앱에 그대로 끌어다 놓으세요. 각 페이지가 알아서 이미지로 래스터화되고, 앱이 필드까지 대신 제안해 줄 수 있어서 손으로 변환할 게 없습니다. 값을 원본과 대조해 검수한 다음 시트를 CSV로 내보내세요. 이 CSV는 BOM이 붙은 UTF-8이라서 엑셀에서 바로 열립니다. 더블클릭하거나, 네이티브 워크북이 필요하면 다른 이름으로 저장 .xlsx 하면 됩니다. (앱 대신 REST API를 직접 호출하는 경우라면, 엔진이 래스터 이미지를 받으므로 각 페이지를 먼저 이미지로 내보내세요.)
space-ocr가 PDF 파일을 직접 읽을 수 있나요?
앱에서는 됩니다. PDF를 끌어다 놓으면 OCR 전에 각 페이지가 알아서 PNG로 렌더링되므로 손으로 페이지를 나눌 필요가 없습니다. 다만 공개 API와 OCR 엔진 자체는 래스터 이미지(JPEG, PNG, GIF, BMP, TIFF, WebP)를 받으므로, API를 직접 호출하는 경우라면 각 페이지를 먼저 이미지로 내보내세요. 어느 쪽이든 값이 필드로 추출되고 나면, 엑셀이 여는 CSV로 내보내는 건 클릭 한 번입니다.
내보낸 CSV가 한국어나 중국어 텍스트와 함께 엑셀에서 제대로 열리나요?
네. CSV 내보내기는 바이트 순서 표시(BOM)가 붙은 UTF-8로 인코딩되는데, 이게 바로 엑셀이 인코딩을 자동으로 감지하는 데 필요한 형태입니다. CJK 문자와 악센트가 붙은 문자가 더블클릭 시 텍스트 가져오기 마법사 없이도 정확한 열에 들어갑니다.
청구서 품목 라인을 별도의 행으로 만들려면 어떻게 하나요?
자식 열(예: description, unit_price, qty)을 가진 array 필드를 선언하세요. 페이지의 반복되는 각 줄이 저마다 하위 행이 되고, 내보낼 때 array가 column.child 헤더로 펼쳐져서 엑셀에서 행 합계가 정확히 맞아떨어집니다.
엑셀로 가져오기 전에 추출이 정확했는지 어떻게 확인하나요?
모든 값에는 match ratio와 페이지상의 검증된 위치가 붙어 있습니다. 필드에 마우스를 올리면 원본 스캔본에서 그 값이 읽힌 위치가 정확히 강조됩니다. match ratio가 1.0이면 모든 문자가 발견됐다는 뜻이고, 0.85 아래라면 내보내기 전에 좀 더 자세히 살펴볼 가치가 있습니다.
관련 글