𝗦𝘁𝗼𝗽 𝗣𝗮𝗿𝘀𝗶𝗻𝗴 𝗣𝗗𝗙𝘀 𝗮𝘁 𝗥𝗲𝗻𝗱𝗲𝗿 𝗧𝗶𝗺𝗲
చాలా మంది డెవలపర్లు PDF ఎక్స్ట్రాక్షన్ టూల్స్ను తప్పు పద్ధతిలో నిర్మిస్తారు.
వారు విజువల్ అవుట్పుట్ నుండి డాక్యుమెంట్ నిర్మాణాన్ని ఊహించడానికి ప్రయత్నిస్తారు. ఒక పేజీని కాన్వాస్కు రెండర్ చేసి, పిక్సెల్ స్థానాలను గమనిస్తారు. కాలమ్స్ లేదా టేబుల్స్ను కనుగొనడానికి కంప్యూటర్ విజన్ను ఉపయోగిస్తారు.
ఈ విధానం తప్పుదారి పడుతుంది.
ఒక PDFలో మీకు కావాల్సిన నిర్మాణం ఇప్పటికే ఆపరేటర్ స్ట్రీమ్లో (operator stream) ఉంటుంది.
ఒక టేబుల్ అనేది కేవలం పిక్సెల్ల సమూహం మాత్రమే కాదు. అది moveTo, lineTo, మరియు rectangle వంటి పాత్ ఆపరేటర్ల (path operators) సమూహం. జోన్ సరిహద్దులు (Zone boundaries) CTM స్టాక్లో ఎన్కోడ్ చేయబడి ఉంటాయి. ఇప్పటికే ఉన్న దానిని మీరు మళ్ళీ నిర్మించాల్సిన అవసరం లేదు.
విజువల్ హ్యూరిస్టిక్స్ను (visual heuristics) ఉపయోగించడం ఆపండి. సోర్స్ డేటాను ఉపయోగించండి.
నేను గతంలో బౌండింగ్ బాక్స్ల (bounding boxes) కోసం De Casteljau subdivisionను ఉపయోగించడానికి ప్రయత్నించాను. టెస్టింగ్ సమయంలో నేను దానిని తిరస్కరించాను.
De Casteljau అనేది ఒక సబ్ డివిజన్ అల్గారిథమ్. సెగ్మెంట్లు తగినంత చిన్నవిగా అయ్యే వరకు మీరు కర్వ్లను విభజిస్తారు. ఇది రెండరింగ్కు పని చేస్తుంది, కానీ బౌండింగ్ బాక్స్లకు ఇది సరిపోదు.
మీరు ఒక టాలరెన్స్ను (tolerance) ఎంచుకోవాలి. టాలరెన్స్ మరీ ఎక్కువగా ఉంటే, బాక్స్ తప్పుగా వస్తుంది. అది మరీ తక్కువగా ఉంటే, రికర్షన్ (recursion) కోసం వనరులు వృథా అవుతాయి. దీనికి ఒక మెరుగైన మార్గం ఉంది. క్వాడ్రాటిక్ ఫార్ములాను ఉపయోగించే అనలిటికల్ సొల్యూషన్ ఖచ్చితమైనది. ఇది రికర్షన్ చేయదు. ఇది సెగ్మెంట్లను కేటాయించదు.
ఇదే లాజిక్ జోన్ డిటెక్షన్ (zone detection) కు కూడా వర్తిస్తుంది.
చాలా టూల్స్ రెండు టెక్స్ట్ గ్రూపుల మధ్య మధ్య బిందువును (midpoint) కనుగొనడం ద్వారా జోన్ సరిహద్దులను లెక్కిస్తాయి. ఇది కేవలం ఒక విజువల్ ఊహ మాత్రమే. ఇది నిర్మాణాత్మకమైనది కాదు.
మీరు మిడ్పాయింట్లను ఉపయోగిస్తే, సబ్-పిక్సెల్ రౌండింగ్ (sub-pixel rounding) వల్ల రీజియన్లు తప్పు జోన్లలోకి వెళ్తాయి.
దీని పరిష్కారం సరళం. బౌండింగ్ బాక్స్ యొక్క పై అంచుని (top edge) ఉపయోగించండి. ఒక రీజియన్ ఎక్కడ ప్రారంభమవుతుందనే దాని ఆధారంగా అది ఒక జోన్కు చెందుతుంది. పై అంచు యొక్క అసలు Y-కోఆర్డినేట్ను ఉపయోగించండి.
నిజమైన PDF ఎక్స్ట్రాక్టర్ను నిర్మించడం కష్టమైన పని. మీరు వీటిని చేయాలి:
- కేవలం టెక్స్ట్ కంటెంట్కు బదులుగా ఆపరేటర్ స్ట్రీమ్ను చదవాలి.
- మ్యాట్రిక్స్ స్టేట్ను ట్రాక్ చేయడానికి CTM స్టాక్ను నిర్మించాలి.
- సబ్పాత్లను (subpaths) జ్యామితీయంగా (geometrically) వర్గీకరించాలి.
- ప్రావెనెన్స్తో (provenance) సెగ్మెంట్లను విడుదల చేయాలి.
ఇది పిక్సెల్ ఆధారిత ఊహల కంటే ఎక్కువ పనిని కోరుతుంది. కానీ ఇది డిటర్మినిస్టిక్ ఫలితాలను (deterministic results) ఇస్తుంది.
పిక్సెల్ ఆధారిత టూల్ 100% జూమ్ వద్ద ఇచ్చే ఫలితాలు, 150% జూమ్ వద్ద ఇచ్చే ఫలితాల కంటే భిన్నంగా ఉంటాయి. ఇది విజువల్ ఆర్టిఫాక్ట్లను (visual artifacts) ప్యాటర్న్-మ్యాచ్ చేయడం మాత్రమే, నిర్మాణాన్ని ఎక్స్ట్రాక్ట్ చేయడం కాదు.
మీరు ఆపరేటర్ స్ట్రీమ్ను పార్స్ చేయకపోతే, మీరు కేవలం ఒక డెమోను మాత్రమే నిర్మిస్తున్నారు. అది మీ టెస్ట్ ఫైల్స్పై పని చేయవచ్చు, కానీ నిజమైన యూజర్ అప్లోడ్లపై విఫలమవుతుంది.
ఆపరేటర్ స్ట్రీమ్ ద్వారా వెళ్లడం కష్టమైన మార్గం. మీరు ఫిల్ మరియు స్ట్రోక్ స్టేట్ మెషీన్లను (fill and stroke state machines) మరియు PDF స్పెసిఫికేషన్ను అర్థం చేసుకోవాలి. కానీ మీరు దీనిని ఒక్కసారి మాత్రమే నేర్చుకుంటే సరిపోతుంది. ఆ తర్వాత అది ప్రతి PDFకి పనిచేస్తుంది.