2009-07-09 5 views
22

Ich möchte eine Python-Funktion, die eine PDF-Datei verwendet und eine Liste mit dem Text der Notiz-Annotationen im Dokument zurückgibt. Ich habe Python-Poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk) angeschaut, aber ich kann nicht herausfinden, wie ich es bekommen kann, um mir etwas nützliches zu geben.Parse-Annotationen aus einer PDF-Datei

Ich fand die get_annot_mapping Methode und modifizierte das Demo-Programm zur Verfügung gestellt, um es über self.current_page.get_annot_mapping(), aber ich habe keine Ahnung, was mit einem AnnotMapping-Objekt zu tun. Es scheint nicht vollständig implementiert zu sein und bietet nur die Kopiermethode.

Wenn es andere Bibliotheken gibt, die diese Funktion bereitstellen, ist das auch in Ordnung.

Antwort

1

Ich habe das nie verwendet, noch wollte ich diese Art von Funktionen, aber ich fand PDFMiner - dieser Link hat Informationen über die grundlegende Verwendung, vielleicht ist das, was Sie suchen?

+1

Während dies nützlich sein könnte, wenn ich den gesamten Text aus einer PDF extrahieren wollte, möchte ich nur die Anmerkungen extrahieren. Der Grund, warum ich Poppler erwähnt, ist, weil es diese Fähigkeit ziemlich leicht zur Verfügung stellt (http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h). Aber ich wollte Python verwenden. Ich habe das Python-Poppler-Bindungsprojekt gefunden, scheint aber keinen vollständigen Zugriff auf die Annotationen zu bieten. Meine Frage läuft irgendwie auf "mache ich es falsch oder ist die Bibliothek unvollständig?" und "Gibt es noch andere, die dieselbe Funktionalität bieten?" – davidb

14

Nur für den Fall, dass jemand nach einem funktionierenden Code sucht. Hier ist ein Skript, das ich verwende.

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

Wahrscheinlich lohnt es sich, irgendwo auf einem öffentlichen Git Repo herumzuhacken, damit andere leicht dazu beitragen können, es zu verbessern. – naught101

+1

Wie installieren Sie Poppler? – naught101

+0

Ich nehme an, Sie verwenden Linux, nicht wahr? In Windows ist es schwer, mit Poppler Python Bindings zu kommen. – schlingel

0

Jemand fragte eine similar question. Ich habe das Codebeispiel dort ausprobiert und es hat nicht funktioniert, bis ich ein paar funktionale und kosmetische Änderungen vorgenommen habe.

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

Wenn als pdfannot.rb gespeichert, chmod +x ‚ed und platziert in Ihr bevorzugtes PATH Verzeichnis Nutzung ist:

./pdfannot.rb <path> 

Zum ersten Mal Schreiben/Lektorat/Remixen Ruby-Code, so sehr offen für Vorschläge. HTH.

Nebenbei bemerkt, diese Frage früher zu finden, hätte mich vor doppelter Arbeit bewahren können. Hoffentlich bekommt diese Frage in Zukunft mehr Aufmerksamkeit, so dass sie leichter zu finden ist.