Tengo miles de documentos y algunos de ellos están escaneados. Por lo tanto, necesito un script para probar todos los archivos PDF que pertenecen a un directorio. ¿Hay una manera simple de hacer eso?
- La mayoría de los PDF son informes. Por lo tanto, tienen mucho texto.
Son muy diferentes, pero los escaneados como se menciona a continuación pueden encontrar texto debido a un proceso de OCR precario acoplado al escaneo.
La propuesta de Sudodus en los comentarios a continuación parece ser muy interesante. Mire la diferencia entre un PDF escaneado a uno no escaneado:
Escaneado:
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>
No escaneado:
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>>
¡La cantidad de imágenes por página es mucho mayor (aproximadamente una por página)!
command-line
pdf
DanielTheRocketMan
fuente
fuente
pdf
archivo contiene una imagen (insertada en un documento junto al texto o como páginas completas, 'pdf escaneado'), el archivo a menudo (tal vez siempre) contiene la cadena/Image/
, que se puede encontrar con la línea de comandogrep --color -a 'Image' filename.pdf
. Esto separará los archivos que contienen solo texto de los que contienen imágenes (imágenes de página completa, así como páginas de texto con logotipos pequeños e imágenes ilustrativas de tamaño mediano).Respuestas:
Shellscript
Si un
pdf
archivo contiene una imagen (insertada en un documento junto al texto o como páginas completas, 'pdf escaneado'), el archivo a menudo (tal vez siempre) contiene la cadena/Image/
.De la misma manera, puede buscar la cadena
/Text
para saber si un archivo pdf contiene texto (no escaneado).Hice el shellscript
pdf-text-or-image
, y podría funcionar en la mayoría de los casos con sus archivos. El shellscript busca las cadenas de texto/Image/
y/Text
lospdf
archivos.Hacer el shellscript ejecutable,
Cambie el directorio a donde tiene los
pdf
archivos y ejecute el shellscript.Los archivos identificados se mueven a los siguientes subdirectorios
scanned
text
s-and-t
(para documentos con imágenes [escaneadas?] y contenido de texto)Los objetos de archivo no identificados, 'Ovnis', permanecen en el directorio actual.
Prueba
He probado el shellscript con dos de sus archivos,
AR-G1002.pdf
yAR-G1003.pdf
, y con algunos propiospdf
archivos (que he creado usando Libre Oficina Impress).Esperemos que
fuente
grep -q
grep -q
sale inmediatamente con estado cero si se encuentra alguna coincidencia (en lugar de buscar en los archivos completos).cd <path to dir>
Todos los archivos escaneados en PDF permanecerán en la carpeta y otros archivos se moverán a otra carpeta.
fuente
file pdf-filename.pdf
producirá un número de versión. No pude buscar texto específico en BR-L1411-3.pdf BR-L1411-3.pdf: documento PDF, versión 1.3, pero pude buscar texto en los otros dos archivos que proporcionó, que son la versión 1.5 y 1.6 y obtener uno o más partidos. Utilicé el visor PDF XChange para buscar estos archivos pero obtuve resultados similares con evince. el documento de la versión 1.3 no coincidía con nada.file
útil para completar su proyecto. Aunque, como parece, otros todavía no tienen claro exactamente lo que está tratando de lograr.Creé un script para detectar si un PDF era OCRd. La idea principal: en PDF OCRd es el texto invisible.
Algoritmo para probar si un PDF (
f1
) dado era OCRd:f1
anotado comof2
f2
f1
yf2
f1
fue OCRd si todas las imágenes def1
yf2
son idénticas.https://github.com/jfilter/pdf-scripts/blob/master/is_ocrd_pdf.sh
fuente
Hobbyist ofrece una buena solución si los documentos escaneados de la colección de documentos no tienen texto agregado con reconocimiento óptico de caracteres (OCR). Si esta es una posibilidad, es posible que desee realizar algunas secuencias de comandos que lean el resultado
pdfinfo -meta
y comprueben la herramienta utilizada para crear el archivo, o empleen una rutina de Python que use una de las bibliotecas de Python para examinarlas. La búsqueda de texto con una herramienta comostrings
no será confiable porque el contenido PDF se puede comprimir. Y verificar la herramienta de creación tampoco es seguro, ya que las páginas PDF se pueden combinar; Combino documentos de texto PDF con imágenes escaneadas para mantener las cosas juntas.Lamento no poder ofrecer sugerencias específicas. Ha pasado un tiempo desde que examiné la estructura interna del PDF, pero dependiendo de cuán estrictos sean sus requisitos, es posible que desee saber que es un poco complicado. ¡Buena suerte!
fuente
Si se trata más de detectar si el PDF se creó escaneando en lugar de que el pdf tenga imágenes en lugar de texto, entonces es posible que deba profundizar en los metadatos del archivo, no solo en el contenido.
En general, para los archivos que pude encontrar en mi computadora y sus archivos de prueba, lo siguiente es cierto:
Estoy usando Windows en este momento, así que usé
node.js
para el siguiente ejemplo:Para ejecutarlo, debe tener Node.js instalado (debe ser un solo comando) y también debe llamar a:
Uso:
Este ejemplo no se considera una solución terminada, pero con el
debug
indicador, obtiene una idea de la metainformación de un archivo:La ingenua función que escribí tiene un 100% de éxito en los documentos que pude encontrar en mi computadora (incluidas sus muestras). Puse un nombre a los archivos en función de su estado antes de ejecutar el programa, para que sea posible ver si los resultados son correctos.
Puede usar el modo de depuración junto con un poco de programación para mejorar enormemente sus resultados. Puede pasar la salida del programa a otros programas, siempre tendrá una ruta completa por línea.
fuente
2 maneras en que puedo pensar:
Uso de la herramienta de selección de texto: si está utilizando un PDF escaneado, los textos no se pueden seleccionar, sino que aparecerá un cuadro. Puede usar este hecho para crear el script. Sé que en C ++ QT hay una forma, aunque no estoy seguro en Linux.
Buscar palabra en el archivo: en un PDF no escaneado, su búsqueda funcionará, pero no en el archivo escaneado. Solo necesita encontrar algunas palabras comunes a todos los PDF o preferiría buscar la letra 'e' en todos los PDF. Tiene la distribución de frecuencia más alta, por lo que es probable que la encuentre en todos los documentos que tienen texto (a menos que sea gadsby )
p.ej
Utilice cualquiera de las herramientas de procesamiento de texto.
fuente