Редактирование полей метаданных PDF с помощью Python3 и pdfrw - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь отредактировать поле метаданных Title в PDF-файлах, чтобы по возможности включать эквиваленты ASCII. Я использую Python3 и модуль pdfrw.

Как я могу выполнять строковые операции, которые заменяют поля метаданных?

Мой тестовый код здесь:

from pdfrw import PdfReader, PdfWriter, PdfString
import unicodedata

def edit_title_metadata(inpdf):

    trailer = PdfReader(inpdf)

    # this statement is breaking pdfrw
    trailer.Info.Title = unicode_normalize(trailer.Info.Title)

    # also have tried:
    #trailer.Info.Title = PdfString(unicode_normalize(trailer.Info.Title))

    PdfWriter("test.pdf", trailer=trailer).write()
    return

def unicode_normalize(s):
    return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')

if __name__ == "__main__":

    edit_title_metadata('Anadon-2011-Scientific Opinion on the safety e.pdf')

И трассировка:

Traceback (most recent call last):
  File "get_metadata.py", line 68, in <module>
    main()
  File "get_metadata.py", line 54, in main
    edit_title_metadata(pdf)
  File "get_metadata.py", line 11, in edit_title_metadata
    trailer.Info.Title = PdfString(unicode_normalize(trailer.Info.Title))
  File "get_metadata.py", line 18, in unicode_normalize
    return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
  File "/path_to_python/python3.7/site-packages/pdfrw/objects/pdfstring.py", line 550, in encode
    if isinstance(source, uni_type):
TypeError: isinstance() arg 2 must be a type or tuple of types

Примечания:

  • Эта проблема на GitHub может быть связана.

  • FWIW, также получая ту же ошибку с Python3.6

  • Я поделился pdf (который содержит дефисы, отличные от ascii, символ юникода \ u2010)

.

 wget https://gist.github.com/philshem/71507d4e8ecfabad252fbdf4d9f8bdd2/raw/cce346ab39dd6ecb3a718ad3f92c9f546761e87b/Anadon-2011-Scientific%2520Opinion%2520on%2520the%2520safety%2520e.pdf

1 Ответ

0 голосов
/ 21 мая 2019

Вы должны использовать метод .decode() для полей метаданных:

trailer.Info.Title = unicode_normalize(trailer.Info.Title.decode())

и полный рабочий код:

from pdfrw import PdfReader, PdfWriter, PdfReader
import unicodedata

def edit_title_metadata(inpdf):

    trailer = PdfReader(inpdf)
    trailer.Info.Title = unicode_normalize(trailer.Info.Title.decode())
    PdfWriter("test.pdf", trailer=trailer).write()
    return

def unicode_normalize(s):
    return unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')

if __name__ == "__main__":

    edit_title_metadata('Anadon-2011-Scientific Opinion on the safety e.pdf')
...