2009-07-09 34 views
22

Tôi muốn có hàm python nhận pdf và trả về một danh sách văn bản của chú thích ghi chú trong tài liệu. Tôi đã nhìn vào python-poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk) nhưng tôi không thể tìm ra cách để có được nó để cho tôi bất cứ điều gì hữu ích.Chú thích phân tích cú pháp từ một pdf

Tôi đã tìm thấy phương pháp get_annot_mapping và sửa đổi chương trình demo được cung cấp để gọi nó qua self.current_page.get_annot_mapping(), nhưng tôi không biết phải làm gì với đối tượng AnnotMapping. Dường như không được triển khai đầy đủ, chỉ cung cấp phương thức sao chép.

Nếu có bất kỳ thư viện nào khác cung cấp chức năng này thì cũng tốt.

Trả lời

1

Tôi chưa bao giờ sử dụng tính năng này, tôi cũng không muốn loại tính năng này, nhưng tôi thấy PDFMiner - liên kết này có thông tin về mức sử dụng cơ bản, có thể đây là những gì bạn đang tìm kiếm?

+1

Mặc dù điều đó có thể hữu ích nếu tôi muốn trích xuất tất cả văn bản từ pdf, tôi chỉ muốn trích xuất chú thích. Lý do tôi đề cập đến poppler là vì nó cung cấp khả năng này khá dễ dàng (http://cgit.freedesktop.org/poppler/poppler/tree/glib/poppler-annot.h). Nhưng, tôi muốn sử dụng python. Tôi đã tìm thấy dự án liên kết python-poppler, nhưng nó dường như không cung cấp quyền truy cập đầy đủ vào các chú thích. Câu hỏi của tôi loại nhọt xuống "Tôi làm sai hay thư viện chưa đầy đủ?" và "Có người nào khác cung cấp chức năng giống nhau không?" – davidb

14

Chỉ trong trường hợp ai đó đang tìm kiếm một số mã hoạt động. Đây là tập lệnh tôi sử dụng.

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

Có lẽ đáng để tống tiền lên trên một git repo công cộng ở đâu đó, vì vậy những người khác có thể dễ dàng giúp cải thiện nó. – naught101

+1

Ngoài ra, bạn cài đặt Poppler như thế nào? – naught101

+0

Tôi cho rằng bạn đang sử dụng Linux phải không? Trong cửa sổ, khó có thể đến được bằng các ràng buộc python poppler. – schlingel

0

Ai đó đã hỏi similar question. Tôi đã thử các mẫu mã ở đó và nó đã không làm việc cho tôi cho đến khi tôi thực hiện một vài thay đổi chức năng và mỹ phẩm.

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

Nếu lưu lại dưới dạng pdfannot.rb, chmod +x 'ed và đặt vào thư mục PATH yêu thích của bạn, sử dụng là:

./pdfannot.rb <path> 

Lần đầu tiên viết/chỉnh sửa/remixing mã Ruby, vì vậy rất mở cho các đề xuất. HTH.

Một lưu ý phụ, việc tìm kiếm câu hỏi này trước đó có thể đã cứu tôi khỏi công việc kép. Hy vọng câu hỏi này sẽ được chú ý nhiều hơn trong tương lai sao cho dễ tìm hơn.

Các vấn đề liên quan