2009-07-09 92 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中提取所有文本,我只想提取注释。 我之所以提到poppler的原因是因为它的确提供了这个功能,很容易(http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h)。 但是,我想用python。我找到了python-poppler绑定项目,但似乎并没有提供对注释的完全访问。我的问题归结为“我做错了还是图书馆不完整?”和“有没有其他人提供相同的功能?” – davidb 2009-07-10 13:54:08

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 2017-08-29 03:09:56

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。

在旁注中,前面找到这个问题可以让我从双重工作中解脱出来。希望这个问题在将来得到更多关注,以便更容易找到。