200페이지 분량의 투자설명서(prospectus)를 PDF에서 Markdown으로 변환했는데 빈 결과가 나왔습니다. 텍스트는 눈에 보이지
요약
사용자가 PDF-to-Markdown 엔드포인트를 사용하여 금융 투자설명서를 처리하는 과정에서, 눈에 보이지 않는 OCR 텍스트 레이어 때문에 데이터가 누락되는 문제를 경험했습니다. 이 문제는 PDF의 복잡한 구조적 특성(라스터화 및 접근성 레이어) 때문이며, 해결책으로 문서 전체 평균 문자 밀도를 기반으로 하는 '두 단계 추출 로직'을 도입하여 정확도를 높였습니다.
핵심 포인트
- PDF는 단일 형식이 아닌 텍스트, 이미지, 벡터 등 복합 컨테이너임.
- 단순 변환기는 예상치 못한 PDF 구조에서 빈 결과를 반환할 위험이 있음.
- 문서 전체 평균 문자 밀도 기반의 폴백(fallback) 로직을 도입하여 정확도를 개선함.
- PDF-to-Markdown 엔드포인트에 2단계 추출 로직을 적용하여 대용량 문서 처리가 가능해짐.
한 사용자가 제가 만든 PDF-to-Markdown 엔드포인트에 실제 금융 투자설명서를 넣었더니, 하나의 제목 태그와 아무것도 받지 못했습니다. 파일 크기는 14MB였고, 페이지 수는 200페이지였습니다. Markdown 출력은 47바이트에 불과했습니다. 처음에는 데이터가 손상된 것이라고 생각했고, 그다음에는 암호화된 PDF일 거라 생각하더니, 실제로 파일을 열어봤습니다.
텍스트는 누락되지 않았습니다. 분명히 거기에 있었지만, 추출 가능한 텍스트 스트림이 없는 벡터 아웃라인 레이어로 렌더링되어 있었습니다. 이 PDF는 페이지를 라스터라이즈(rasterize)한 다음 접근성을 위해 눈에 보이지 않는 OCR 텍스트 레이어를 덧씌운 스캐너 기반 파이프라인으로 생성된 것이었습니다. 제 추출기는 아웃라인 레이어(제목, 북마크 등—그래서 제목 하나만 받은 것입니다)를 읽고, 이 눈에 보이지 않는 레이어를 문서 본문으로 간주하고 있었습니다.
해결책은 지루했지만 교훈적이었습니다. 이제 저는 두 가지 추출 과정을 실행합니다. 첫 번째는 빠른 텍스트 스트림 패스이고, 만약 그 결과 페이지당 문자 밀도가 특정 임계값(threshold) 이하로 떨어지면, 명시적으로 OCR/눈에 보이지 않는 레이어에서 데이터를 가져오는 폴백(fallback) 패스를 수행합니다. 이 임계값이 제가 계속 조정하는 부분입니다. 너무 낮으면 합법적으로 텍스트가 희박한 페이지(제목 페이지, 섹션 구분선, 이미지 위주의 슬라이드 등)에서도 느린 경로를 트리거하게 됩니다. 반대로 너무 높게 설정하면 폴백을 유도했던 바로 그 종류의 문서를 놓치게 됩니다.
제가 결정한 방식은 다음과 같습니다: 페이지별이 아닌 문서 전체에 걸친 평균(mean) 문자 수를 측정하는 것입니다. 199페이지가 밀집되어 있고 한 페이지만 빈 구분선인 투자설명서라면 폴백을 유도해서는 안 됩니다. 하지만 페이지당 평균 문자가 약 50자 미만이라면 거의 항상 이미지 기반이며, 이때 느린 경로를 사용하는 것이 가치가 있습니다.
더 깊은 교훈은 이렇습니다: "PDF"는 단일 형식이 아닙니다. 그것은 텍스트, 이미지, 벡터 아웃라인, 눈에 보이지 않는 접근성 레이어, 주석(annotations), 임베디드 파일, JavaScript, 그리고 위 모든 것들의 조합을 담을 수 있는 컨테이너입니다. 문서별 밀도 검사 없이 "PDF"를 처리한다고 주장하는 어떤 변환기든, 예상치 못한 입력 하나만 만나면 자신감 넘치는 빈 문자열을 반환할 위험이 있습니다.
이것은 제가 사용하는 PDF-to-Markdown 엔드포인트입니다: [https://x402.freeq.one/tools/pdf_to_markdown.html]. 이제 2단계 로직(two-pass logic)이 활성화되었으며, 200페이지 분량의 투자설명서가 약 18만 자의 깔끔한 Markdown으로 변환됩니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기