PDF에서 금액을 검색하는 방법, 페이지에서의 위치

이 기사에서는 PyMuPDF를 사용하여 지정된 사각형 내에서 반복되는 양의 텍스트를 찾는 방법을 보여줍니다. 단어 옥텟의 처음 5개 필드를 분석하고 후보 수를 확인함으로써 조각 접합 시 잘못된 판단을 피할 수 있습니다. 메모리 수준의 Python 예제, 경계 처리 전략 및 수용 테이블을 제공하고 OmniDoc 문서 번역 워크플로우와 연결하기 위한 실용적인 제안을 제공합니다.

중복 금액을 찾는 방법은 무엇입니까? 한 문장 결론

레이아웃이 확정되면 먼저 알려진 영역을 제한한 다음 텍스트를 확인하고 후보 수는 호출자에게 판단을 맡기십시오. 정규식을 계속해서 쌓는 것보다 해석하기 쉽고, 소리 없는 실수를 저지를 가능성도 적습니다.

당신의 상황권장 사례이유
페이지의 여러 위치에 동일한 금액이 나타납니다.사업 분야가 위치한 직사각형 영역으로 검색 범위를 제한하여 검색하세요.전체 텍스트 검색에서는 어떤 필드가 비즈니스 필드인지 확인할 수 없습니다.
쿼리 영역에 여러 후보가 있습니다.라벨 또는 수동 명확성과 결합하여 모든 후보를 반환합니다.프로그램은 비즈니스를 위해 선택을 해서는 안 됩니다.
쿼리 영역에 적중 항목이 없습니다.이유를 표시하고 원본 페이지를 확인하세요. 제로 패딩은 없습니다.잘못된 지역, 분할 금액 또는 누락된 텍스트 레이어로 인해 조회수가 0이 될 수 있습니다.
프레임 위치가 어긋나 보이는군요회전, 자르기, 렌더링 크기 조정을 위한 명시적 변환 체인표시 좌표와 추출된 좌표를 혼합하면 편차가 발생합니다.

한 명세서에 동일한 금액이 두 개 들어있습니다.

1,200.00는 명세서에 두 번 나타납니다. 한 번은 미결제 금액 열에, 한 번은 설명 텍스트에 나타납니다. 전체 텍스트 검색은 해당 항목을 찾을 수 있지만 어느 것이 비즈니스 분야인지 결정할 수는 없습니다.

양식 레이아웃이 고정된 경우 정규식을 계속 조정하는 것보다 먼저 알려진 영역을 제한한 다음 텍스트를 검색하는 것이 일반적으로 해석하기 더 쉽습니다. 핵심은 "단지 하나의 상자만 찾는 것"이 아니라, 0개의 히트와 다중 히트를 모두 명확한 결과로 처리하고 프로그램이 승인되지 않은 선택을 하지 않도록 하는 것입니다.

텍스트만 남기지 말고 단어의 위치도 남겨주세요

PyMuPDF의 `page.get_text("words")`는 위치가 포함된 단어 레코드를 반환하며 공통 필드는 (x0, y0, x1, y1, text, block_no, line_no, word_no)입니다. 다음 예에서는 처음 5개 필드만 사용하며, 마지막 3개 숫자는 당분간 지역 필터링에 포함되지 않습니다.

여기서 "단어"는 추출기에 의해 제공된 단편이며, 이는 언어학적 의미에서 반드시 단어와 동일할 필요는 없으며 양이 항상 완전한 단편이 될 것이라는 보장도 없습니다. 1,200.00는 분해되거나 인접 태그가 있을 수 있습니다. 이 기사에서는 완전한 조각의 정확한 일치에 대해서만 다룹니다. 나는 기록을 합법적인 양으로 조용히 엮기보다는 검토 조건을 충족하지 않는 기록을 넘겨주는 편이 낫습니다.

동일한 양의 합성 페이지 2개로 확인

메모리에 새 PDF 페이지를 생성하고 각각 수직 좌표 120과 420 근처에 동일한 양을 배치합니다. 쿼리 영역에는 위의 금액만 포함됩니다.

텍스트 삽입 지점은 텍스트 상자의 왼쪽 위 모서리가 아닌 기준선 위치입니다. 실제 상자의 높이와 너비는 글꼴과 글꼴 크기의 영향을 받으므로 좌표를 고정된 값으로 하드 코딩할 수 없습니다.

올바른 출력은 두 가지 조건을 충족해야 합니다.

  • 쿼리 영역에는 후보가 하나만 있고, 후보 사각형이 해당 영역에 완전히 포함됩니다.
  • 쿼리 범위를 전체 페이지로 확장한 후 2개의 후보를 얻어야 모호성 분기에 진입하게 됩니다.

마지막으로 페이지에 없는 문자열에 대한 적중이 0인지 확인하세요. 이는 단순히 성공적인 조회를 보여주는 것보다 실제 인터페이스에 필요한 계약에 더 가깝습니다.

실행 가능한 코드: 호출자에게 후보 수를 전달합니다.

종속성은 pymupdf입니다. 테스트 환경에서 버전을 설치하고 잠그십시오. 다음 코드는 네트워크에 액세스하지 않고 파일을 쓰지 않으며 원본 고객 문서를 수정하지 않습니다. 데모 PDF만 구성합니다.

import pymupdf

def locate(page, target, query):
    query = pymupdf.Rect(query)
    candidates = []
    for word in page.get_text("words"):
        x0, y0, x1, y1, text = word[:5]
        box = pymupdf.Rect(x0, y0, x1, y1)
        if text == target and query.contains(box):
            candidates.append(tuple(box))
    return candidates

def decide(candidates):
    if len(candidates) == 0:
        return "missing"
    if len(candidates) > 1:
        return "ambiguous"
    return "unique"

with pymupdf.open() as doc:
    page = doc.new_page(width=595, height=842)
    page.insert_text((80, 120), "1,200.00", fontsize=11)
    page.insert_text((80, 420), "1,200.00", fontsize=11)
    query = pymupdf.Rect(72, 100, 300, 150)
    local = locate(page, "1,200.00", query)
    assert decide(local) == "unique"
    assert query.contains(pymupdf.Rect(local[0]))
    assert decide(locate(page, "1,200.00", page.rect)) == "ambiguous"
    assert decide(locate(page, "999.99", query)) == "missing"
    print("unique / ambiguous / missing cases passed")

contains는 단지 영역의 가장자리를 건드리는 것이 아니라 완전한 포함을 요구합니다. 쿼리 상자가 너무 빡빡하면 측면 금액이 0 히트로 떨어질 수 있으며 이는 자동으로 전체 페이지로 넓어져야 하는 이유가 아닙니다. 범위 조정 방법을 결정하기 전에 면적을 측정할 때 사용되는 좌표계를 확인해야 합니다.

비즈니스에서 중심점이 떨어지는 것을 허용하는 경우 추가 규칙을 작성하고 경계 중첩에 대한 추가 테스트를 수행해야 합니다. 같은 기능으로 판단의 의미를 몰래 바꾸지 마십시오.

최적화 모드가 어설션을 제거할 수 있으므로 프로덕션 로직은 예외를 가로채기 위해 assert에만 의존해서는 안 됩니다. 예제의 어설션은 회귀 검사에 사용됩니다. 실제로 작업 대기열에 액세스할 때는 명확한 조건부 분기와 비즈니스 상태를 사용해야 합니다.

세 가지 결과, 세 가지 처리 방법

쿼리 결과는 일반적으로 세 가지 범주로 나뉘며 각각 다른 처리 작업이 필요합니다.

  • 한 번만 적중: 해당 영역에 완전히 일치하는 조각이 하나만 있으며 페이지 번호, 원본 텍스트, 직사각형 및 규칙 버전이 저장됩니다.
  • 제로 히트: 영역이 잘못되었거나, 양이 분할되었거나, 텍스트 레이어가 누락되었을 수 있습니다. 원인 후보를 표시하고 원본 페이지를 확인하고 0을 추가하지 마십시오.
  • 다중 조회: 동일한 영역에 중복된 금액이 있거나 템플릿이 변경되었거나 모든 후보를 반환하거나 라벨을 결합하거나 수동으로 명확하게 합니다.

다른 두 가지 상황도 별도로 처리해야 합니다.

  • 프레임은 있지만 값이 잘못되었습니다: 텍스트 레이어 자체가 잘못되었거나, 일치하는 대상이 잘못되었을 수 있습니다. 좌표가 값을 보증하지 않도록 확인하고 방지하려면 원래 페이지로 돌아가야 합니다.
  • 프레임 보기 오프셋: 표시 좌표와 추출 좌표가 혼합될 수 있으며 회전, 자르기 및 렌더링 크기 조정의 변환 체인이 명확해야 합니다.

📊 핵심 비교

쿼리 방법판정기준주의가 필요하다
완전한 포함(예시 채택)후보 사각형이 쿼리 영역 내에 완전히 포함됩니다.쿼리 상자가 너무 빡빡하면 측면의 금액에 적중이 없을 수 있습니다.
중심점이 떨어짐(다른 규칙을 작성해야 함)후보 중심점이 지역 내에 속합니다.경계 겹침에는 별도의 테스트가 필요합니다.
전체 페이지 쿼리모든 후보자 검색결과는 대부분 모호하며 라벨링이나 수동 추가 판단이 필요합니다.

이것은 보편적인 양 추출기가 아닙니다

코드는 통화, 천 단위 구분 기호 또는 소수 규칙을 구문 분석하지 않으며 "이 기간에 지불할 금액"과 "이전 기간의 잔액"과 같은 의미를 인식하지 않습니다. 후보자가 1명이라고 해서 사업적 의미가 맞는 것은 아니다.

또한 스캔에는 먼저 사용 가능한 텍스트와 위치가 있어야 합니다. 텍스트 레이어가 있지만 내용이 잘못된 페이지는 복사가 가능하기 때문에 공개할 수 없습니다.

이 문서에서는 회전되지 않은 합성 페이지를 사용합니다. 실제 페이지를 회전할 때 쿼리박스가 디스플레이 화면에서 나오는지 아니면 추출된 좌표에서 나오는지 먼저 표시한 뒤 필요하면 변환해야 한다. 소스에 관계없이 행렬을 곱하지 마십시오.

소스 페이지를 저장할 때 검토자가 인접한 페이지를 연 후 증거가 존재하지 않는다고 잘못 생각하는 것을 방지하기 위해 0부터 시작하는 인덱스와 사람 중심의 페이지 번호도 구별해야 합니다.

🎯 어떤 방법이 당신에게 적합합니까?

고정 레이아웃 형태에서 숫자를 가져와야 하는 경우

먼저 사업 분야가 위치한 지역을 제한한 후 금액을 검색하고 페이지 번호, 사각형, 규칙 버전을 저장합니다.

여러 명의 후보자를 만난 경우

첫 번째 것을 직접 선택하지 말고 모든 후보자를 반환하고 라벨이나 수동 판단을 기반으로 비즈니스 분야를 결정하십시오.

페이지 조회수가 자주 발생하지 않는 경우

범위를 조정하거나 다른 추출 경로를 사용하기 전에 영역 좌표, 양 분할 여부, 텍스트 레이어 존재 여부를 확인하십시오.

문서 번역을 하고 싶다면

금액, 날짜, 수량 등 주요 내용을 매뉴얼 검토에 포함하고, 기술 점검과 매뉴얼 검토의 업무 분담을 명확히 합니다.

번역 후 리뷰를 위해 주요 수치를 남겨주세요

문서 번역은 문장의 원활한 여부도 중요할 뿐만 아니라 금액, 날짜, 수량 등 주요 내용을 하나씩 확인해야 합니다. OmniDoc(제품 포털)는 다양한 문서에 대한 번역 포털을 제공합니다. 공식 웹사이트에 소개된 이중 언어 비교는 리뷰 포털로 사용될 수 있습니다. 좌표 위치 지정 스크립트는 원본 텍스트 증거를 유지하고 문제 영역을 찾는 데 적합합니다.

평가를 위해 업로드 권한이 있는 둔감화된 샘플을 먼저 사용하는 것이 좋습니다. 번역이 길어지면 내용 위치가 합리적으로 바뀔 수 있습니다. "기존 좌표와 새 좌표가 완전히 동일하다"는 것은 올바른 번역을 위한 어려운 조건이라고 볼 수 없습니다.

더 중요한 점검 사항은 금액이 유지되는지, 통화가 명확한지, 해당 라벨이 여전히 동일한 비즈니스 의미를 가리키는지 여부입니다.

❓ 자주 묻는 질문(FAQ)

1. 첫타만 맞히면 어떨까요?

전체 텍스트 검색은 금액이 표시된 위치만 알 수 있기 때문에 어느 곳이 사업 분야인지 확인할 수는 없습니다. 첫 번째 히트만 수행하면 결과가 올바르게 보일 수도 있지만 소스가 잘못될 수도 있습니다.

2. 쿼리 상자가 가장자리만 터치하는 것이 아니라 완전히 포함되어야 하는 이유는 무엇입니까?

이 예에서는 불완전한 조각이 유효한 적중으로 처리되는 것을 방지하기 위해 완전한 포함 결정 방법을 사용합니다. 쿼리 상자가 너무 촘촘하여 조회수가 0인 경우 자동으로 전체 페이지로 확대되는 대신 좌표계와 범위를 먼저 확인해야 합니다.

3. 쿼리 결과가 0인 경우 어떻게 해야 하나요?

원인 후보를 표시하고 제로 패딩 없이 원본 페이지를 확인하세요. 잘못된 영역, 분할된 양 또는 누락된 텍스트 레이어로 인해 조회수가 0이 될 수 있습니다.

4. 이 코드를 실제 청구서에 바로 사용할 수 있나요?

직접 사용할 수는 없습니다. 예제에서는 통화, 천 단위 구분 기호 및 비즈니스 의미를 다루지 않으며 이 기사의 합성 예제는 실제 청구서의 정확성 테스트를 나타내지 않습니다.

📝 요약

금액을 찾을 때 먼저 면적을 제한한 다음 판단을 위해 전체 후보자 수를 호출자에게 넘겨주십시오. 0개 적중 및 다중 적중에 대한 명확한 처리 조치가 있어야 합니다. 먼저 둔감한 샘플을 사용하여 규칙을 확인한 다음 점차적으로 실제 문서에 액세스합니다.

지금 사용해 보세요: 원본 레이아웃을 유지하면서 번역을 시작하려면 문서를 업로드하세요.

업데이트: 2026-11-14