2010-01-04 22 views
27

Así que 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 escaneado (nuestro gobierno en su mejor momento ¿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.Convertir PDF a imágenes automáticamente

Obviamente, esto necesita ser automatizado, y preferiría seguir 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.

+4

antes de hacerlo, comuníquese con la entidad .gov que produce los archivos. Es muy posible que pueda obtener acceso fácil a esos archivos digitales reales. Habiendo trabajado en .gov y se encontró con el mismo problema, generalmente se debe a requisitos legales anticuados (firmas de papel) y/o falta de conocimiento técnico (a menudo, esto evitará que el equipo de TI/web lo capte).)También puede llamarlos sobre el tema de accesibilidad ya que un JPG gigante de una página es completamente inaccesible para la tecnología de asistencia. –

+0

Además, para ser justos con la tierra .gov, a menudo tienen que atender un abismo tecnológico increíblemente amplio. Por desgracia, todavía vivimos en un tiempo en el que el denominador común más bajo es una forma en papel. –

+0

Votado para cerrar: ver http://stackoverflow.com/questions/331918/converting-a-pdf-to-a-series-of-images-with-python. – Brian

Respuesta

13

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: Extracting JPGs from PDFs. 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.

+0

¿Esto solo funciona para JPG? Porque cuando lo probé en mi propio PDF, se detendría inmediatamente después de no poder encontrar el inicio. –

5

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:

7

Se podría llamar, por ejemplo, pdftoppm desde la línea de comandos (o utilizando el módulo Python's subprocess) y luego convierta los archivos PPM resultantes al formato deseado utilizando, por ejemplo, ImageMagick (nuevamente, usando subprocess o algunos enlaces si existen).

+1

Me encantaría encontrar una solución sin usar bibliotecas externas, porque necesito hacer esta conversión en un servidor compartido que no puede instalar ImageMagick o Ghostscript, cualquier ideA ¿cómo? – DaniPaniz

1

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 

El jpgPath variable de resultado le indica la ubicación de la ruta de la última página del jpeg pdf impreso. Si necesita obtener otra página, puede agregar fácilmente alguna lógica para modificar la ruta para obtener las páginas anteriores