2009-07-09 28 views
22

私は、pdfをとり、文書内の注釈のテキストのリストを返すpython関数が必要です。私はpython-poppler(https://code.launchpad.net/~poppler-python/poppler-python/trunk)を見てきましたが、何か役に立つものを得る方法を理解できません。pdfから注釈を解析する

私はget_annot_mappingメソッドを見つけて、self.current_page.get_annot_mapping()経由で呼び出すために提供されているデモプログラムを修正しましたが、私はAnnotMappingオブジェクトをどうすればいいのかわかりません。これは完全に実装されていないようで、コピー方法のみを提供しているようです。

この機能を提供する他のライブラリがある場合は、それも問題ありません。

答えて

1

この種類の機能を使用したことはありませんでしたが、この種類の機能は欲しかったですが、PDFMinerが見つかりました。このリンクには基本的な使い方に関する情報があります。

+1

これはPDFからすべてのテキストを抽出する場合に便利ですが、注釈を抽出したいだけです。 私がポップラーに言及したのは、この能力をかなり簡単に提供しているからです(http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h)。 しかし、私はpythonを使いたいと思っていました。私はpython-popplerバインディングプロジェクトを見つけましたが、注釈への完全なアクセスを提供していないようです。私の質問は、「私はそれを間違っているのか、図書館は不完全なのか? 「同じ機能を提供する他のものはありますか?」 – davidb

14

誰かが何らかの作業コードを探している場合にのみ。 ここに私が使用するスクリプトがあります。

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

おそらく公共のgit repoのどこかでそれをチャッキングする価値があるので、他の人は簡単にそれを改善することができます。 – naught101

+1

また、どのようにポップラーをインストールしていますか? – naught101

+0

私はあなたがLinuxを使用していると思いますか?ウィンドウズでは、poppler pythonバインディングで来るのは難しいです。 – schlingel

0

誰かがsimilar questionを尋ねました。私はそこにコードサンプルを試してみましたが、私はいくつかの機能的および美容的な変更を行うまで私のためには機能しませんでした。

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

pdfannot.rbchmod +x「編として保存して、お気に入りのPATHディレクトリに置かれた場合は、使用方法は次のとおりです。

./pdfannot.rb <path> 

初めての書き込み/編集/リミックスRubyコードなので、提案のための非常にオープン。 HTH。

この問題を早期に発見すると、私は二重の作業から救われる可能性があります。うまくいけば、この質問は将来見つけやすくなるようにもっと注意を引くことができます。

関連する問題