2009-07-09 8 views
22

Quiero una función de python que toma un pdf y devuelve una lista del texto de las anotaciones de notas en el documento. He mirado python-poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk) pero no puedo encontrar la forma de conseguir que me brinde algo útil.Anotaciones de Parse desde un pdf

Encontré el método get_annot_mapping y modifiqué el programa de demostración proporcionado para llamarlo a través del self.current_page.get_annot_mapping(), pero no tengo idea de qué hacer con un objeto AnnotMapping. Parece que no se ha implementado por completo, proporcionando solo el método de copia.

Si hay otras bibliotecas que ofrecen esta función, también está bien.

Respuesta

1

Nunca he usado esto, ni quería este tipo de características, pero encontré PDFMiner - este enlace tiene información sobre el uso básico, ¿quizás esto es lo que está buscando?

+1

Si bien eso podría ser útil si quisiera extraer todo el texto de un pdf, solo quiero extraer las anotaciones. La razón por la que mencioné poppler es porque proporciona esta habilidad bastante fácilmente (http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h). Pero, yo quería usar Python. Encontré el proyecto vinculante python-poppler, pero parece que no proporciona acceso completo a las anotaciones. Mi pregunta se reduce a "¿Lo estoy haciendo mal o la biblioteca está incompleta?" y "¿Hay otros que brinden la misma funcionalidad?" – davidb

14

Por si acaso alguien está buscando algún código de trabajo. Aquí hay un script que uso.

import poppler 
import sys 
import urllib 
import os 

def main(): 
    input_filename = sys.argv[1] 
    # http://blog.hartwork.org/?p=612 
    document = poppler.document_new_from_file('file://%s' % \ 
    urllib.pathname2url(os.path.abspath(input_filename)), None) 
    n_pages = document.get_n_pages() 
    all_annots = 0 

    for i in range(n_pages): 
     page = document.get_page(i) 
     annot_mappings = page.get_annot_mapping() 
     num_annots = len(annot_mappings) 
     if num_annots > 0: 
      for annot_mapping in annot_mappings: 
       if annot_mapping.annot.get_annot_type().value_name != 'POPPLER_ANNOT_LINK': 
        all_annots += 1 
        print 'page: {0:3}, {1:10}, type: {2:10}, content: {3}'.format(i+1, annot_mapping.annot.get_modified(), annot_mapping.annot.get_annot_type().value_nick, annot_mapping.annot.get_contents()) 

    if all_annots > 0: 
    print str(all_annots) + " annotation(s) found" 
    else: 
    print "no annotations found" 

if __name__ == "__main__": 
    main() 
+0

Probablemente valga la pena subir eso a un repositorio de git público en alguna parte, para que otros puedan ayudar a mejorarlo fácilmente. – naught101

+1

Además, ¿cómo está instalando Poppler? – naught101

+0

Supongo que estás usando Linux, ¿verdad? En Windows, es difícil encontrar enlaces de python poppler. – schlingel

0

Alguien ha pedido similar question. Probé la muestra de código allí y no funcionó para mí hasta que realicé algunos cambios funcionales y cosméticos.

#!/usr/bin/ruby 

require 'pdf-reader' 

ARGV.each do |filename| 
    PDF::Reader.open(filename) do |reader| 
    puts "file: #{filename}" 
    puts "page\tcomment" 
    reader.pages.each do |page| 
     annots_ref = page.attributes[:Annots] 
     if annots_ref 
     actual_annots = annots_ref.map { |a| reader.objects[a] } 
     actual_annots.each do |actual_annot| 
      unless actual_annot[:Contents].nil? 
      puts "#{page.number}\t#{actual_annot[:Contents]}" 
      end 
     end 
     end 
    end  
    end 
end 

Si guarda como pdfannot.rb, chmod +x 'ed y se coloca en su directorio favorito PATH, el uso es:

./pdfannot.rb <path> 

Primera vez/edición/remezcla código Ruby escritura, de modo muy abierto a sugerencias. HTH.

En una nota lateral, encontrar esta pregunta antes podría haberme salvado del doble trabajo. Esperemos que esta pregunta reciba más atención en el futuro de tal manera que sea más fácil de encontrar.

Cuestiones relacionadas