2009-07-09 7 views
22

Desidero una funzione python che prende un pdf e restituisce un elenco del testo delle annotazioni note nel documento. Ho guardato Python-poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk) ma non riesco a capire come ottenerlo per darmi qualcosa di utile.Annotazioni di analisi da un pdf

Ho trovato il metodo get_annot_mapping e ho modificato il programma demo fornito per chiamarlo tramite self.current_page.get_annot_mapping(), ma non ho idea di cosa fare con un oggetto AnnotMapping. Sembra non essere completamente implementato, fornendo solo il metodo di copia.

Se ci sono altre librerie che forniscono questa funzione, va bene lo stesso.

risposta

1

Non l'ho mai usato, né volevo questo tipo di funzionalità, ma ho trovato PDFMiner - questo collegamento contiene informazioni sull'utilizzo di base, forse questo è quello che stai cercando?

+1

Mentre potrebbe essere utile se volessi estrarre tutto il testo da un pdf, voglio solo estrarre le annotazioni. Il motivo per cui ho parlato di poppler è perché fornisce questa capacità piuttosto facilmente (http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h). Ma, volevo usare python. Ho trovato il progetto di binding Python-Poppler, ma non sembra fornire pieno accesso alle annotazioni. La mia domanda si riduce a "Sto sbagliando o la libreria è incompleta?" e "Ci sono altri che forniscono la stessa funzionalità?" – davidb

14

Nel caso in cui qualcuno stia cercando un codice funzionante. Ecco uno script che 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

Probabilmente vale la pena di buttar giù da qualche parte in un repository pubblico di git, in modo che altri possano facilmente contribuire a migliorarlo. – naught101

+1

Inoltre, come si installa Poppler? – naught101

+0

Suppongo tu stia usando Linux, vero? In Windows, è difficile arrivare con i binding Python poppler. – schlingel

0

Qualcuno ha richiesto un similar question. Ho provato il codice di esempio e non ha funzionato per me finché non ho apportato alcune modifiche funzionali e estetiche.

#!/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 

Se salvato come pdfannot.rb, chmod +x 'ed e messo nella directory preferita PATH, l'utilizzo è:

./pdfannot.rb <path> 

prima volta che scrivo/editing/remix codice Ruby, in modo molto aperto a suggerimenti. HTH.

In una nota a margine, trovare questa domanda in precedenza avrebbe potuto salvarmi dal doppio lavoro. Speriamo che questa domanda ottenga più attenzione in futuro, così che sia più facile da trovare.