Mathpix API로 이미지에서 수식 추출하는 방법 및 느낀점
Mathpix API
Mathpix는 이미지나 PDF에서 수식, 텍스트, 표 등을 추출해주는 OCR API 서비스입니다.
저는 시험문제 이미지에 포함된 수식이나 테이블 형태를 LaTeX 형태로 변환할 필요가 있어 Mathpix API를 활용하게 되었습니다.
API 사용 준비
가입 및 API 키 발급
- https://mathpix.com 에 가입
- Mathpix api 요금제 정리
Mathpix는 사용 목적에 따라 두 가지 요금제를 제공합니다.
개발자처럼 소규모로 활용하려는 개인 사용자와, 대규모 처리나 기업 계약이 필요한 경우를 구분해 제공합니다.
제가 사용한 요금제는 Pay as you go 방식으로, 사용한 만큼만 요금이 부과됩니다.
가입 시 $19.99의 초기 세팅 비용이 있으며, $29의 테스트 크레딧이 함께 제공되어 어느 정도는 무료로 테스트할 수 있습니다.
기업이나 대규모 사용자를 위한 Enterprise 요금제도 있습니다.
3. 대시보드에서 app_id, app_key 확인
Mathpix API를 사용하려면 요금제 가입 후 발급받은 app_id와 app_key가 필요합니다.
이 정보는 API 인증에 사용되는 민감한 값이므로, 외부에 노출되지 않도록 환경변수(.env) 등을 통해 안전하게 관리하는 것이 중요합니다.
사용법
https://docs.mathpix.com/#introduction
Mathpix API v3 Reference
Introduction git clone git@github.com:Mathpix/api-examples.git cd api-examples/images MathpixOCR recognizes printed and handwritten STEM document content, including math, text, tables, and chemistry diagrams, from an image, stroke data, or a PDF file. The
docs.mathpix.com
Mathpix API는 다양한 입력과 출력 형식을 지원합니다.
이미지(jpg, png 등)뿐만 아니라 PDF 파일도 업로드할 수 있으며,
출력 형식도 LaTeX 수식(latex_styled), 일반 텍스트(text), 표 데이터(tsv), 전체 JSON 구조 등 필요한 형태로 선택 가능합니다.
공식 문서에서는 Shell 명령어 또는 Python 코드로 Mathpix API를 사용하는 방법을 자세히 안내하고 있습니다.
아래는 Mathpix 공식 문서에서 안내하는, 이미지 파일을 업로드하고 LaTeX 수식으로 변환된 결과를 받아오는 기본적인 예제 코드입니다.
#!/usr/bin/env python
import requests
import json
r = requests.post("https://api.mathpix.com/v3/text",
files={"file": open("cases_hw.jpg","rb")},
data={
"options_json": json.dumps({
"math_inline_delimiters": ["$", "$"],
"rm_spaces": True
})
},
headers={
"app_id": "APP_ID",
"app_key": "APP_KEY"
}
)
print(json.dumps(r.json(), indent=4, sort_keys=True))
응용 및 실사용
아래는 제가 실제로 작성한 코드로,
시험 문제 이미지 파일을 Mathpix API로 전송하고, 그 결과를 JSON 형식으로 저장하는 Python 코드입니다.
#!/usr/bin/env python
import os
from dotenv import load_dotenv
import requests
import json
load_dotenv()
r = requests.post("https://api.mathpix.com/v3/text",
files={"file": open("2025_재정학/26.png", "rb")},
data={
"options_json": json.dumps({
"math_inline_delimiters": ["$", "$"],
"rm_spaces": True,
"include_line_data": True,
"formats": ["latex_styled", "text"]
})
},
headers={
"app_id": os.getenv("MATHPIX_APP_ID"),
"app_key": os.getenv("MATHPIX_APP_KEY"),
}
)
# Mathpix 응답 JSON 저장
output_path = "result.json"
with open(output_path, "w", encoding="utf-8") as f:
json.dump(r.json(), f, ensure_ascii=False, indent=4)
print(f" Mathpix 결과 저장 완료: {output_path}")
Mathpix API에 이미지를 전송하면, 응답으로 전체 텍스트와 함께 다양한 구조의 데이터가 반환됩니다.
특히 요청 시 "include_line_data": true 옵션을 설정하면, 이미지 내 텍스트를 줄 단위로 세분화해 리턴해줍니다.
즉, 한 문단을 모두 묶은 text 필드 외에도, 다음과 같은 구조의 line_data 배열이 함께 제공됩니다:
# 결과
{
"request_id": "2025_06_19_7646f3d2709e22c0e654g",
"version": "SuperNet-102i1",
"is_printed": true,
"is_handwritten": false,
"auto_rotate_confidence": 0,
"auto_rotate_degrees": 0,
"image_height": 1077,
"image_width": 2480,
"confidence": 0.3210884256280939,
"confidence_rate": 0.984765364657287,
"text": "26. $A$ 와 $B$ 두 명으로 구성된 사회에서 개인의 효용을 각각 $U_{A}$ 와 $U_{B}$, 사회후생을 $W$ 라고 할 때, 다음 중 옳지 않은 것은?\n(1) 평등주의적 사회후생함수는 많은 효용을 가진 사람에게는 낮은 가중치를, 적은 효용 을 가진 사람에게는 높은 가중치를 준다.\n(2) 공리주의적 사회후생함수는 모든 구성원에게 동일한 가중치를 평등하게 부여한다.\n(3) 롤즈적 사회후생함수는 $W=\\min \\left\\{U_{A}, U_{B}\\right\\}$ 로 나타낼 수 있다.\n(4) 사회후생함수가 $W=U_{A}+2 U_{B}$ 일 경우, $B$ 의 효용을 $A$ 의 효용보다 2 배 더 중요시 한다.\n(5) 공리주의적 사회후생함수에 의하면 소득의 한계효용이 감소할 때 사회후생의 극대화 를 위해서는 각 개인소득의 한계효용이 서로 달라야 한다.\n\n2025년도 제62회 세무사 1차 1교시 A형 (32-8)",
"line_data": [
...
{
"type": "text",
"cnt": [
[
208,
634
],
[
208,
565
],
[
2283,
565
],
[
2283,
634
]
],
"included": true,
"conversion_output": true,
"is_printed": true,
"is_handwritten": false,
"id": "b5f5f599db1644a290870027f88988d0",
"text": "\n(4) 사회후생함수가 $W=U_{A}+2 U_{B}$ 일 경우, $B$ 의 효용을 $A$ 의 효용보다 2 배 더 중요시 한다.",
"after_hyphen": false,
"confidence": 0.99462890625,
"confidence_rate": 0.9999707310265372
},
...
}
"text": "\n(4) 사회후생함수가 $W=U_{A}+2 U_{B}$ 일 경우, $B$ 의 효용을 $A$ 의 효용보다 2 배 더 중요시 한다."
문제 이미지의 선지 4번에 포함된 수식이 Mathpix API를 통해 $W=U_{A}+2 U_{B}$ 형태의 LaTeX 문법으로 정확하게 추출된 것을 확인할 수 있습니다.
느낀점
실제로 사용해보니 수식이 포함된 이미지가 꽤 높은 정확도로 인식해주는 것을 확인할 수 있었습니다.
다만 아쉬운 점은 한글 문장 안에 수식이 섞여 있는 경우, 일부 글자가 깨지거나 줄바꿈 이후 띄어쓰기가 누락되어 문맥이 어색해지는 경우가 있었습니다. 이런 부분은 후처리 과정에서 띄어쓰기 보정이나 문장 구조 후처리 작업이 어느 정도 필요하다는 점을 감안하고 사용하는 것이 좋겠습니다.