PDF文件到Dict返回奇怪的字符

2024-06-28 20:28:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个程序,利用pdfminer读取一个DnD字符表(filleblepdf),并把填充到字典。在编辑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...

编辑时的输出(我在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...

我知道这是某种编码,一些谷歌搜索让我相信这是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时,我使用adobeacrobat。但是,我使用了microsoftedge来编辑文件,这导致了我所面临的问题。以下是文件:

Original FileEdited File

有什么方法可以正确地解码这个吗?有没有一种方法可以对编辑过的pdf进行编码,这样就可以轻松地加载到python中?如果这是编码的,还有其他形式的编码吗?我该如何解码?你知道吗

任何帮助都将不胜感激。你知道吗


Tags: 文件inimport编辑编码pdfisvalue
2条回答

您可以通过使用adobeacrobatreaderdc编辑表单字段来解决此问题。我已经使用它编辑了Edited_CS.pdf的表单字段,并且pdfminer.6号返回预期输出。你知道吗

可能是Microsoft Edge导致了此问题。你知道吗

经过一番挖掘,我找到了更好的解决办法。我没有使用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)

不管怎样,谢谢你的回答!:)

相关问题 更多 >