পিডিএফ স্ক্যান করা আছে কিনা তা সনাক্ত করার কোনও সহজ উপায় আছে?


8

আমার কাছে হাজার হাজার নথি রয়েছে এবং এর কয়েকটি স্ক্যান করা হয়েছে। সুতরাং ডিরেক্টরিতে থাকা সমস্ত পিডিএফ ফাইল পরীক্ষা করার জন্য আমার স্ক্রিপ্ট দরকার need এটি করার কোনও সহজ উপায় আছে?

  1. বেশিরভাগ পিডিএফ রিপোর্ট হয়। এইভাবে তাদের অনেক পাঠ্য রয়েছে।
  2. এগুলি খুব আলাদা, তবে নীচে বর্ণিত স্ক্যানগুলি স্ক্যানের সাথে মিলিত অনিশ্চিত ওসিআর প্রক্রিয়ার কারণে কিছু পাঠ্য খুঁজে পেতে পারে।

  3. নীচের মন্তব্যে সুডোডাসের কারণে প্রস্তাবটি খুব আকর্ষণীয় বলে মনে হচ্ছে। স্ক্যান করা হয়নি এমন একটি পিডিএফ থেকে স্ক্যানের মধ্যে পার্থক্যটি দেখুন:

স্ক্যান:

grep --color -a 'Image' AR-G1002.pdf
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 340615/Name/Obj13/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40452/Name/Obj18/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41680/Name/Obj23/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 41432/Name/Obj28/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59084/Name/Obj33/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 472681/Name/Obj38/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 469340/Name/Obj43/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 371863/Name/Obj48/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 344092/Name/Obj53/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 59416/Name/Obj58/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 48308/Name/Obj63/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 51564/Name/Obj68/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 63184/Name/Obj73/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 40824/Name/Obj78/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 23320/Name/Obj83/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 31504/Name/Obj93/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 18996/Name/Obj98/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 8/ColorSpace/DeviceRGB/Filter[/DCTDecode]/Height 2197/Length 292932/Name/Obj103/Subtype/Image/Type/XObject/Width 1698>>stream
<</BitsPerComponent 1/ColorSpace/DeviceGray/DecodeParms<</Columns 1698/K -1>>/Filter/CCITTFaxDecode/Height 2197/Length 27720/Name/Obj108/Subtype/Image/Type/XObject/Width 1698>>stream
               <rdf:li xml:lang="x-default">Image</rdf:li>
               <rdf:li xml:lang="x-default">Image</rdf:li>

স্ক্যান করা হয়নি:

grep --color -a 'Image' AR-G1003.pdf
<</Lang(en-US)/MarkInfo<</Marked true>>/Metadata 167 0 R/Pages 2 0 R/StructTreeR<</Contents 4 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F4 11 0 R/F5 13 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/StructParents 0/Tabs/S/Type/<</Filter/FlateDecode/Length 5463>>stream
<</BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontD<</Ascent 891/AvgWidth 427/CapHeight 677/Descent -216/Flags 32/FontBBox[-558 -216 2000 677]/FontName/Times#20New#20Roman,Bold/FontWeight 700/ItalicAngle 0/Leadi<</BaseFont/Times#20New#20Roman/Encoding/WinAnsiEncoding/FirstChar 32/FontDescri<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontName/Times#20New#20Roman/FontWeight 400/ItalicAngle 0/Leading 42<</BaseFont/Arial,Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 10 0<</Ascent 905/AvgWidth 479/CapHeight 728/Descent -210/Flags 32/FontBBox[-628 -210 2000 728]/FontName/Arial,Bold/FontWeight 700/ItalicAngle 0/Leading 33/MaxWidth<</BaseFont/Times#20New#20Roman,Italic/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 12 0 R/LastChar 118/Name/F4/Subtype/TrueType/Type/Font/Widths 164 0 <</Ascent 891/AvgWidth 402/CapHeight 694/Descent -216/Flags 32/FontBBox[-498 -216 1333 694]/FontName/Times#20New#20Roman,Italic/FontWeight 400/ItalicAngle -16.4<</BaseFont/Arial/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 14 0 R/La<</Ascent 905/AvgWidth 441/CapHeight 728/Descent -210/Flags 32/FontBBox[-665 -210 2000 728]/FontName/Arial/FontWeight 400/ItalicAngle 0/Leading 33/MaxWidth 2665<</Contents 16 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 7534>>streamarents 1/Tabs/S/Type/Page>>
<</Contents 18 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R>>/ProcSet[<</Filter/FlateDecode/Length 6137>>streamarents 2/Tabs/S/Type/Page>>
<</Contents 20 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 7 0 R/F5 13 0 R/F6 21 0 R><</Filter/FlateDecode/Length 6533>>stream>>/StructParents 3/Tabs/S/Type/Page>>
<</BaseFont/Times#20New#20Roman/DescendantFonts 22 0 R/Encoding/Identity-H/Subty<</BaseFont/Times#20New#20Roman/CIDSystemInfo 24 0 R/CIDToGIDMap/Identity/DW 100<</Ascent 891/AvgWidth 401/CapHeight 693/Descent -216/Flags 32/FontBBox[-568 -216 2000 693]/FontFile2 160 0 R/FontName/Times#20New#20Roman/FontWeight 400/Italic<</Contents 27 0 R/Group<</CS/DeviceRGB/S/Transparency/Type/Group>>/MediaBox[0 0 612 792]/Parent 2 0 R/Resources<</ExtGState<</GS28 28 0 R/GS29 29 0 R>>/Font<</F1 5 0 R/F2 7 0 R/F3 9 0 R/F5 13 0 R/F6 21 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC<</Filter/FlateDecode/Length 5369>>streamge>>

প্রতি পৃষ্ঠার চিত্রের সংখ্যা অনেক বড় (প্রতি পৃষ্ঠায় প্রায় এক)!


7
তারা বোঝাতে চাইছেন যে তারা পাঠ্য বা চিত্র?
ডি কে বোস

8
আপনি কেন জানতে চান, যদি কোনও পিডিএফ ফাইল স্ক্যান হয় বা না? আপনি কীভাবে সেই তথ্যটি ব্যবহার করবেন?
সুডোডাস

4
@ সুডডাস একটি খুব ভাল প্রশ্ন জিজ্ঞাসা করেছেন। উদাহরণস্বরূপ, বেশিরভাগ স্ক্যান করা পিডিএফগুলিতে তাদের পাঠ্য নির্বাচনের জন্য উপলব্ধ থাকে, ওসিআর ব্যবহার করে রূপান্তরিত হয়। আপনি কি এই জাতীয় ফাইল এবং পাঠ্য ফাইলগুলির মধ্যে পার্থক্য তৈরি করেন? আপনি কি আপনার পিডিএফগুলির উত্স জানেন ?
পাইপ

1
স্ক্যান হওয়া এবং স্ক্যান করা নথিপত্রগুলির মেটাডেটাতে কি কোনও পার্থক্য রয়েছে? এটি একটি খুব পরিষ্কার এবং সহজ উপায় অফার করবে।
মিষ্টান্ন

1
যদি কোনও pdfফাইলের মধ্যে একটি চিত্র থাকে (পাঠ্যের পাশাপাশি একটি ডকুমেন্টে wholeোকানো হয় বা পুরো পৃষ্ঠাগুলি, 'স্ক্যান করা পিডিএফ'), ফাইলটিতে প্রায়শই (সম্ভবত সর্বদা) স্ট্রিং থাকে /Image/, যা কমান্ড লাইনের সাথে পাওয়া যায় grep --color -a 'Image' filename.pdf। এটি এমন ফাইলগুলিকে আলাদা করবে যা কেবলমাত্র চিত্রগুলি (সম্পূর্ণ পৃষ্ঠাগুলির পাশাপাশি ছোট লোগো এবং মাঝারি আকারের চিত্রযুক্ত চিত্রযুক্ত পাঠ্য পৃষ্ঠাগুলি) থেকে পাঠ্য ধারণ করে।
সুডোডাস

উত্তর:


4

হোস্টনেম

  • যদি কোনও pdfফাইলে কোনও চিত্র থাকে (পাঠ্যের পাশাপাশি একটি ডকুমেন্টে বা পুরো পৃষ্ঠাগুলির পাশাপাশি 'স্ক্যান করা পিডিএফ') থাকে তবে ফাইলটি প্রায়শই (সম্ভবত সর্বদা) স্ট্রিং ধারণ করে /Image/

  • একইভাবে আপনি স্ট্রিংটির জন্য অনুসন্ধান করতে পারেন /Textযে কোনও পিডিএফ ফাইলটিতে পাঠ্য রয়েছে কিনা (স্ক্যান করা হয়নি)।

আমি শেলসক্রিপ্ট তৈরি করেছি pdf-text-or-imageএবং এটি আপনার ফাইলগুলির সাথে বেশিরভাগ ক্ষেত্রে কাজ করতে পারে। হোস্টনেম টেক্সট স্ট্রিং জন্য দেখায় /Image/এবং /Textpdfফাইল।

#!/bin/bash

echo "shellscript $0"
ls --color --group-directories-first
read -p "Is it OK to use this shellscript in this directory? (y/N) " ans
if [ "$ans" != "y" ]
then
 exit
fi

mkdir -p scanned
mkdir -p text
mkdir -p "s-and-t"

for file in *.pdf
do
 grep -aq '/Image/' "$file"
 if [ $? -eq 0 ]
 then
  image=true
 else
  image=false
 fi
 grep -aq '/Text' "$file"
 if [ $? -eq 0 ]
 then
  text=true
 else
  text=false
 fi


 if $image && $text
 then
  mv "$file" "s-and-t"
 elif $image
 then
  mv "$file" "scanned"
 elif $text
 then
  mv "$file" "text"
 else
  echo "$file undecided"
 fi
done

শেলসক্রিপ্ট কার্যকর করতে সক্ষম করুন,

chmod ugo+x pdf-text-or-image

আপনার কাছে pdfফাইল রয়েছে যেখানে ডিরেক্টরিটি পরিবর্তন করুন এবং শেলসক্রিপ্টটি চালান।

চিহ্নিত ফাইলগুলি নিম্নলিখিত সাব-ডিরেক্টরিতে সরানো হয়েছে

  • scanned
  • text
  • s-and-t (উভয় [স্ক্যান?] চিত্র এবং পাঠ্য সামগ্রী সহ নথিগুলির জন্য)

অজানা ফাইল অবজেক্টস, 'ইউএফও' বর্তমান ডিরেক্টরিতে রয়ে গেছে।

পরীক্ষা

আমি আপনার ফাইল দুটো হোস্টনেম পরীক্ষা AR-G1002.pdfএবং AR-G1003.pdf, এবং কিছু নিজের pdfফাইল (যে আমি লিব্রা অফিস ইমপ্রেস ব্যবহার করে তৈরি করা হয়েছে)।

$ ./pdf-text-or-image
shellscript ./pdf-text-or-image
s-and-t                                 mkUSB-quick-start-manual-11.pdf    mkUSB-quick-start-manual-nox-11.pdf
scanned                                 mkUSB-quick-start-manual-12-0.pdf  mkUSB-quick-start-manual-nox.pdf
text                                    mkUSB-quick-start-manual-12.pdf    mkUSB-quick-start-manual.pdf
AR-G1002.pdf                            mkUSB-quick-start-manual-74.pdf    OBI-quick-start-manual.pdf
AR-G1003.pdf                            mkUSB-quick-start-manual-75.pdf    oem.pdf
DescriptionoftheOneButtonInstaller.pdf  mkUSB-quick-start-manual-8.pdf     pdf-text-or-image
GrowIt.pdf                              mkUSB-quick-start-manual-9.pdf     pdf-text-or-image0
list-files.pdf                          mkUSB-quick-start-manual-bas.pdf   README.pdf
Is it OK to use this shellscript in this directory? (y/N) y

$ ls -1 *
pdf-text-or-image
pdf-text-or-image0

s-and-t:
DescriptionoftheOneButtonInstaller.pdf
GrowIt.pdf
mkUSB-quick-start-manual-11.pdf
mkUSB-quick-start-manual-12-0.pdf
mkUSB-quick-start-manual-12.pdf
mkUSB-quick-start-manual-8.pdf
mkUSB-quick-start-manual-9.pdf
mkUSB-quick-start-manual.pdf
OBI-quick-start-manual.pdf
README.pdf

scanned:
AR-G1002.pdf

text:
AR-G1003.pdf
list-files.pdf
mkUSB-quick-start-manual-74.pdf
mkUSB-quick-start-manual-75.pdf
mkUSB-quick-start-manual-bas.pdf
mkUSB-quick-start-manual-nox-11.pdf
mkUSB-quick-start-manual-nox.pdf
oem.pdf

আসুন আমরা আশা করি

  • আপনার ফাইলগুলির সেটে কোনও ইউএফও নেই
  • বাছাই স্ক্যান / ইমেজ বনাম পাঠ্য সম্পর্কে সঠিক

/ dev / null এ পুনঃনির্দেশের পরিবর্তে আপনি কেবল ব্যবহার করতে পারেনgrep -q
ফুচলভি

1
@ ফুকলভ, টিপটির জন্য ধন্যবাদ :-) এটি কিছুটা দ্রুততর করে তোলে, বিশেষত বড় ফাইলগুলির সাথে, কারণ grep -qকোনও ম্যাচ পাওয়া গেলে তাত্ক্ষণিকভাবে শূন্যপদ থেকে বেরিয়ে আসে (পুরো ফাইলগুলি সন্ধানের পরিবর্তে)।
সুডোডাস

6
  1. সমস্ত .pdf ফাইলগুলি একটি ফোল্ডারে রাখুন।
  2. Folder ফোল্ডারে কোনও .txt ফাইল নেই।
  3. টার্মিনালের সাথে সেই ফোল্ডারে ডিরেক্টরিটি পরিবর্তন করুন cd <path to dir>
  4. স্ক্যানবিহীন ফাইলগুলির জন্য আরও একটি ডিরেক্টরি তৈরি করুন। উদাহরণ:
mkdir ./x 
for file in *.pdf; do
    if [ $(pdftotext "$file")"x" == "x" ] ; then mv "$file" ./x; fi
rm *.txt
done

সমস্ত পিডিএফ স্ক্যান করা ফাইল ফোল্ডারে থাকবে এবং অন্যান্য ফাইলগুলি অন্য ফোল্ডারে চলে যাবে।


এটা অসাধারণ. তবে, এই ফাইলটি অন্য ফোল্ডারে যায় এবং এটি স্ক্যান করা হয়: drive.google.com/open?id=12xIQdRo_cyTf27Ck6DQKvRyRvlkYEzjl কি হচ্ছে?
ড্যানিয়েল দ্য রকেটম্যান

8
স্ক্যান করা পিডিএফগুলিতে প্রায়শই ওসিআরড পাঠ্য সামগ্রী থাকে, তাই আমি অনুমান করি যে সাধারণ পরীক্ষাটি তাদের জন্য ব্যর্থ হবে। পাঠ্যের সামগ্রীতে নির্বিশেষে আরও ভাল সূচক প্রতি পৃষ্ঠায় একটি বড় চিত্র হতে পারে।
জোয়

2
একেবারে ত্রুটিযুক্ত কারণে ত্রুটিযুক্ত: ফাইলগুলি স্ক্যান করা আছে বা না হলে আপনি কীভাবে জানবেন? ওপি এটিই জিজ্ঞাসা করছে: স্ক্যান করা আছে কি না তার জন্য প্রোগ্রামিকভাবে কীভাবে পরীক্ষা করা যায়।
জামেস্কেফ

1
@ ড্যানিয়েলথরকেটম্যান পিডিএফ ফাইলটির সংস্করণ সম্ভবত আপনি যে সরঞ্জামটি পাঠ্য বাছাই করতে ব্যবহার করছেন তাতে তার প্রভাব পড়ছে। এর আউটপুট file pdf-filename.pdfএকটি সংস্করণ নম্বর উত্পাদন করবে। আমি BR-L1411-3.pdf BR-L1411-3.pdf: পিডিএফ ডকুমেন্ট, সংস্করণ 1.3 তে নির্দিষ্ট পাঠ্য অনুসন্ধান করতে অক্ষম ছিল তবে আপনি প্রদত্ত অন্যান্য ফাইলগুলির উভয়টিতেই পাঠ্য অনুসন্ধান করতে সক্ষম হয়েছিলেন, যা সংস্করণ 1.5 এবং 1.6 এবং এক বা একাধিক ম্যাচ পান। আমি এই ফাইলগুলি অনুসন্ধান করতে পিডিএফ এক্সচেঞ্জের ভিউয়ার ব্যবহার করেছি তবে প্রকাশের সাথে একই রকম ফলাফল পেয়েছি। সংস্করণ 1.3 দস্তাবেজের কোনও মিল নেই।
বয়স্ক গীক

1
@ ড্যানিয়েল দ্য রকেটম্যান যদি এমনটি হয় তবে আপনি fileআপনার প্রকল্পটি সম্পূর্ণ করতে সহায়ক আউটপুট ব্যবহার করে দস্তাবেজগুলি সংস্করণ অনুসারে বাছাই করতে পারেন । যদিও আমি মনে করি অন্যরা এখনও ঠিক কী করার জন্য আপনি চেষ্টা করছেন তা সম্পর্কে অস্পষ্ট।
বয়স্ক গীক

2

পিডিএফ ওসিআরডি হয়েছে কিনা তা সনাক্ত করতে আমি একটি স্ক্রিপ্ট তৈরি করেছি। মূল ধারণা: ওসিআরডি পিডিএফগুলিতে পাঠ্যটি অদৃশ্য।

প্রদত্ত পিডিএফ ( f1) ওসিআরডি হয়েছে কিনা তা পরীক্ষা করার জন্য অ্যালগরিদম :

  1. f1হিসাবে উল্লেখ করা একটি অনুলিপি তৈরি করুনf2
  2. সমস্ত পাঠ্য মুছে দিন f2
  3. সমস্ত (বা মাত্র কয়েকটি) পৃষ্ঠাগুলির জন্য f1এবং এর জন্য চিত্র (পিএনজি) তৈরি করুনf2
  4. f1OCRd ছিল এর সকল ছবি f1এবং f2অভিন্ন।

https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh

#!/usr/bin/env bash
set -e
set -x

################################################################################
# Check if a PDF was scanned or created digitally, works on OCRd PDFs
#
# Usage:
#   bash is_scanned_pdf.sh [-p] file
#
#   Exit 0: Yes, file is a scanned PDF
#   Exit 99: No, file was created digitally
#
# Arguments:
#   -p or --pages: pos. integer, only consider first N pages
#
# Please report issues at https://github.com/jfilter/pdf-scripts/issues
#
# GPLv3, Copyright (c) 2020 Johannes Filter
################################################################################

# parse arguments
# h/t https://stackoverflow.com/a/33826763/4028896
max_pages=-1
# skip over positional argument of the file(s), thus -gt 1
while [[ "$#" -gt 1 ]]; do
  case $1 in
  -p | --pages)
    max_pages="$2"
    shift
    ;;
  *)
    echo "Unknown parameter passed: $1"
    exit 1
    ;;
  esac
  shift
done

# increment to make it easier with page numbering
max_pages=$((max_pages++))

command_exists() {
  if ! [ -x $($(command -v $1 &>/dev/null)) ]; then
    echo $(error: $1 is not installed.) >&2
    exit 1
  fi
}

command_exists mutool && command_exists gs && command_exists compare
command_exists pdfinfo

orig=$PWD
num_pages=$(pdfinfo $1 | grep Pages | awk '{print $2}')

echo $num_pages

echo $max_pages

if ((($max_pages > 1) && ($max_pages < $num_pages))); then
  num_pages=$max_pages
fi

cd $(mktemp -d)

for ((i = 1; i <= num_pages; i++)); do
  mkdir -p output/$i && echo $i
done

# important to filter text on output of GS (tmp1), cuz GS alters input PDF...
gs -o tmp1.pdf -sDEVICE=pdfwrite -dLastPage=$num_pages $1 &>/dev/null
gs -o tmp2.pdf -sDEVICE=pdfwrite -dFILTERTEXT tmp1.pdf &>/dev/null
mutool convert -o output/%d/1.png tmp1.pdf 2>/dev/null
mutool convert -o output/%d/2.png tmp2.pdf 2>/dev/null

for ((i = 1; i <= num_pages; i++)); do
  echo $i
  # difference in pixels, if 0 there are the same pictures
  # discard diff image
  if ! compare -metric AE output/$i/1.png output/$i/2.png null: 2>&1; then
    echo " pixels difference, not a scanned PDF, mismatch on page $i"
    exit 99
  fi
done

1

শখের শখের বোকা একটি ভাল সমাধান সরবরাহ করে যদি ডকুমেন্ট সংগ্রহের স্ক্যান করা নথিগুলিতে অপটিক্যাল চরিত্র স্বীকৃতি (ওসিআর) এর সাথে পাঠ্য যোগ না করা হয়। যদি এটির সম্ভাবনা থাকে তবে আপনি এমন কিছু স্ক্রিপ্টিং করতে চাইতে pdfinfo -metaপারেন যা ফাইল তৈরির জন্য ব্যবহৃত সরঞ্জামের আউটপুট এবং চেক পরীক্ষা করতে পারে বা পাইথন রুটিন নিয়োগ করে যা পাইথন লাইব্রেরিগুলির একটি পরীক্ষা করে তাদের পরীক্ষা করে। এই জাতীয় সরঞ্জাম সহ পাঠ্য অনুসন্ধান stringsকরা অবিশ্বাস্য হবে কারণ পিডিএফ বিষয়বস্তু সংকুচিত হতে পারে। এবং পিডিএফ পৃষ্ঠাগুলি একত্রিত করা যেতে পারে, তৈরির সরঞ্জামটি পরীক্ষা করা ব্যর্থসেফ নয়; জিনিসগুলিকে একসাথে রাখতে আমি নিয়মিত স্ক্যান করা চিত্রগুলির সাথে পিডিএফ পাঠ্য নথিগুলিকে একত্রিত করি।

আমি দুঃখিত যে আমি নির্দিষ্ট পরামর্শ দিতে অক্ষম। আমি পিডিএফ অভ্যন্তরীণ কাঠামোর দিকে তাকিয়ে কিছুক্ষণ হয়েছি, তবে আপনার প্রয়োজনীয়তা কতটা কঠোর তার উপর নির্ভর করে আপনি জানতে চাইতে পারেন যে এটি এক ধরণের জটিল। শুভকামনা!


2
আমি অজগরটিও ব্যবহার করার চেষ্টা করছি, তবে পিডিএফ স্ক্যান হয়েছে কিনা তা জানা তুচ্ছ নয়। মুল বক্তব্যটি হ'ল এমন নথিও যা আপনি পাঠ্য নির্বাচন করতে পারবেন না সেগুলি কিছু পাঠ্য উপস্থাপন করে যখন এটি txt এ রূপান্তরিত হয়। উদাহরণস্বরূপ, আমি পাইথনে পিডিএফ মাইনার ব্যবহার করছি এবং আমি পিডিএফ এর জন্য রূপান্তরটিতে কিছু পাঠ্য খুঁজে পেতে পারি যা নির্বাচিত সরঞ্জামটি কাজ করে না।
ড্যানিয়েলআরকেটম্যান

1

যদি এটি আসলে সনাক্ত পিডিএফ যদি সম্পর্কে আরো স্ক্যান দ্বারা তৈরি করা হয়েছে বরং পিডিএফ টেক্সট পরিবর্তে ছবি নেই তারপর আপনি কেবলমাত্র এমন সামগ্রী এড়িয়ে না ফাইলের মেটাডাটা মধ্যে খনন করা, প্রয়োজন হতে পারে।

সাধারণভাবে, আমার কম্পিউটার এবং আপনার পরীক্ষার ফাইলগুলিতে আমি যে ফাইলগুলি খুঁজে পেতে পারি তার জন্য নিম্নলিখিতটি সত্য:

  • স্ক্যান করা ফাইলগুলিতে 1000chars / পৃষ্ঠা বনাম বনাম। স্ক্যান নন যাঁরা সবসময় 1000chars / পৃষ্ঠা বেশি থাকে
  • একাধিক স্বতন্ত্র স্ক্যান করা ফাইলগুলিতে পিডিএফ নির্মাতা হিসাবে তালিকাভুক্ত "ক্যানন" রয়েছে, সম্ভবত ক্যানন স্ক্যানার সফ্টওয়্যারটি উল্লেখ করা হয়েছে
  • "মাইক্রোসফ্ট ওয়ার্ড" সহ নির্মাতা হিসাবে পিডিএফগুলি শব্দ রফতানি হওয়ায় সম্ভবত এটি স্ক্যান করা সম্ভব নয়। কিন্তু যদি কেউ কথা স্ক্যান করতে পারে, তারপর PDF- এ এক্সপোর্ট - কিছু মানুষ আছে খুব অদ্ভুত কর্মপ্রবাহ

আমি এই মুহুর্তে উইন্ডোজ ব্যবহার করছি, তাই আমি node.jsনিম্নলিখিত উদাহরণের জন্য ব্যবহার করেছি :

const fs = require("mz/fs");
const pdf_parse = require("pdf-parse");
const path = require("path");


const SHOW_SCANNED_ONES = process.argv.indexOf("scanned") != -1;

const DEBUG = process.argv.indexOf("debug") != -1;
const STRICT = process.argv.indexOf("strict") != -1;

const debug = DEBUG ? console.error : () => { };

(async () => {
    const pdfs = (await fs.readdir(".")).filter((fname) => { return fname.endsWith(".pdf") });

    for (let i = 0, l = pdfs.length; i < l; ++i) {
        const pdffilename = pdfs[i];
        try {
            debug("\n\nFILE: ", pdffilename);
            const buffer = await fs.readFile(pdffilename);
            const data = await pdf_parse(buffer);

            if (!data.info)
                data.indo = {};
            if (!data.metadata) {
                data.metadata = {
                    _metadata: {}
                };
            }


            // PDF info
            debug(data.info);
            // PDF metadata
            debug(data.metadata);
            // text length
            const textLen = data.text ? data.text.length : 0;
            const textPerPage = textLen / (data.numpages);
            debug("Text length: ", textLen);
            debug("Chars per page: ", textLen / data.numpages);
            // PDF.js version
            // check https://mozilla.github.io/pdf.js/getting_started/
            debug(data.version);

            if (evalScanned(data, textLen, textPerPage) == SHOW_SCANNED_ONES) {
                console.log(path.resolve(".", pdffilename));
            }
        }
        catch (e) {
            if (strict && !debug) {
                console.error("Failed to evaluate " + item);
            }
            {
                debug("Failed to evaluate " + item);
                debug(e.stack);
            }
            if (strict) {
                process.exit(1);
            }
        }
    }
})();
const IS_CREATOR_CANON = /canon/i;
const IS_CREATOR_MS_WORD = /microsoft.*?word/i;
// just defined for better clarity or return values
const IS_SCANNED = true;
const IS_NOT_SCANNED = false;
function evalScanned(pdfdata, textLen, textPerPage) {
    if (textPerPage < 300 && pdfdata.numpages>1) {
        // really low number, definitelly not text pdf
        return IS_SCANNED;
    }
    // definitelly has enough text
    // might be scanned but OCRed
    // we return this if no 
    // suspition of scanning is found
    let implicitAssumption = textPerPage > 1000 ? IS_NOT_SCANNED : IS_SCANNED;
    if (IS_CREATOR_CANON.test(pdfdata.info.Creator)) {
        // this is always scanned, canon is brand name
        return IS_SCANNED;
    }
    return implicitAssumption;
}

এটি চালানোর জন্য আপনার নোড.জেএস ইনস্টল করা দরকার (একক কমান্ড হওয়া উচিত) এবং আপনারও কল করতে হবে:

npm install mz pdf-parse

ব্যবহার:

node howYouNamedIt.js [scanned] [debug] [strict]

 - scanned show PDFs thought to be scanned (otherwise shows not scanned)
 - debug shows the debug info such as metadata and error stack traces
 - strict kills the program on first error

এই উদাহরণটি সমাপ্ত সমাধান হিসাবে বিবেচিত হয় না, তবে debugপতাকাটি দিয়ে আপনি কোনও ফাইলের মেটা তথ্যের কিছুটা অন্তর্দৃষ্টি পান:

FILE:  BR-L1411-3-scanned.pdf
{ PDFFormatVersion: '1.3',
  IsAcroFormPresent: false,
  IsXFAPresent: false,
  Creator: 'Canon ',
  Producer: ' ',
  CreationDate: 'D:20131212150500-03\'00\'',
  ModDate: 'D:20140709104225-03\'00\'' }
Metadata {
  _metadata:
   { 'xmp:createdate': '2013-12-12T15:05-03:00',
     'xmp:creatortool': 'Canon',
     'xmp:modifydate': '2014-07-09T10:42:25-03:00',
     'xmp:metadatadate': '2014-07-09T10:42:25-03:00',
     'pdf:producer': '',
     'xmpmm:documentid': 'uuid:79a14710-88e2-4849-96b1-512e89ee8dab',
     'xmpmm:instanceid': 'uuid:1d2b2106-a13f-48c6-8bca-6795aa955ad1',
     'dc:format': 'application/pdf' } }
Text length:  772
Chars per page:  2
1.10.100
D:\web\so-odpovedi\pdf\BR-L1411-3-scanned.pdf

আমি যে নির্ভুল ফাংশনটি লিখেছিলাম তাতে আমার কম্পিউটারে (আপনার নমুনাগুলি সহ) যে দস্তাবেজগুলি খুঁজে পেতে পারি তার মধ্যে 100% সাফল্য রয়েছে। ফলাফলটি সঠিক কিনা তা দেখার জন্য প্রোগ্রামটি চালানোর আগে আমি তাদের স্থিতিগুলির ভিত্তিতে ফাইলগুলির নামকরণ করেছি।

D:\xxxx\pdf>node detect_scanned.js scanned
D:\xxxx\pdf\AR-G1002-scanned.pdf
D:\xxxx\pdf\AR-G1002_scanned.pdf
D:\xxxx\pdf\BR-L1411-3-scanned.pdf
D:\xxxx\pdf\WHO_TRS_696-scanned.pdf

D:\xxxx\pdf>node detect_scanned.js
D:\xxxx\pdf\AR-G1003-not-scanned.pdf
D:\xxxx\pdf\ASEE_-_thermoelectric_paper_-_final-not-scanned.pdf
D:\xxxx\pdf\MULTIMODE ABSORBER-not-scanned.pdf
D:\xxxx\pdf\ReductionofOxideMineralsbyHydrogenPlasma-not-scanned.pdf

আপনার ফলাফলগুলিকে ব্যাপকভাবে উন্নত করতে আপনি কিছুটা প্রোগ্রামিংয়ের সাথে ডিবাগ মোডও ব্যবহার করতে পারেন। আপনি প্রোগ্রামের আউটপুটটি অন্যান্য প্রোগ্রামগুলিতে পাস করতে পারেন, এতে সর্বদা লাইন প্রতি একটি সম্পূর্ণ পথ থাকবে।


"মাইক্রোসফ্ট ওয়ার্ড" স্রষ্টা হিসাবে, এটি মূল নথির উত্সের উপর নির্ভর করে। উদাহরণস্বরূপ যদি সেগুলি বৈজ্ঞানিক কাগজপত্র হয় তবে অনেকগুলি না বেশিরভাগই লেটেক্স টুলচেনের কোনও কিছু দ্বারা তৈরি করা হয়েছিল।
জামেস্কেফ

0

আমি ভাবতে পারি 2 টি উপায়:

  1. নির্বাচিত পাঠ্য সরঞ্জামটি ব্যবহার করুন: আপনি যদি স্ক্যান করা পিডিএফ ব্যবহার করেন তবে পাঠ্যগুলি নির্বাচন করা যাবে না, বরং একটি বাক্স উপস্থিত হবে। আপনি এই সত্যটি স্ক্রিপ্ট তৈরি করতে ব্যবহার করতে পারেন। আমি জানি সি ++ কিউটিতে একটি উপায় আছে, যদিও লিনাক্সে নিশ্চিত নয়।

  2. ফাইলে শব্দের জন্য অনুসন্ধান করুন: একটি স্ক্যানবিহীন পিডিএফ এ আপনার অনুসন্ধান কাজ করবে, তবে স্ক্যান করা ফাইলটিতে নয়। আপনাকে কেবল সমস্ত পিডিএফ-তে সাধারণ কিছু শব্দ খুঁজে বের করতে হবে বা আমি বরং সমস্ত পিডিএফ-তে 'ই' অক্ষরের সন্ধান চাই। এটির সর্বাধিক ফ্রিকোয়েন্সি বিতরণ রয়েছে সুতরাং সম্ভাবনাগুলি হ'ল পাঠ্যযুক্ত সমস্ত নথিতে এটি পাবেন (যতক্ষণ না তার গ্যাডসবি )

যেমন

grep -rnw '/path/to/pdf/' -e 'e'

যে কোনও পাঠ্য প্রক্রিয়াজাতকরণ সরঞ্জাম ব্যবহার করুন


1
স্ক্যান করা
পিডিএফটিতেও

@ ফুকলভ: তবে ফাইলটি ওসিআরের মাধ্যমে পাঠ্যে রূপান্তরিত হলে এটি এখন আর "স্ক্যান করা" ফাইল নয়, কমপক্ষে আমি ওপির উদ্দেশ্য বুঝতে পারছি। যদিও সত্যিই আপনার কাছে এখন 3 ধরণের পিডিএফ ফাইল থাকতে হবে: পাঠ্য আব দীক্ষা, ওসিআরের পাঠ্য এবং "পাঠ্য" যা স্ক্যান করা চিত্র।
জামেএসকিফ

1
@ জামেসেকফ দয়া করে উপরের উদাহরণটি দেখুন look তারা পিডিএফ স্ক্যান করা হয়। প্রচলিত pdfminer ব্যবহার করে বেশিরভাগ পাঠ্য আমি পুনরুদ্ধার করতে পারি না।
ড্যানিয়েলআরকেটম্যান

1
আমি মনে করি অপীকে সেই ক্ষেত্রে স্ক্যান করা সংজ্ঞাটি পুনর্বিবেচনা / পুনর্বিবেচনা করা বা অ্যাক্রোব্যাট এক্স ব্যবহার বন্ধ করা দরকার যা স্ক্যান করা অনুলিপি গ্রহণ করে এবং চিত্রের পরিবর্তে এটি একটি
ওসিআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.