J'ai des milliers de documents et certains d'entre eux sont numérisés. J'ai donc besoin d'un script pour tester tous les fichiers PDF qui appartiennent à un répertoire. Existe-t-il un moyen simple de le faire?
- La plupart des PDF sont des rapports. Ils ont donc beaucoup de texte.
Ils sont très différents, mais ceux numérisés comme mentionné ci-dessous peuvent trouver du texte en raison d'un processus OCR précaire couplé à la numérisation.
La proposition due à Sudodus dans les commentaires ci-dessous semble être très intéressante. Regardez la différence entre un PDF numérisé et un PDF non numérisé:
Numérisé:
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>
Non numérisé:
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>>
Le nombre d'images par page est beaucoup plus important (environ une par page)!
command-line
pdf
DanielTheRocketMan
la source
la source
pdf
fichier contient une image (insérée dans un document à côté de texte ou sous forme de pages entières, 'pdf numérisé'), le fichier contient souvent (peut-être toujours) la chaîne/Image/
, qui peut être trouvée avec la ligne de commandegrep --color -a 'Image' filename.pdf
. Cela séparera les fichiers qui ne contiennent que du texte de ceux contenant des images (images pleine page ainsi que pages de texte avec de petits logos et images illustratives de taille moyenne).Réponses:
Shellscript
Si un
pdf
fichier contient une image (insérée dans un document à côté de texte ou sous forme de pages entières, «pdf numérisé»), le fichier contient souvent (peut-être toujours) la chaîne/Image/
.De la même manière, vous pouvez rechercher la chaîne
/Text
pour savoir si un fichier pdf contient du texte (non numérisé).J'ai fait le shellscript
pdf-text-or-image
, et cela pourrait fonctionner dans la plupart des cas avec vos fichiers. Le shellscript recherche les chaînes de texte/Image/
et/Text
lespdf
fichiers.Rendez le shellscript exécutable,
Changez le répertoire où vous avez les
pdf
fichiers et exécutez le shellscript.Les fichiers identifiés sont déplacés vers les sous-répertoires suivants
scanned
text
s-and-t
(pour les documents contenant à la fois des images [numérisées?] et du texte)Les objets fichier non identifiés, les «OVNIS», restent dans le répertoire courant.
Tester
Je l' ai testé le shellscript avec deux de vos fichiers,
AR-G1002.pdf
etAR-G1003.pdf
, et avec quelques proprespdf
fichiers (que j'ai créés avec Libre Office Impress).Espérons que
la source
grep -q
grep -q
ferme immédiatement avec un état nul si une correspondance est trouvée (au lieu de parcourir tous les fichiers).cd <path to dir>
Tous les fichiers numérisés en pdf resteront dans le dossier et les autres fichiers seront déplacés vers un autre dossier.
la source
file pdf-filename.pdf
produira un numéro de version. Je n'ai pas pu rechercher de texte spécifique dans BR-L1411-3.pdf BR-L1411-3.pdf: document PDF, version 1.3, mais j'ai pu rechercher du texte dans les deux autres fichiers que vous avez fournis, qui sont la version 1.5 et 1.6 et obtenez un ou plusieurs matchs. J'ai utilisé la visionneuse PDF XChange pour rechercher ces fichiers, mais j'ai obtenu des résultats similaires avec evince. le document de la version 1.3 ne correspondait à rien.file
utile pour terminer votre projet. Bien qu'il me semble que d' autres ne savent toujours pas exactement ce que vous essayez d'accomplir.J'ai créé un script pour détecter si un PDF était OCRd. L'idée principale: dans les PDF OCRd, le texte est invisible.
Algorithme pour tester si un PDF (
f1
) donné était OCRd:f1
noté commef2
f2
f1
etf2
f1
était OCRd si toutes les images def1
etf2
sont identiques.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
la source
Hobbyist offre une bonne solution si les documents numérisés de la collection de documents n'ont pas de texte ajouté avec reconnaissance optique de caractères (OCR). Si cela est possible, vous souhaiterez peut-être effectuer un script qui lit la sortie de
pdfinfo -meta
et vérifie l'outil utilisé pour créer le fichier, ou utiliser une routine Python qui utilise l'une des bibliothèques Python pour les examiner. La recherche de texte avec un outil commestrings
ne sera pas fiable car le contenu PDF peut être compressé. Et la vérification de l'outil de création n'est pas non plus infaillible, car les pages PDF peuvent être combinées; Je combine régulièrement des documents texte PDF avec des images numérisées pour garder les choses ensemble.Je suis désolé de ne pouvoir offrir de suggestions spécifiques. Cela fait un moment que je n'ai pas fouillé la structure interne du PDF, mais selon la rigueur de vos exigences, vous voudrez peut-être savoir que c'est un peu compliqué. Bonne chance!
la source
S'il s'agit davantage de détecter réellement si le PDF a été créé par numérisation plutôt que si le PDF contient des images au lieu de texte, vous devrez peut-être fouiller dans les métadonnées du fichier, pas seulement le contenu.
En général, pour les fichiers que j'ai pu trouver sur mon ordinateur et vos fichiers de test, ce qui suit est vrai:
J'utilise Windows pour le moment, j'ai donc utilisé
node.js
l'exemple suivant:Pour l'exécuter, vous devez avoir installé Node.js (devrait être une seule commande) et vous devez également appeler:
Usage:
Cet exemple n'est pas considéré comme une solution terminée, mais avec l'
debug
indicateur, vous obtenez un aperçu des méta-informations d'un fichier:La fonction naïve que j'ai écrite a 100% de succès sur les documents que j'ai pu trouver sur mon ordinateur (y compris vos échantillons). J'ai nommé les fichiers en fonction de leur état avant d'exécuter le programme, pour permettre de voir si les résultats sont corrects.
Vous pouvez utiliser le mode débogage avec un tout petit peu de programmation pour améliorer considérablement vos résultats. Vous pouvez passer la sortie du programme à d'autres programmes, il aura toujours un chemin complet par ligne.
la source
2 façons de penser:
Utilisation de l'outil de sélection de texte: si vous utilisez un PDF numérisé, les textes ne peuvent pas être sélectionnés, une boîte apparaîtra plutôt. Vous pouvez utiliser ce fait pour créer le script. Je sais qu'en C ++ QT il y a un moyen, mais je ne suis pas sûr sous Linux.
Rechercher un mot dans un fichier: dans un PDF non numérisé, votre recherche fonctionnera, mais pas dans un fichier numérisé. Vous avez juste besoin de trouver des mots communs à tous les PDF ou je préfère dire rechercher la lettre «e» dans tous les PDF. Il a la distribution de fréquences la plus élevée, il y a donc de fortes chances que vous le trouviez dans tous les documents contenant du texte (à moins que ce ne soit gadsby )
par exemple
Utilisez l'un des outils de traitement de texte
la source