python - pdf2image - Conversión de PDF a imágenes automáticamente
pdf2jpg python (5)
Entonces, el estado en el que estoy lanzó varios datos en formato PDF, pero para empeorar las cosas, la mayoría (todos?) De los PDF parecen ser letras escritas en Office, impresas / fax y luego escaneadas (nuestro gobierno en su mejor eh?). Al principio pensé que estaba loco, pero luego comencé a ver numerosos archivos PDF que están "inclinados", como si alguien no los hubiera colocado correctamente en el escáner. Entonces, pensé que la siguiente mejor opción para obtener el texto real de ellos sería convertir cada página en una imagen.
Obviamente, esto necesita ser automatizado, y preferiría quedarme con Python si es posible. Si Ruby o Perl tienen algún tipo de implementación que sea demasiado impresionante como para dejarla pasar, puedo seguir esa ruta. He intentado con pyPDF para la extracción de texto, que obviamente no me sirvió de mucho. He probado swftools, pero las imágenes que obtengo son casi completamente inutilizables. Simplemente parece que las fuentes se arruinan en la conversión. Tampoco me importa realmente el formato de imagen en el camino de salida, siempre y cuando sean relativamente livianos y legibles.
Aquí hay un enfoque alternativo para convertir un archivo .pdf en imágenes: use una impresora de imágenes. He utilizado con éxito la función siguiente para "imprimir" archivos PDF en imágenes JPEG con ImagePrinter Pro . Sin embargo, hay MUCHAS impresoras de imagen por ahí. Escoge el que te gusta. Parte del código puede necesitar modificarse ligeramente en función de la impresora de imágenes que elija y del formato estándar de guardado de archivos que utiliza la impresora de imágenes.
import win32api
import os
def pdf_to_jpg(pdfPath, pages):
# print pdf using jpg printer
# ''pages'' is the number of pages in the pdf
filepath = pdfPath.rsplit(''/'', 1)[0]
filename = pdfPath.rsplit(''/'', 1)[1]
#print pdf to jpg using jpg printer
tempprinter = "ImagePrinter Pro"
printer = ''"%s"'' % tempprinter
win32api.ShellExecute(0, "printto", filename, printer, ".", 0)
# Add time delay to ensure pdf finishes printing to file first
fileFound = False
if pages > 1:
jpgName = filename.split(''.'')[0] + ''_'' + str(pages - 1) + ''.jpg''
else:
jpgName = filename.split(''.'')[0] + ''.jpg''
jpgPath = filepath + ''/'' + jpgName
waitTime = 30
for i in range(waitTime):
if os.path.isfile(jpgPath):
fileFound = True
break
else:
time.sleep(1)
# print Error if the file was never found
if not fileFound:
print "ERROR: " + jpgName + " wasn''t found after " + str(waitTime)/
+ " seconds"
return jpgPath
La variable jpgPath
resultante jpgPath
dice la ubicación de la ruta de la última página jpeg del pdf impreso. Si necesita obtener otra página, puede agregar fácilmente alguna lógica para modificar la ruta para obtener páginas anteriores
Ghostscript es ideal para convertir archivos PDF a imágenes. Es confiable y tiene muchas opciones configurables. También está disponible bajo la licencia GPL o licencia comercial. Puede llamarlo desde la línea de comando o usar su API nativa. Para más información:
Puede llamar, por ejemplo, pdftoppm
desde la línea de comandos (o utilizando el módulo de subprocess
de Python) y luego convertir los archivos PPM resultantes al formato deseado utilizando, por ejemplo, ImageMagick (nuevamente, utilizando subprocess
o algunos enlaces si existen).
Si los PDF son imágenes realmente escaneadas, entonces no debe convertir el PDF a una imagen, debe extraer la imagen del PDF. Lo más probable es que todos los datos en el PDF sean esencialmente una imagen gigante, envueltos en una verbosidad de PDF para que sea legible en Acrobat.
Debe intentar el simple recurso de simplemente encontrar la imagen en el PDF y copiar los bytes: Extraer JPG de archivos PDF . El código allí es completamente simple, y probablemente hay docenas de razones por las que no funcionará en sus archivos PDF. Pero si lo hace, tendrá una forma rápida e indolora de obtener los datos de imagen de los archivos PDF.
en pdf_to_jpg
(pdfPath)
6 # ''pages'' is the number of pages in the pdf
7 filepath = pdfPath.rsplit(''/'', 1)[0]
----> 8 filename = pdfPath.rsplit(''/'', 1)[1]
9
10 #print pdf to jpg using jpg printer
IndexError: lista el índice fuera de rango