Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PDF文件到Dict返回奇怪的字符_Python_Python 3.x_Pdf_Pdfminer - Fatal编程技术网

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

Python PDF文件到Dict返回奇怪的字符,python,python-3.x,pdf,pdfminer,Python,Python 3.x,Pdf,Pdfminer,我试图创建一个程序,利用pdfminer读取DnD字符表(可填充PDF),并将填充内容放入字典。在编辑PDF并再次运行程序后,我在打印字典项时得到一个奇怪的字符序列。守则: 从pdfminer.pdfparser导入pdfparser 从pdfminer.pdfdocument导入pdfdocument 从pdfminer.pdftypes导入解析1 导入集合 filename=“Edited_CS.pdf” fp=打开(文件名为“rb”) 我的字典={} 解析器=PDFParser(fp) d

我试图创建一个程序,利用pdfminer读取DnD字符表(可填充PDF),并将填充内容放入字典。在编辑PDF并再次运行程序后,我在打印字典项时得到一个奇怪的字符序列。守则:

从pdfminer.pdfparser导入pdfparser
从pdfminer.pdfdocument导入pdfdocument
从pdfminer.pdftypes导入解析1
导入集合
filename=“Edited_CS.pdf”
fp=打开(文件名为“rb”)
我的字典={}
解析器=PDFParser(fp)
doc=PDFDocument(解析器)
fields=resolve1(doc.catalog['AcroForm'])['fields']
#检查PDF文件是否为空
如果isinstance(字段、集合.abc.Sequence)为False:
打印(“此字符表为空白。请提交已填写的字符表!”)
其他:
对于字段中的i:
字段=解析1(i)
name,value=field.get('T'),field.get('V'))
如果值为None或str(值)[2:-1]==”:
value=“b'None”
我的名字[str(name)[2:-1]]=str(value)[2:-1]
对于列表中的g(my_dict.items()):
印刷品(g)
未编辑PDF文件的输出:

('ClassLevel','sugger 1')
(‘背景’、‘孤独幸存者’)
(‘PlayerName’、‘None’)
('CharacterName','Tumas Mitshil')
(‘种族’、‘人类’)
等
编辑时的输出(我在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')
等
我知道这是某种编码,一些谷歌搜索让我相信这是UTF-8编码,所以我在打开文件时尝试解码PDF:

fp=open(文件名'rb').read().decode('utf-8'))
不幸的是,我遇到了一个错误:

回溯(最近一次呼叫最后一次):
文件“main.py”,第16行,在
fp=open(文件名为'rb').read().decode('utf-8'))
UnicodeDecodeError:“utf-8”编解码器无法解码位置10中的字节0xe2:无效的连续字节
当我第一次制作PDF时,我使用了AdobeAcrobat。但是,我使用了Microsoft Edge来编辑该文件,这导致了我面临的问题。以下是文件:

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


非常感谢您的帮助。

您可以使用Adobe Acrobat Reader DC编辑表单字段来解决此问题。我已经使用它编辑了edited_CS.pdf的表单字段,pdfminer.six返回了预期的输出


可能是Microsoft Edge导致了此问题

经过一番挖掘,我找到了一个更好的解决办法。我没有使用pdfminer打开PDF,而是使用PyPDF2。不知何故,它可以读取任何PDF而不考虑编码,并且它有一个功能,可以自动将可填充的空格转换为适当的字典。结果是生成更精细、更清晰的代码:

从PyPDF2导入PdfileReader
infle=“已编辑的_CS.pdf”
pdf_reader=PdfFileReader(打开(填充“rb”))
dictionary=pdf\u reader.getFormTextFields()
对于列表中的g(dictionary.items()):
印刷品(g)

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

它是带有前导BOM的UTF-16。正如@mkl所说,该字段的值是一个以字节顺序标记()开头的unicode字符串。如果你使用
value[2:].decode()
你可以看到你想要的文本,与
\x00
交织在一起。如果我重新使用我以前的方法,我一定会尝试一下:)非常正确,但我希望它能够接受任何应用程序保存的任何PDF,因此我需要对它进行正确的解码。然而,我能够解决我的问题。我很好奇PyPDF2和pdfminer有什么不同!我在pdfminer github上创建了一个问题来解决这个问题。