PDF форматындағы соманы, оның беттегі орнын қалай алуға болады

Бұл мақалада көрсетілген тіктөртбұрыш ішінде қайталанатын сома мәтінін табу үшін PyMuPDF пайдалану көрсетіледі. Октет сөздерінің алғашқы бес өрісін талдау және үміткерлер санын тексеру арқылы фрагменттерді біріктірудегі қате пікірлерді болдырмауға болады. Жад деңгейіндегі Python мысалдарын, шекараны өңдеу стратегияларын және қабылдау кестелерін қамтамасыз етеді және OmniDoc құжатты аудару жұмыс процесімен қосылу үшін практикалық ұсыныстар береді.

Қайталанатын сомаларды қалай табуға болады? Бір сөйлемнен қорытынды

Орналасу бекітілген кезде, алдымен белгілі аумақты шектеңіз, содан кейін мәтінді тексеріңіз және үміткерлердің санын шешім қабылдау үшін қалдырыңыз. Тұрақты сөз тіркестерін жинақтауды жалғастырудан гөрі түсіндіру оңайырақ және үнсіз қателер жасау ықтималдығы аз.

сіздің жағдайыңызҰсынылатын тәжірибелерсебебі
Бірдей сома беттің бірнеше жерінде пайда боладыІздеуді бизнес өрісі орналасқан тікбұрышты аймақпен шектеңіз, содан кейін іздеңізТолық мәтінді іздеу қай өріс бизнес өрісі екенін анықтай алмайды
Сұрау аймағында бірнеше үміткер барБарлық үміткерлерді белгілермен немесе қолмен анықтаумен біріктіріп қайтарыңызБағдарламалар бизнес үшін таңдау жасамауы керек
Сұрау аймағында хиттер жоқСебебін белгілеп, бастапқы бетті тексеріңіз, нөлдік толтыру жоқҚате аймақ, бөлінген сомалар немесе жетіспейтін мәтін қабаттары нөлдік соққыларға әкелуі мүмкін
Жақтаудың орны ығысқан болып көрінедіАйналу, кесу және масштабтауды көрсету үшін айқын түрлендіру тізбектеріДисплей координаттарын және алынған координаттарды араластыру ауытқуларды тудырады

Бір есептегі екі бірдей сома

1,200.00 мәлімдемеде екі рет көрсетіледі: бір рет төленетін сома бағанында және бір рет сипаттама мәтінінде. Толық мәтінді іздеу оларды таба алады, бірақ ол бизнес саласының қайсысы екенін сіз үшін шеше алмайды.

Пішін орналасуы бекітілген болса, әдеттегі өрнекті реттеуді жалғастырудан гөрі алдымен белгілі аумақты шектеп, содан кейін мәтінді іздеу арқылы түсіндіру оңайырақ. Ең бастысы - «тек бір қорапты табу» емес, нөлдік соққыларды да, бірнеше соққыларды да анық нәтиже ретінде қарастыру және бағдарламаға рұқсатсыз таңдау жасауға жол бермеу.

Тек мәтінді емес, сөздің орнын қалдырыңыз

PyMuPDF `page.get_text("words")` орны бар сөз жазбасын қайтарады, жалпы өріс - (x0, y0, x1, y1, text, block_no, line_no, word_no). Келесі мысал тек алғашқы бес өрісті алады және соңғы үш сан әзірше аймақтық сүзгілеуге қатыспайды.

Мұндағы «сөз» - экстрактор берген фрагмент, ол тілдік мағынада сөзге міндетті түрде тең емес, сондай-ақ сома әрқашан толық фрагмент болатынына кепілдік берілмейді. 1,200.00 бөлшектелуі немесе іргелес тегтері болуы мүмкін. Бұл мақалада тек толық фрагменттердің дәл сәйкестігі туралы айтылады: мен оларды заңды болып көрінетін сомаға үнсіз бөлгеннен гөрі, қарау шарттарына сәйкес келмейтін жазбаларды бергенді жөн көремін.

Бірдей мөлшердегі екі синтетикалық бетпен тексеріңіз

Біз жадта жаңа PDF бетін жасаймыз және бірдей соманы сәйкесінше 120 және 420 тік координаталарының жанына орналастырамыз. Сұрау аймағы тек жоғарыдағы соманы қамтиды.

Мәтінді енгізу нүктесі мәтін жолағының жоғарғы сол жақ бұрышы емес, негізгі сызықтың орны болып табылады. Нақты қораптың биіктігі мен еніне қаріп пен қаріп өлшемі әсер етеді, сондықтан координаттарды тұрақты мәнге қатаң кодтау мүмкін емес.

Дұрыс шығу екі шартқа сай болуы керек:

  • Сұрау аймағында бір ғана үміткер бар, ал үміткер тіктөртбұрышы аймаққа толығымен енгізілген.
  • Сұрау ауқымын бүкіл бетке кеңейткеннен кейін екі үміткерді алу керек, осылайша екіұштылық тармағына кіреді.

Соңында, бетте жоқ жол арқылы нөлдік соққылардың бар-жоғын тексеріңіз. Бұл сәтті іздеуді көрсетуден гөрі нақты интерфейс талап ететін келісімшартқа жақынырақ.

Орындалатын код: қоңырау шалушыға үміткерлер санын беріңіз

Тәуелділік - 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 тек аймақтың шетіне тиіп қана қоймай, толық қосуды қажет етеді. Сұрау өрісі тым тығыз болса, бүйірлік сомалар нөлге жетуі мүмкін, бұл оның толық бетке автоматты түрде кеңеюінің себебі емес. Ауқымды реттеу жолын шешпес бұрын аумақты өлшеген кезде қолданылатын координаттар жүйесін тексеру керек.

Егер бизнес орталық нүктенің түсуіне мүмкіндік берсе, қосымша ережелер жазылуы және шекараның қабаттасуына қосымша сынақтар жасалуы керек. Сол қызметте үкім мағынасын жасырын түрде өзгертпеңіз.

Өндіріс логикасы ерекше жағдайларды тоқтату үшін тек assert-ге сүйенбеуі керек, өйткені оңтайландыру режимдері бекітулерді жоюы мүмкін. Мысалдағы бекітулер регрессияны тексеру үшін пайдаланылады. Тапсырма кезегіне нақты қол жеткізу кезінде анық шартты тармақтар мен бизнес күйлерін пайдалану керек.

Үш нәтиже, үш өңдеу әдісі

Сұрау нәтижелері әдетте әрқайсысы әртүрлі өңдеу әрекеттерін қажет ететін үш санатқа бөлінеді:

  • Тек бір соққы: Аймақта тек бір толық сәйкес фрагмент бар және бет нөмірі, түпнұсқа мәтін, тіктөртбұрыш және ереже нұсқасы сақталады.
  • Нөлдік соққы: аумақ дұрыс емес, сома бөлінген немесе мәтін қабаты жоқ болуы мүмкін. Үміткердің себебін белгілеңіз, түпнұсқа бетін тексеріңіз және нөлдерді қоспаңыз.
  • Бірнеше рет соққылар: Бір аймақта қайталанатын сомалар бар немесе үлгі өзгерді, барлық үміткерлерді қайтарыңыз, белгілерді біріктіріңіз немесе қолмен ажырату.

Қалған екі жағдайды да бөлек қарастыру қажет:

  • Жақтау бар, бірақ мән дұрыс емес: Мәтін қабатының өзі қате болуы мүмкін немесе сәйкес мақсат дұрыс емес. Координаттардың мәнді растауын тексеру және болдырмау үшін бастапқы бетке оралу керек.
  • Жақтаудың ығысуы: дисплей координаттары мен алу координаталары аралас болуы мүмкін және айналдырудың, қиюдың және масштабтаудың трансформация тізбегі анық болуы керек.

📊 Негізгі салыстыру

Сұрау әдісіБағалау критерийлерікөңіл бөлу керек
Толық қосу (мысал қабылданды)Үміткер тіктөртбұрыш толығымен сұрау аймағына түседіСұрау өрісі тым тығыз болғанда, жағындағы сомада нөлдік соққы болуы мүмкін.
Орталық нүкте құлады (басқа ереже жазу керек)Үміткердің орталық нүктесі аймаққа жатадыШекараның қабаттасуы бөлек сынақты қажет етеді
Толық бет сұрауыБарлық үміткерлерді іздеңізНәтижелер негізінен анық емес және қосымша таңбалауды немесе қолмен бағалауды қажет етеді.

Бұл әмбебап сома шығарғыш емес

Код валютаны, мыңдық бөлгіштерді немесе ондық ережелерді талдамайды, сондай-ақ «осы кезеңде төленетін» және «алдыңғы кезеңдегі теңгерім» сияқты семантиканы танымайды. Бір ғана үміткердің болуы бизнес мағынасы дұрыс дегенді білдірмейді.

Сканерлеуде алдымен қол жетімді мәтін мен орын болуы керек. Мәтіндік қабаты бар, бірақ мазмұны дұрыс емес беттерді көшіруге болатындықтан шығару мүмкін емес.

Бұл мақала бұрылмаған синтетикалық беттерді пайдаланады. Нақты бет айналдырылған кезде, алдымен сұрау жолағы дисплей экранынан немесе шығарылған координаттардан келетінін көрсетуіңіз керек, содан кейін қажет болса түрлендіру керек. Қайнар көзге қарамастан матрицаға көбейтпеңіз.

Бастапқы беттерді сақтаған кезде, тексерушілер көрші беттерді ашқаннан кейін дәлелдер жоқ деп қате ойламауы үшін нөлге негізделген индекстер мен адамға бағытталған бет нөмірлерін де ажырату керек.

🎯 Сізге қай әдіс қолайлы?

Бекітілген орналасу пішінінен сандарды алу қажет болса

Алдымен бизнес өрісі орналасқан аумақты шектеңіз, содан кейін соманы іздеңіз және бет нөмірін, тіктөртбұрышты және ереже нұсқасын сақтаңыз.

Бірнеше үміткерді кездестірсеңіз

Біріншісін тікелей қабылдамаңыз, барлық үміткерлерді қайтарыңыз және жапсырмалар немесе қолмен бағалау негізінде бизнес өрістерін анықтаңыз.

Егер сіздің парағыңыз жиі нөлдік хиттерге ие болса

Ауқымды реттеу немесе басқа шығару жолын пайдалану туралы шешім қабылдамас бұрын аумақ координаттарын, сома бөлінгенін және мәтін қабатының бар-жоғын тексеріңіз.

Құжат аудармасын жасағыңыз келсе

Қолмен шолуға сома, күні, саны және т.б. сияқты негізгі мазмұнды енгізіңіз және техникалық тексеру мен қолмен тексеру арасында нақты еңбек бөлінісі бар.

Аудармадан кейінгі шолу үшін негізгі сандарды қалдырыңыз

Құжаттардың аудармасы сөйлемдердің біркелкі болуына ғана байланысты емес, сонымен қатар сома, күні және саны сияқты негізгі мазмұнды бір-бірден растау керек. OmniDoc (өнім порталы) әртүрлі құжаттар үшін аударма порталдарын ұсынады. Ресми веб-сайтта енгізілген екі тілді салыстыруды шолу порталы ретінде пайдалануға болады; координаттарды орналастыру сценарийі бастапқы мәтіндік дәлелдерді сақтауға және проблемалық аймақтарды табуға көмектесуге жарамды.

Алдымен бағалау үшін жүктеп салуға рұқсатыңыз бар десенсибилизацияланған үлгілерді пайдалану ұсынылады. Аударма ұзарған кезде, мазмұн орны ақылға қонымды түрде өзгеруі мүмкін. «Ескі және жаңа координаталар бірдей» дегенді дұрыс аударудың қиын шарты ретінде қарастыруға болмайды.

Неғұрлым құнды тексерулер: сома сақталды ма, валюта таза ма және сәйкес белгі әлі де бірдей іскери мағынаға нұсқайды ма.

❓ Жиі қойылатын сұрақтар (ЖҚС)

1. Неге бірінші соққыны қабылдамасқа?

Толық мәтінді іздеу сома қай жерде пайда болатынын ғана айта алатындықтан, ол қай жердің бизнес өрісі екенін анықтай алмайды. Тек бірінші соққыны алыңыз және нәтиже дұрыс көрінуі мүмкін, бірақ дереккөз қате болуы мүмкін.

2. Неліктен сұрау өрісі шетіне тиіп қана қоймай, толығымен қосылуды қажет етеді?

Мысал толық емес фрагменттерді жарамды хит ретінде қарастырмау үшін толық қосуды анықтау әдісін пайдаланады. Сұрау өрісі тым тығыз болса және нөлдік соққыларға әкелсе, автоматты түрде толық бетке кеңейтудің орнына алдымен координаталар жүйесі мен ауқымын тексеру керек.

3. Сұрау нәтижесі нөлге тең болғанда не істеу керек?

Үміткерлерді белгілеп, түпнұсқа бетті нөлдік толтырусыз тексеріңіз. Қате аумақтар, бөлінген сомалар немесе жетіспейтін мәтін қабаттары барлығы нөлдік соққыларға әкелуі мүмкін.

4. Бұл кодты нақты вексельдер үшін тікелей қолдануға бола ма?

Оны тікелей қолдануға болмайды. Мысалдар валютаға, мыңдық бөлгіштерге және іскери семантикаға қатысты емес, ал осы мақаладағы синтетикалық мысалдар нақты вексельдердің дәлдік сынағы болып табылмайды.

📝 Түйіндеме

Соманы анықтаған кезде, алдымен аумақты шектеңіз, содан кейін үміткерлердің толық санын шешім қабылдау үшін беріңіз. Нөлдік соққылар және бірнеше соққылар үшін нақты өңдеу әрекеттері болуы керек. Алдымен ережелерді тексеру үшін десенсибилизацияланған үлгілерді пайдаланыңыз, содан кейін бірте-бірте нақты құжаттарға қол жеткізіңіз.

Қазір қолданып көріңіз: түпнұсқа орналасуын сақтай отырып, аударманы бастау үшін құжатты жүктеп салыңыз

Жаңартылған 2026-11-14