Ответ 1
Оказывается, привязки были неполными. Теперь он исправлен. https://bugs.launchpad.net/poppler-python/+bug/397850
Мне нужна функция python, которая принимает pdf файл и возвращает список текста аннотаций примечания в документе. Я посмотрел на python-poppler (https://code.launchpad.net/~poppler-python/poppler-python/trunk), но я не могу понять, как заставить его дать мне что-нибудь полезное.
Я нашел метод get_annot_mapping
и модифицировал демо-программу, предоставленную для вызова ее через self.current_page.get_annot_mapping()
, но я не знаю, что делать с объектом AnnotMapping. Это, кажется, не полностью реализовано, предоставляя только метод копирования.
Если есть другие библиотеки, которые предоставляют эту функцию, это тоже хорошо.
Оказывается, привязки были неполными. Теперь он исправлен. https://bugs.launchpad.net/poppler-python/+bug/397850
На всякий случай кто-то ищет какой-то рабочий код. Я использую 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()
Я никогда не использовал это, и я не хотел таких функций, но нашел PDFMiner - эта ссылка содержит информацию об основном использовании, может быть, это то, что вы ищете?
Кто-то спросил аналогичный вопрос. Я попробовал образец кода там, и это не сработало для меня, пока я не сделал несколько функциональных и косметических изменений.
#!/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, так что он очень открыт для предложений. НТН.
С другой стороны, поиск этого вопроса раньше может спасти меня от двойной работы. Надеюсь, этот вопрос привлечет больше внимания в будущем, так что его легче найти.