Most PDF Extractors Use the Wrong API

മിക്ക PDF ടൂളുകളും ഉപയോഗിക്കുന്നത് തെറ്റായ ഡാറ്റാ സ്രോതസ്സാണ്.

ഡെവലപ്പർമാർ PDF എക്‌സ്‌ട്രാക്ഷനെക്കുറിച്ച് സംസാരിക്കുമ്പോൾ, അവർ സാധാരണയായി ഉദ്ദേശിക്കുന്നത് getTextContent() എന്നാണ്. ഈ മെത്തേഡ് ടെക്സ്റ്റ് ഐറ്റങ്ങളും അവയുടെ സ്ഥാനങ്ങളും നൽകുന്നു. മിക്ക ബ്രൗസർ സൈഡ് ടൂളുകളിലും ഇതാണ് ഡിഫോൾട്ട് ആയി ഉപയോഗിക്കുന്നത്.

എന്നാൽ getTextContent() എന്നത് പ്രോസസ്സ് ചെയ്ത ഒരു വ്യൂ (view) മാത്രമാണ്. യഥാർത്ഥത്തിൽ ലഭ്യമായ വിവരങ്ങളുടെ ലഘൂകരിച്ച രൂപമാണിത്.

PDF.js-ൽ മൂന്ന് തലത്തിലുള്ള ഡാറ്റാ സ്രോതസ്സുകളുണ്ട്:

getStructTree(): ഇത് ഡോക്യുമെന്റിന്റെ അർത്ഥം പറഞ്ഞുതരുന്നു. ഇതിൽ ടേബിളുകൾ, ഹെഡിംഗുകൾ, ഫോർമുലകൾ എന്നിവ അടങ്ങിയിരിക്കുന്നു. • getOperatorList(): ഡോക്യുമെന്റ് എന്താണ് വരയ്ക്കുന്നത് എന്ന് ഇത് പറഞ്ഞുതരുന്നു. ഇതിൽ ലൈനുകൾ, പാത്തുകൾ (paths), ഷേപ്പുകൾ എന്നിവ ഉൾപ്പെടുന്നു. • getTextContent(): ഡോക്യുമെന്റ് വരയ്ക്കുന്ന കാര്യങ്ങളുടെ ഒരു ഫിൽട്ടർ ചെയ്ത വ്യൂ ആണിത്.

മിക്ക ടൂളുകളും മൂന്നാമത്തെ ഓപ്ഷനാണ് ഉപയോഗിക്കുന്നത്. ലളിതമായ റിപ്പോർട്ടുകൾ പോലുള്ള 80% ഡോക്യുമെന്റുകളിലും ഇത് പ്രവർത്തിക്കും. എന്നാൽ അക്കാദമിക് പേപ്പറുകളിലും സങ്കീർണ്ണമായ പ്രസിദ്ധീകരണങ്ങളിലും ഇത് പരാജയപ്പെടുന്നു.

getTextContent() മാത്രം ഉപയോഗിക്കുന്നത് നാല് പ്രധാന പ്രശ്നങ്ങൾ ഉണ്ടാക്കുന്നു:

  • നിങ്ങൾക്ക് ടേബിൾ ഘടനകൾ നഷ്ടപ്പെടുന്നു. ടെക്സ്റ്റ് സ്ഥാനങ്ങൾ വെച്ച് സെല്ലുകൾ എവിടെയാണെന്ന് നിങ്ങൾ ഊഹിക്കേണ്ടി വരുന്നു.
  • ഗണിത സമവാക്യങ്ങൾ തെറ്റായി വരുന്നു. LaTeX സമവാക്യങ്ങൾ പലപ്പോഴും വലിയ ഒറ്റ ടെക്സ്റ്റ് ബ്ലോക്കുകളായിട്ടാണ് കാണപ്പെടുന്നത്.
  • നിങ്ങൾക്ക് കോളം ലൈനുകൾ നഷ്ടപ്പെടുന്നു. പല ലേഔട്ടുകളും കോളങ്ങളെ വേർതിരിക്കാൻ യഥാർത്ഥ ലൈനുകൾ ഉപയോഗിക്കുന്നു. ഈ ലൈനുകൾ ടെക്സ്റ്റ് കണ്ടന്റിൽ ഉണ്ടാകില്ല.
  • വായനാ ക്രമം തെറ്റായി വരുന്നു. ഒരു മനുഷ്യൻ വായിക്കുന്ന ക്രമത്തിലല്ല, മറിച്ച് വരയ്ക്കപ്പെട്ട ക്രമത്തിലാണ് ടെക്സ്റ്റ് പലപ്പോഴും കാണപ്പെടുന്നത്.

ഒരു PDF പ്രോസസ്സർ നിർമ്മിക്കാനുള്ള ശരിയായ രീതി ഒരു മൂന്ന്-തല (three-tier) സംവിധാനമാണ്:

  1. ആദ്യം getStructTree() പരിശോധിക്കുക. ഡോക്യുമെന്റിന് ഒരു ലോജിക്കൽ സ്ട്രക്ചർ ഉണ്ടെങ്കിൽ, ടേബിളുകളും ഹെഡിംഗുകളും പെട്ടെന്ന് കണ്ടെത്താൻ അത് ഉപയോഗിക്കുക.
  2. അടുത്തതായി getOperatorList() പരിശോധിക്കുക. കോളങ്ങളുടെ അതിരുകൾ കണ്ടെത്താൻ ഇതിലെ ലൈനുകളും പാത്തുകളും ഉപയോഗിക്കുക.
  3. ഒരു ബദൽ മാർഗ്ഗമായി (fallback) getTextContent() ഉപയോഗിക്കുക. ആദ്യത്തെ രണ്ട് തലങ്ങളിൽ നിന്ന് ഡാറ്റ ലഭിക്കാത്തപ്പോൾ മാത്രം ജിയോമെട്രിക് മാത്തമാറ്റിക്സ് ഉപയോഗിക്കുക.

ഈ രീതി കൂടുതൽ ജോലിഭാരം ഉണ്ടാക്കുന്നില്ല. ഒന്നാമത്തെയും രണ്ടാമത്തെയും തലങ്ങൾ വേഗത്തിലുള്ള പരിഹാരങ്ങളായി (fast exits) പ്രവർത്തിക്കുന്നു. ഡോക്യുമെന്റ് കൃത്യമായ ഘടനയുള്ളതാണെങ്കിൽ, നിങ്ങൾക്ക് കഠിനമായ കണക്കുകൂട്ടലുകൾ ഒഴിവാക്കാം. ഡോക്യുമെന്റ് ടാഗ് ചെയ്തിട്ടില്ലാത്ത സാഹചര്യത്തിൽ മാത്രം സങ്കീർണ്ണമായ ഇൻഫറൻസ് (inference) ഉപയോഗിച്ചാൽ മതിയാകും.

ഈ ആർക്കിടെക്ചർ ലളിതമായ കോർപ്പറേറ്റ് ഫയലുകളെയും സങ്കീർണ്ണമായ ശാസ്ത്രീയ പ്രബന്ധങ്ങളെയും ഒരുപോലെ കൈകാര്യം ചെയ്യുന്നു.

Source: https://dev.to/bonzai2carn/most-pdf-extractors-use-the-wrong-api-heres-what-we-built-instead-5dgh