Mam tysiące dokumentów, a niektóre z nich są skanowane. Potrzebuję więc skryptu do przetestowania wszystkich plików PDF należących do katalogu. Czy jest na to prosty sposób?
- Większość plików PDF to raporty. Dlatego mają dużo tekstu.
Są bardzo różne, ale zeskanowane, jak wspomniano poniżej, mogą znaleźć tekst z powodu niepewnego procesu OCR połączonego ze skanem.
Propozycja ze względu na Sudodus w poniższych komentarzach wydaje się bardzo interesująca. Spójrz na różnicę między zeskanowanym plikiem PDF, a nie skanowanym plikiem PDF:
Zeskanowano:
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>
Nie skanowano:
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>>
Liczba zdjęć na stronie jest znacznie większa (około jednego na stronę)!
command-line
pdf
DanielTheRocketMan
źródło
źródło
pdf
plik zawiera obraz (wstawiony do dokumentu obok tekstu lub jako całe strony, „zeskanowany plik pdf”), plik często (może zawsze) zawiera ciąg znaków/Image/
, który można znaleźć w wierszu poleceniagrep --color -a 'Image' filename.pdf
. Spowoduje to oddzielenie plików zawierających tylko tekst od plików zawierających obrazy (obrazy całostronicowe, a także strony tekstowe z małymi logo i obrazkami ilustrującymi średnie rozmiary).Odpowiedzi:
Skrypt powłoki
Jeśli
pdf
plik zawiera obraz (wstawiony do dokumentu obok tekstu lub jako całe strony, „zeskanowany plik pdf”), plik często (może zawsze) zawiera ciąg znaków/Image/
.W ten sam sposób możesz wyszukać ciąg znaków,
/Text
aby stwierdzić, czy plik pdf zawiera tekst (nie skanowany).Zrobiłem skrypt shellscript
pdf-text-or-image
i może on działać w większości przypadków z twoimi plikami. Shellscript wyszukuje ciągów tekstowych/Image/
oraz/Text
wpdf
plikach.Spraw, by skrypt był wykonywalny,
Przejdź do katalogu, w którym masz
pdf
pliki, i uruchom skrypt shellscript.Zidentyfikowane pliki są przenoszone do następujących podkatalogów
scanned
text
s-and-t
(w przypadku dokumentów zawierających zarówno [zeskanowane obrazy], jak i treść tekstową)Niezidentyfikowane obiekty plików, „UFO”, pozostają w bieżącym katalogu.
Test
Przetestowałem skrypt shellscript na dwóch twoich plikach
AR-G1002.pdf
i naAR-G1003.pdf
niektórych własnychpdf
plikach (które utworzyłem za pomocą Libre Office Impress).Miejmy nadzieję, że
źródło
grep -q
grep -q
wychodzi natychmiast z zerowym statusem, jeśli zostanie znalezione dopasowanie (zamiast przeszukiwania całych plików).cd <path to dir>
Wszystkie zeskanowane pliki pdf pozostaną w folderze, a inne pliki zostaną przeniesione do innego folderu.
źródło
file pdf-filename.pdf
wygenerują numer wersji. Nie mogłem wyszukać określonego tekstu w BR-L1411-3.pdf BR-L1411-3.pdf: Dokument PDF, wersja 1.3, ale byłem w stanie wyszukać tekst w obu podanych przez Ciebie plikach, które są w wersji 1.5 i 1.6 i zdobądź co najmniej jedno dopasowanie. Do przeszukiwania tych plików korzystałem z przeglądarki PDF XChange, ale z evince uzyskałem podobne wyniki. dokument w wersji 1.3 nic nie pasował.file
pomocnych w ukończeniu projektu. Chociaż ja, jak się wydaje, inni wciąż nie są pewni, co dokładnie próbujesz osiągnąć.Stworzyłem skrypt wykrywający, czy plik PDF to OCRd. Główna idea: w plikach OCRd PDF tekst jest niewidoczny.
Algorytm sprawdzający, czy dany plik PDF (
f1
) był OCRd:f1
oznaczoną jakof2
f2
f1
if2
f1
był OCRd, jeśli wszystkie obrazyf1
if2
są identyczne.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
źródło
Hobbyści oferują dobre rozwiązanie, jeśli skanowane dokumenty kolekcji dokumentów nie mają dodanego tekstu z optycznym rozpoznawaniem znaków (OCR). Jeśli jest to możliwe, możesz wykonać pewne skrypty, które odczytują dane wyjściowe
pdfinfo -meta
i sprawdzają narzędzie użyte do utworzenia pliku, lub wykorzystują procedurę Pythona, która korzysta z jednej z bibliotek Pythona do ich badania. Wyszukiwanie tekstu za pomocą takiego narzędziastrings
będzie zawodne, ponieważ zawartość PDF można skompresować. Sprawdzanie narzędzia do tworzenia również nie jest bezpieczne, ponieważ strony PDF można łączyć; Rutynowo łączę dokumenty tekstowe PDF ze skanowanymi obrazami, aby wszystko było razem.Przykro mi, że nie jestem w stanie zaoferować konkretnych sugestii. Minęło trochę czasu, odkąd zająłem się wewnętrzną strukturą PDF, ale w zależności od tego, jak surowe są twoje wymagania, możesz chcieć wiedzieć, że jest to trochę skomplikowane. Powodzenia!
źródło
Jeśli chodzi raczej o wykrycie, czy PDF został utworzony przez skanowanie, a nie pdf zawiera obrazy zamiast tekstu , może być konieczne przekopanie się do metadanych pliku, a nie tylko zawartości.
Ogólnie rzecz biorąc, w przypadku plików, które mogłem znaleźć na moim komputerze i plikach testowych, spełniono następujące warunki:
Obecnie korzystam z systemu Windows, więc użyłem
node.js
następującego przykładu:Aby go uruchomić, musisz mieć zainstalowany Node.js (powinno to być pojedyncze polecenie), a także wywołać:
Stosowanie:
Ten przykład nie jest uważany za gotowe rozwiązanie, ale z
debug
flagą można uzyskać wgląd w meta informacje pliku:Naiwna funkcja, którą napisałem, ma 100% sukcesu w dokumentach, które mogłem znaleźć na moim komputerze (w tym w twoich próbkach). Nazwałem pliki na podstawie ich statusu przed uruchomieniem programu, aby umożliwić sprawdzenie, czy wyniki są poprawne.
Możesz użyć trybu debugowania wraz z odrobiną programowania, aby znacznie poprawić swoje wyniki. Możesz przekazać wyjście programu do innych programów, zawsze będzie miał jedną pełną ścieżkę na linię.
źródło
2 sposoby na wymyślenie:
Korzystanie z narzędzia Wybierz tekst: jeśli używasz zeskanowanego pliku PDF, tekstów nie można wybrać, pojawi się raczej okno. Możesz użyć tego faktu do stworzenia skryptu. Wiem, że w C ++ QT istnieje sposób, choć nie jestem pewien w Linuksie.
Wyszukaj słowo w pliku: W niezeskanowanym pliku PDF wyszukiwanie będzie działać, ale nie w zeskanowanym pliku. Musisz po prostu znaleźć kilka słów wspólnych dla wszystkich plików PDF lub wolę wyszukać literę „e” we wszystkich plikach PDF. Ma najwyższy rozkład częstotliwości, więc są szanse, że znajdziesz go we wszystkich dokumentach zawierających tekst (chyba że jest to gadżet )
na przykład
Użyj dowolnego narzędzia do przetwarzania tekstu
źródło