Подтвердить что ты не робот

Разделы аннотации из pdf

Мне нужна функция python, которая принимает pdf файл и возвращает список текста аннотаций примечания в документе. Я посмотрел на python-poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk), но я не могу понять, как заставить его дать мне что-нибудь полезное.

Я нашел метод get_annot_mapping и модифицировал демо-программу, предоставленную для вызова ее через self.current_page.get_annot_mapping(), но я не знаю, что делать с объектом AnnotMapping. Это, кажется, не полностью реализовано, предоставляя только метод копирования.

Если есть другие библиотеки, которые предоставляют эту функцию, это тоже хорошо.

4b9b3361

Ответ 2

На всякий случай кто-то ищет какой-то рабочий код. Я использую script.

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()

Ответ 3

Я никогда не использовал это, и я не хотел таких функций, но нашел PDFMiner - эта ссылка содержит информацию об основном использовании, может быть, это то, что вы ищете?

Ответ 4

Кто-то спросил аналогичный вопрос. Я попробовал образец кода там, и это не сработало для меня, пока я не сделал несколько функциональных и косметических изменений.

#!/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.rb, chmod +x 'ed и помещено в ваш любимый каталог PATH, используйте:

./pdfannot.rb <path>

Первое время написания/редактирования/ремиксации кода Ruby, так что он очень открыт для предложений. НТН.

С другой стороны, поиск этого вопроса раньше может спасти меня от двойной работы. Надеюсь, этот вопрос привлечет больше внимания в будущем, так что его легче найти.