पाठ की एक ही पंक्ति को PyMuPDF द्वारा दस से अधिक स्पैन में विभाजित किया गया है? यह निर्धारित करता है कि इसका विलय किया जाना चाहिए या नहीं

PyMuPDF शब्दों की एक ही पंक्ति को एक दर्जन से अधिक अवधियों में विभाजित करता है। अधिकांश समय, फ़ॉन्ट, फ़ॉन्ट आकार या शैली बदल गई है, जरूरी नहीं कि विभाजन हो। यह आलेख बताता है कि शैली परिवर्तन और अनुच्छेद सीमाओं को कैसे अलग किया जाए, और अनुवाद के दौरान एक वाक्य को काटने से बचने के लिए तर्क और स्वीकृति प्रपत्र को मर्ज करने के उदाहरण दिए गए हैं।

जब आप पीडीएफ टेक्स्ट निकालने के लिए PyMuPDF के extractDICT() का उपयोग करते हैं, तो आप पाएंगे कि लौटाए गए परिणाम में एक सुसंगत वाक्य सात, आठ या अधिक span में कट गया है। यह आम तौर पर पार्सिंग त्रुटि नहीं है, बल्कि पीडीएफ की अंतर्निहित संरचना का सच्चा प्रतिबिंब है: फ़ॉन्ट स्विचिंग, रंग परिवर्तन, या स्थानीय शैली समायोजन, रेंडर करते समय पाठ प्रवाह को तोड़ सकते हैं।

यदि इस "स्टाइल स्लाइसिंग" को "पैराग्राफ विभाजन" के लिए गलत समझा जाता है, तो बाद में सफाई, अनुवाद या पुनर्प्राप्ति आसानी से वाक्य विभाजन त्रुटियों का कारण बनेगी। यह आलेख बताता है कि शैली परिवर्तनों को अनुच्छेद सीमाओं से कैसे अलग किया जाए, विलय तर्क का एक संयुक्त उदाहरण दिया गया है, और एक वाक्य को काटने से बचने में आपकी सहायता के लिए एक स्वीकृति प्रपत्र प्रदान किया गया है।

पीडीएफ में पाठ की एक पंक्ति कई हिस्सों में विभाजित है। क्या इनका विलय कर देना चाहिए? एक वाक्य का निष्कर्ष

जब एक ही line में कई span होते हैं और y निर्देशांक समान होते हैं, तो यह ज्यादातर फ़ॉन्ट, फ़ॉन्ट आकार या रंग स्विचिंग होता है, जिसे सुरक्षित रूप से जोड़ा जा सकता है; अनुच्छेद सीमा block और line की संरचना पर आधारित होनी चाहिए, न कि span की संख्या पर।

आपकी स्थितिअनुशंसित प्रथाएँकारण
एक ही रेखा के भीतर एकाधिक स्पैन में समान y निर्देशांक होते हैंसुरक्षित स्प्लिसिंग स्पैन.टेक्स्टअधिकतर फ़ॉन्ट या रंग स्विचिंग
स्पैन के बीच एक स्पष्ट क्षैतिज अंतर हैबॉक्स रिक्ति की जाँच करें और यदि आवश्यक हो तो रिक्त स्थान या टैब डालेंटैब कैरेक्टर या कॉलम ब्रेक अवशेष हो सकता है, नियमों की आवश्यकता है
एक ही पंक्ति के भीतर स्पैन के y निर्देशांक में अंतर फ़ॉन्ट आकार के 10% से अधिक हैविलय के बिना मूल स्पैन संरचना को बनाए रखेंइनलाइन सूत्र या सबस्क्रिप्ट हो सकते हैं
एकल शब्द स्पैन और बॉक्स अव्यवस्थित हैंनिम्न गुणवत्ता के रूप में चिह्नित करें, मैन्युअल या OCR में कनवर्ट करेंछँटाई और समूहीकरण के लिए विश्वसनीय आधार का अभाव
ब्लॉकों में शब्दार्थ रूप से निरंतर पाठप्रासंगिक निर्णय की आवश्यकता है और स्वचालित विलय नहीं किया जाता है।यह एक पेजिंग टुकड़ा हो सकता है

पहले ब्लॉक, लाइन और स्पैन के बीच पदानुक्रमित संबंध को स्पष्ट करें

PyMuPDF की शब्दकोश संरचना

PyMuPDF का शब्दकोश आउटपुट पीडीएफ की सामग्री प्रवाह संरचना का सख्ती से पालन करता है, और बाहर से अंदर तक पदानुक्रम इस प्रकार है:

  • block: पृष्ठ पर एक स्वतंत्र टाइपसेटिंग क्षेत्र, जैसे पाठ का एक पैराग्राफ, एक तालिका सेल या एक लेजेंड।
  • line: block के अंदर पाठ की दृश्य एकल पंक्ति।
  • span: line समान फ़ॉन्ट, आकार, रंग और शैली के साथ लगातार वर्णों का एक आंतरिक अनुक्रम है।

प्रत्येक परत पर फ़ील्ड के अधिक विवरण के लिए, कृपया PyMuPDF टेक्स्टपेज आधिकारिक दस्तावेज़ देखें।

स्टाइल स्विचिंग एक नया स्पैन क्यों उत्पन्न करती है?

जब तक पाठ की एक पंक्ति के बीच में बोल्डिंग, इटैलिक, रंग परिवर्तन या फ़ॉन्ट फ़ॉलबैक है (उदाहरण के लिए, चीनी वर्ण अंग्रेजी और संख्याओं के साथ मिश्रित हैं), एक नया span उत्पन्न होगा। ये span एक ही line से संबंधित हैं और समान आधार रेखा और लंबवत स्थिति साझा करते हैं।

अनुच्छेद सीमाओं को क्या देखना है

पैराग्राफ का वास्तविक अंत line सूची के अंत और एक नए block की शुरुआत से चिह्नित होता है, span की संख्या से नहीं। दोनों को भ्रमित करने से व्यावहारिक समस्याएं पैदा हो सकती हैं: उदाहरण के लिए, "महत्वपूर्ण टिप" को गलती से दो अलग-अलग वाक्यों के रूप में पहचाना जाता है, जिससे अनुवाद स्मृति पूर्ण शब्द से मेल खाने में असमर्थ हो जाती है।

संश्लेषण उदाहरण: सही आउटपुट और किनारे के मामले

सही आउटपुट

समस्या को स्पष्ट करने के लिए, हम एक सिंथेटिक परिदृश्य का निर्माण करते हैं। मान लीजिए कि इनपुट पीडीएफ में पाठ की एक पंक्ति है: "कृपया ध्यान दें: सिस्टम 5 मिनट में पुनरारंभ हो जाएगा।" उनमें से, "कृपया ध्यान दें:" बोल्ड फ़ॉन्ट का उपयोग करता है, "सिस्टम 5 मिनट में पुनरारंभ हो जाएगा" सॉन्ग फ़ॉन्ट पर वापस आ जाता है।

सही extractDICT() आउटपुट में एक line ऑब्जेक्ट के अंतर्गत चार span होने चाहिए। प्रत्येक span के bbox ऊर्ध्वाधर दिशा में अत्यधिक ओवरलैप होते हैं, और origin के y-निर्देशांक मूल रूप से सुसंगत होते हैं। इन चार टुकड़ों को एक साथ जोड़कर एक पूर्ण अर्थ इकाई का निर्माण किया जाता है।

निम्न गुणवत्ता वाला इनपुट

एक सामान्य त्रुटि स्थिति यह है कि स्कैन की गई पीडीएफ को OCRed नहीं किया गया है, या पीडीएफ जनरेटर प्रत्येक चीनी वर्ण को एक अलग टेक्स्ट ऑब्जेक्ट के रूप में लिखता है। इस मामले में extractDICT() दर्जनों एकल-शब्द span लौटा सकता है, और उनके bbox के बीच छोटे अंतराल या अनियमित ओवरलैप हो सकते हैं।

इस स्थिति को केवल स्ट्रिंग संयोजन द्वारा ठीक नहीं किया जा सकता क्योंकि सॉर्टिंग और ग्रुपिंग के लिए कोई विश्वसनीय आधार नहीं है। पृष्ठ को "निम्न-गुणवत्ता संरचित डेटा" के रूप में चिह्नित करना और मर्ज करने के बजाय इसे मैन्युअल प्रूफरीडिंग या समर्पित ओसीआर प्रक्रिया में भेजना अधिक सुरक्षित है।

ज्यामितीय विशेषताओं के आधार पर स्पैन मर्ज तर्क

नमूना कोड

निम्नलिखित पायथन उदाहरण दर्शाता है कि मेमोरी में extractDICT() की आउटपुट संरचना का अनुकरण कैसे करें और एक सुरक्षित पीयर स्पैन मर्जिंग फ़ंक्शन को कार्यान्वित करें। ध्यान दें: यह उदाहरण पूरी तरह से मेमोरी से सिंथेटिक डेटा का निर्माण करता है और कोई वास्तविक पीडीएफ फाइल नहीं पढ़ता है। इसका उपयोग केवल मर्जिंग एल्गोरिदम के तर्क को सत्यापित करने के लिए किया जाता है।

वास्तविक उपयोग के लिए, कृपया पुष्टि करें कि PyMuPDF संस्करण extractDICT विधि (1.23.x और ऊपर अनुशंसित) का समर्थन करता है और इसे अपने स्वयं के लॉक निर्भरता वातावरण में चलाएं।

# 合成示例:演示同行span合并逻辑,非真实PDF解析结果
# 依赖: PyMuPDF (pymupdf) >= 1.23.0,仅用于类型参考,本例纯内存构造

def merge_spans_in_line(line_dict, y_tolerance=2.0):
    """合并同一line内y坐标相近的span,保留原始顺序"""
    if not line_dict.get("spans"):
        return ""
    spans = sorted(line_dict["spans"], key=lambda s: s["bbox"][0])  # 按x排序
    merged_text = []
    current_y = spans[0]["origin"][1]
    buffer = [spans[0]["text"]]

    for span in spans[1:]:
        y = span["origin"][1]
        if abs(y - current_y) <= y_tolerance:
            buffer.append(span["text"])
        else:
            merged_text.append("".join(buffer))
            buffer = [span["text"]]
            current_y = y
    merged_text.append("".join(buffer))
    return "\n".join(merged_text)

# 构造合成line数据,模拟四种字体混排(正常情况)
synthetic_line = {
    "spans": [
        {"text": "请注意:", "bbox": (100, 200, 160, 220), "origin": (100, 215)},
        {"text": "系统将在", "bbox": (160, 200, 220, 220), "origin": (160, 215)},
        {"text": "5", "bbox": (220, 200, 230, 220), "origin": (220, 215)},
        {"text": "分钟后重启。", "bbox": (230, 200, 310, 220), "origin": (230, 215)}
    ]
}

result = merge_spans_in_line(synthetic_line)
assert result == "请注意:系统将在5分钟后重启。", f"合并失败: {result}"

# 边界测试:y坐标差异超过容差,应视为不同行片段(即使在同一line dict中也应分隔)
bad_line = {
    "spans": [
        {"text": "上行", "bbox": (100, 200, 140, 220), "origin": (100, 215)},
        {"text": "下行", "bbox": (100, 230, 140, 250), "origin": (100, 245)}
    ]
}
bad_result = merge_spans_in_line(bad_line, y_tolerance=2.0)
# y差值30 > 2.0,应被分隔为两行
assert bad_result == "上行\n下行", f"异常行未正确分隔: {repr(bad_result)}"

उपयोग से पहले सावधानियां

  • y_tolerance के लिए 2.0 का मान केवल एक सिंथेटिक उदाहरण सेटिंग है और यह उद्योग मानक नहीं है।
  • वास्तविक परियोजनाओं में, इस मान की गणना दस्तावेज़ के औसत फ़ॉन्ट आकार के आधार पर गतिशील रूप से की जा सकती है; यदि line को सही ढंग से विभाजित किया गया है, तो आमतौर पर अतिरिक्त y-समन्वय सत्यापन की कोई आवश्यकता नहीं होती है।
  • इस आलेख में दिए गए उदाहरण केवल कोड-स्तरीय प्रदर्शनों का प्रतिनिधित्व करते हैं और सभी वास्तविक फ़ाइलों या उत्पाद प्रभावों की गारंटी का प्रतिनिधित्व नहीं करते हैं।

📊 कोर तुलना

निम्न तालिका कई प्रसंस्करण विधियों की तुलना करती है और क्या वे उपरोक्त स्वीकृति नियमों के आधार पर देखी गई स्थिति के आधार पर स्वचालित विलय के लिए उपयुक्त हैं।

स्थिति का अवलोकन कियासंसाधन विधिक्या यह स्वचालित विलय के लिए उपयुक्त है?
एक ही रेखा के भीतर स्पैन के y निर्देशांक सुसंगत हैंसुरक्षित स्प्लिसिंगहाँ
स्पैन के बीच एक स्पष्ट क्षैतिज अंतर हैरिक्ति जाँचने के बाद रिक्त स्थान या टैब डालेंसतर्क रहें और नियमों की जरूरत है
इनलाइन सूत्र, सुपरस्क्रिप्ट और सबस्क्रिप्ट y निर्देशांक में बड़े अंतर पैदा करते हैंमूल स्पैन संरचना रखेंनहीं
एकल शब्द स्पैन और बॉक्स अव्यवस्थित हैंनिम्न गुणवत्ता चिह्नित करें, मैन्युअल या OCR में कनवर्ट करेंनहीं
ब्लॉकों में शब्दार्थ रूप से निरंतर पाठसंदर्भ के आधार पर निर्णयनहीं, एनएलपी सहायता की आवश्यकता है

स्वीकृति मानदंड और मैन्युअल समीक्षा सीमाएँ

घटनाओं का निरीक्षण करेंसंभावित कारणप्रसंस्करण निर्णयस्वचालित मर्ज लागू करना है या नहीं
एक ही रेखा के भीतर एकाधिक स्पैन में समान y निर्देशांक होते हैंफ़ॉन्ट/रंग स्विचिंगसुरक्षित स्प्लिसिंग स्पैन.टेक्स्टहाँ
स्पैन (>स्पेस चौड़ाई) के बीच एक स्पष्ट क्षैतिज अंतर हैटैब वर्ण और स्तंभ अवशेषबॉक्स रिक्ति जांचें, रिक्त स्थान या टैब डालेंसतर्क रहें और नियमों की जरूरत है
एक ही पंक्ति में स्पैन y निर्देशांक में अंतर > फ़ॉन्ट आकार 10%इनलाइन सूत्र, सुपरस्क्रिप्ट और सबस्क्रिप्टविलय के बिना मूल स्पैन संरचना को बनाए रखेंनहीं
एकल शब्द स्पैन और बॉक्स अव्यवस्थित हैंस्कैन किया हुआ या क्षतिग्रस्त पीडीएफनिम्न गुणवत्ता के रूप में चिह्नित करें, मैन्युअल या OCR में कनवर्ट करेंनहीं
ब्लॉकों के बीच पाठ अर्थ संबंधी निरंतरतापृष्ठ ब्रेकक्रॉस-ब्लॉक विलय के लिए प्रासंगिक निर्णय की आवश्यकता होती हैनहीं, एनएलपी सहायता की आवश्यकता है

यह तालिका केवल कोड प्रदर्शन स्तर पर संरचनात्मक सत्यापन को कवर करती है, और अंत-से-अंत प्रभाव को भाषा मॉडल या मैन्युअल नमूने के साथ संयोजित करने की आवश्यकता होती है। ऑटो-मर्ज का उपयोग कानूनी अनुबंध, मेडिकल रिकॉर्ड आदि जैसे प्रारूप-संवेदनशील दस्तावेजों के लिए नहीं किया जाना चाहिए, जब तक कि किसी डोमेन विशेषज्ञ द्वारा सत्यापित न किया गया हो।

उपयोग करने से पहले, कृपया डिसेन्सिटाइजेशन टेस्ट पीडीएफ स्वयं तैयार करें, JSON निर्यात करने के लिए page.get_text("dict", sort=True) चलाएं, और फिर प्रत्येक आइटम की जांच करें।

दस्तावेज़ अनुवाद से पहले जाँच के लिए उपयोग किया जाता है

पहले पृष्ठ क्रम, स्रोत स्थान और पाठ अखंडता की जांच करें, और फिर अनुवाद प्रक्रिया के लिए वही असंवेदनशील नमूना सबमिट करें। अनुवाद के बाद, आपको अभी भी यह जांचना होगा कि शीर्षक, पाठ और चित्र सही ढंग से मेल खाते हैं या नहीं, न कि केवल पाठ सहज है या नहीं।

ओमनीडॉक (उत्पाद पोर्टल) एक बहु-प्रारूप दस्तावेज़ अनुवाद पोर्टल प्रदान करता है, और आधिकारिक वेबसाइट OCR, शब्दावली और द्विभाषी तुलना कार्यों का परिचय देती है। उन टीमों के लिए जो सीधे फाइलों से काम करना चाहती हैं, यह वास्तविक जीवन के नमूनों के साथ मूल्यांकन करने लायक मार्ग है। कृपया उन डिसेन्सिटाइज़्ड फ़ाइलों का उपयोग करें जिन्हें अपलोड करने की आपके पास अनुमति है, और परिणामों की समीक्षा करने के लिए इस आलेख में चेक आइटम का उपयोग करें। यहां कोई दावा नहीं है कि ओमनीडॉक इस आलेख में ओपन सोर्स लाइब्रेरीज़ या आंतरिक एल्गोरिदम का उपयोग करता है, न ही उदाहरण उत्पाद प्रदर्शन परीक्षण को प्रतिस्थापित करता है।

🎯कौन सा तरीका आपके लिए उपयुक्त है?

यदि आप टेक्स्ट को एक ही पंक्ति में व्यवस्थित करना चाहते हैं

  • line द्वारा समूहित करें, और y निर्देशांक सुसंगत होने पर span.text को सुरक्षित रूप से विभाजित करें।

यदि आपका सामना इनलाइन सूत्रों या सुपरस्क्रिप्ट से होता है

  • विलय के बिना मूल span संरचना रखें।

यदि आप बहुत सारे एकल शब्द विस्तार वाले स्कैन या पीडीएफ के साथ काम कर रहे हैं

  • पहले निम्न गुणवत्ता के रूप में चिह्नित करें, फिर मैन्युअल प्रूफरीडिंग या समर्पित ओसीआर प्रक्रिया में स्थानांतरित करें।

यदि आप क्रॉस-ब्लॉक या क्रॉस-पेज अनुवाद करना चाहते हैं

  • प्रासंगिक निर्णय के आधार पर सीधे स्वचालित रूप से विलय करना उचित नहीं है।

❓ अक्सर पूछे जाने वाले प्रश्न (एफएक्यू)

1. पाठ की एक पंक्ति कई हिस्सों में विभाजित है। क्या इसका विभाजन होना चाहिए?

ज़रूरी नहीं है, यह अधिकतर फ़ॉन्ट, फ़ॉन्ट आकार या रंग में परिवर्तन के कारण होता है। समान line के भीतर span समान आधार रेखा और ऊर्ध्वाधर स्थिति साझा करते हैं।

2. पैराग्राफ के अंत में मुझे क्या पढ़ना चाहिए?

देखें कि क्या line सूची समाप्त होती है और एक नई block शुरू होती है, span की संख्या नहीं।

3. क्या सिंगल-वर्ड स्पैन समस्या को ठीक करने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग किया जा सकता है?

सिफारिश नहीं की गई। ऐसे मामलों में छंटाई और समूहीकरण के लिए विश्वसनीय आधार का अभाव होता है, और उन्हें निम्न गुणवत्ता के रूप में चिह्नित करना और उन्हें मैन्युअल या ओसीआर प्रक्रिया में भेजना अधिक विवेकपूर्ण है।

4. विलय करते समय y_tolerance को कितना सेट किया जाना चाहिए?

उदाहरण में 2.0 केवल एक सिंथेटिक उदाहरण सेटिंग है और यह उद्योग मानक नहीं है। वास्तविक वस्तुओं की गणना औसत फ़ॉन्ट आकार के आधार पर गतिशील रूप से की जा सकती है, या सीधे line के समूह पर भरोसा किया जा सकता है।

5. क्या कानूनी अनुबंधों में स्वचालित विलय का उपयोग किया जा सकता है?

डोमेन विशेषज्ञों द्वारा सत्यापित किए जाने तक उपयुक्त नहीं है।

📝सारांश

यह निर्धारित करने की कुंजी कि क्या span का विलय किया जा सकता है, पहले line और block की संरचना को देखना है, और फिर ज्यामितीय स्थिति को देखना है। सूत्रों, स्कैन किए गए दस्तावेज़ों या क्रॉस-ब्लॉक शब्दार्थों का सामना करते समय, उन्हें जबरन एक साथ जोड़ने के बजाय उन्हें वैसे ही रखना या उन्हें मैन्युअल रूप से परिवर्तित करना बेहतर होता है।

इसे अभी आज़माएं: मूल लेआउट को बरकरार रखते हुए अनुवाद शुरू करने के लिए दस्तावेज़ अपलोड करें

अद्यतन 2026-11-15