Извлечение ключевых слов из метаданных PDF в Python - PullRequest
1 голос
/ 25 января 2020

У меня есть файл PDF, из которого я хочу получить некоторую информацию из его метады. Для этого я следую следующей процедуре:

from PyPDF2 import PdfFileReader    
mypath = "your_pdf_file.pdf"
pdf_toread = PdfFileReader(open(mypath, 'rb'))
pdf_info = pdf_toread.getDocumentInfo()

Для данного документа на выходе получается:

Out[230]: 
{'/CrossmarkDomainExclusive': 'true',
 '/CreationDate': "D:20181029074117+05'30'",
 '/CrossMarkDomains#5B2#5D': 'elsevier.com',
 '/Author': 'Nicola Gennaioli',
 '/Creator': 'Elsevier',
 '/ElsevierWebPDFSpecifications': '6.5',
 '/Subject': 'Journal of Monetary Economics, 98 (2018) 98-113. doi:10.1016/j.jmoneco.2018.04.011',
 '/CrossmarkMajorVersionDate': '2010-04-23',
 '/CrossMarkDomains#5B1#5D': 'sciencedirect.com',
 '/robots': 'noindex',
 '/ModDate': "D:20181029074135+05'30'",
 '/AuthoritativeDomain#5B1#5D': 'sciencedirect.com',
 '/Keywords': 'Sovereign Risk; Sovereign Default; Government Bonds',
 '/doi': '10.1016/j.jmoneco.2018.04.011',
 '/Title': 'Banks, government Bonds, and Default: What do the data Say?',
 '/AuthoritativeDomain#5B2#5D': 'elsevier.com',
 '/Producer': 'Acrobat Distiller 10.1.10 (Windows)'}

Однако я обнаружил, что библиотека PyPDF2 не есть атрибут для «доступа» к информации для /Keywords части. То есть этот бит вывода:

'/Keywords': 'Sovereign Risk; Sovereign Default; Government Bonds',

Итак, я хочу получить некоторую помощь о том, как я могу получить эту информацию о выводе метаданных [в этом примере: Sovereign Risk; Sovereign Default; Government Bonds].

Чтобы воспроизвести вывод, я делюсь ссылкой на документ

Например,

Обновление:

print(pdf_info.title)
Banks, government Bonds, and Default: What do the data Say?

print(pdf_info.subject)
Journal of Monetary Economics, 98 (2018) 98-113. doi:10.1016/j.jmoneco.2018.04.011

Но когда я пытаюсь сделать что-то подобное для части /Keywords, я получаю следующую ошибку атрибута:

pdf_info.keywords
Traceback (most recent call last):

  File "<ipython-input-295-3852401ef983>", line 1, in <module>
    pdf_info.keywords

AttributeError: 'DocumentInformation' object has no attribute 'keywords'

1 Ответ

1 голос
/ 27 января 2020

Ключ /Keywords фактически присутствует в словаре, возвращаемом getDocumentInfo, поэтому вам не нужно делать ничего особенного (кроме первого тестирования, если оно есть, или обернуть его в try, в случае, если он не присутствует в другом файле):

from PyPDF2 import PdfFileReader    
mypath = "../Downloads/banks_gov_bonds_default.pdf"
pdf_toread = PdfFileReader(open(mypath, 'rb'))
pdf_info = pdf_toread.getDocumentInfo()
if '/Keywords' in pdf_info:
    print (pdf_info['/Keywords'])

печатает

Sovereign Risk; Sovereign Default; Government Bonds

, которые действительно являются ключевыми словами в поле внутри образца PDF.

Другой вариант - добавить keywords к раскрытым свойствам PDF, отредактировав pdf.py в папке PYPDF2, в которую его поместил пункт. Вы можете найти создание title, creator, author и некоторые другие свойства в классе DocumentInformation, где-то около строки 2781 в моей версии. Создание всех этих свойств осуществляется по простой схеме, поэтому добавление одного из них не представляет никакой проблемы:

keywords = property(lambda self: self.getText("/Keywords"))
"""Read-only property accessing the document's **producer**.
If the document was converted to PDF from another format, this is
the name of the application (for example, OSX Quartz) that converted
it to PDF. Returns a unicode string (``TextStringObject``)
or ``None`` if the producer is not specified."""
keywords_raw = property(lambda self: self.get("/Keywords"))
"""The "raw" version of producer; can return a ``ByteStringObject``."""

(я добавил keywords_raw только потому, что другие свойства сделали то же самое. Я не могу все же расскажите, для чего они нужны.)

После этого ваш код на самом деле работает:

from PyPDF2 import PdfFileReader    
mypath = "../Downloads/banks_gov_bonds_default.pdf"
pdf_toread = PdfFileReader(open(mypath, 'rb'))
pdf_info = pdf_toread.getDocumentInfo()
print (pdf_info.keywords)

Результат, снова:

Sovereign Risk; Sovereign Default; Government Bonds
...