PDF-файл Dict возвращает странные символы - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать программу, которая использует pdfminer для чтения таблицы символов DnD (заполняемый PDF) и вставки вставок в словарь.После редактирования PDF и повторного запуска программы, я получаю странную последовательность символов при печати элементов словаря.Код:

from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import resolve1
import collections

filename = "Edited_CS.pdf"
fp = open(filename, 'rb')
my_dict = {}

parser = PDFParser(fp)
doc = PDFDocument(parser)
fields = resolve1(doc.catalog['AcroForm'])['Fields']

# Checks if PDF file is blank
if isinstance(fields, collections.abc.Sequence) is False:
    print("This Character Sheet is blank. Please submit a filled Character Sheet!")

else:
    for i in fields:
        field = resolve1(i)
        name, value = field.get('T'), field.get('V')
        if value is None or str(value)[2:-1] == "":
            value = "b'None'"
        my_dict[str(name)[2:-1]] = str(value)[2:-1]

    for g in list(my_dict.items()):
        print(g)

Вывод из неотредактированного файла PDF:

('ClassLevel', 'Assassin 1')
('Background', 'Lone Survivor')
('PlayerName', 'None')
('CharacterName', 'Tumas Mitshil')
('Race ', 'Human')
etc...

Вывод после его редактирования (я полностью изменил ClassLevel и т. Д. В PDF):

('ClassLevel', '\\xfe\\xff\\x00C\\x00l\\x00a\\x00s\\x00s\\x00L\\x00e\\x00v\\x00e\\x00l')
('Background', '\\xfe\\xff\\x00B\\x00a\\x00c\\x00k\\x00g\\x00r\\x00o\\x00u\\x00n\\x00d\\x00r')
('PlayerName', '\\xfe\\xff\\x00P\\x00l\\x00a\\x00y\\x00e\\x00r\\x00N\\x00a\\x00m\\x00e')
('CharacterName', '\\xfe\\xff\\x00T\\x00h\\x00o\\x00m\\x00a\\x00s')
('Race ', '\\xfe\\xff\\x00R\\x00a\\x00c\\x00e')
('Alignment', '\\xfe\\xff\\x00A\\x00l\\x00i\\x00g\\x00n\\x00m\\x00e\\x00n\\x00t')
etc...

Я знаю, что это какая-то кодировка, и несколько поисков в Google привели меня к выводу, что это кодировка UTF-8, поэтому я попытался декодировать PDF при открытии файла:

fp = open(filename, 'rb').read().decode('utf-8')

К сожалению, я столкнулся с ошибкой:

Traceback (most recent call last):
  File "main.py", line 16, in <module>
    fp = open(filename, 'rb').read().decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte

Когда я впервые сделал PDF, я использовал Adobe Acrobat.Однако я использовал Microsoft Edge для редактирования файла, что привело к проблеме, с которой я столкнулся.Вот файлы:

Исходный файл Отредактированный файл

Есть ли способ правильно декодировать это?Есть ли способ кодировать отредактированный pdf, чтобы его можно было без проблем загрузить в python?И если это закодировано, есть ли другие формы кодирования, и как бы я их расшифровал?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

После некоторых копаний я смог найти лучшее решение.Вместо того, чтобы использовать pdfminer для открытия PDF, я использовал PyPDF2.Так или иначе, он может читать любой PDF независимо от кодировки, и у него есть функция, которая может автоматически превращать заполняемые пробелы в правильный словарь.В результате получается более тонкий и чистый код:

from PyPDF2 import PdfFileReader

infile = "Edited_CS.pdf"
pdf_reader = PdfFileReader(open(infile, "rb"))

dictionary = pdf_reader.getFormTextFields()

for g in list(dictionary.items()):
    print(g)

Независимо от того, спасибо за все ваши ответы!:)

0 голосов
/ 24 сентября 2019

Вы можете решить эту проблему, используя Adobe Acrobat Reader DC для редактирования полей формы.Я отредактировал поля формы Edited_CS.pdf, используя его, и pdfminer.six возвращает ожидаемый результат.

Возможно, Microsoft Edge вызывает эту проблему.

...