繁体   English   中英

如何解码<class 'bytes'> PDF 文件与 Python</class>

[英]How to decode <class 'bytes'> PDF file with Python

我想在不使用任何库的情况下从 PDF url 中提取数据。 我有解码问题,这是我的代码:

import requests

link = 'https://www.heimberg.ch/fileadmin/user_upload/u_Protokoll_GV_07.12.2021.pdf'

response = requests.get(link)
print(response, type(response))  #<Response [200]> <class 'requests.models.Response'>

data = response.content
print(type(data)) #<class 'bytes'>

print(data)

这是回复内容(太大了,只贴了一部分):

b'%PDF-1.4\n%\xe2\xe3\xcf\xd3\r\n1 0 obj\n<< \n/Creator (Canon iR-ADV C5760  PDF)\n/CreationDate (D:20220127150550+01\'00\')\n/Producer (\\376\\377\\000A\\000d\\000o\\000b\\000e\\000 \\000P\\000S\\000L\\000 \\0001\\000.\\000\\\n3\\000e\\000 \\000f\\000o\\000r\\000 \\000C\\000a\\000n\\000o\\000n\\000\\000)\n>> \nendobj\n2 0 obj\n<< \n/Pages 3 0 R \n/Type /Catalog \n/OutputIntents 13 0 R \n/Metadata 14 0 R \n>> \nendobj\n4 0 obj\n<< /Type /XObject /Subtype /Image /Width 1240 /Height 1753 /BitsPerComponent 8 \n/ColorSpace /DeviceGray /Filter [ /FlateDecode /DCTDecode ] /Length 7753 >> \nstream\r\nx\x01\xed]\t\\TU\xdb\x1f\xdc\x97,\xcd\xa1\xb2pI\x19e\xa4\xf1\xcd\x05R\xd4\xcc\xe5\xaa3\x846\x83\x86\xa2\x92\xbb\x02\x82+\xa1\x14\xee\x9aM\x9a2\x0e\x98"j\xc3\xaa\x16\xbc\xe8\xb8\xe0\xd6\xeb\x82\x92J\x06*"\xa6\xe6\x9a\xa2\x98\x0bh\xa2\xc2\xf7\x7f\xce\x9d\x9d\x81\xd8\xfd\xbe\xef-\xcf\xef.\xe7\xde{\x9e\xe5<\xfb9C\x85\x99\x85\xbf\x0b\x1a\xcb\xfaK\xfb\x0blj\xd8\x08\xc2\xf0OPX x\xad\xef\x18

我尝试了不同类型的编码,但我认为问题出在混合编码上,或者我错了?

我也试过这个:

print(BytesIO(data)) # <_io.BytesIO object at 0x7fb740760c20>
for i in BytesIO(data):
    print(i)

我得到了这样的回应(逐行):

b'%PDF-1.4\n'
b'%\xe2\xe3\xcf\xd3\r\n'
b'1 0 obj\n'
b'<< \n'
b'/Creator (Canon iR-ADV C5760  PDF)\n'
b"/CreationDate (D:20220127150550+01'00')\n"
b'/Producer (\\376\\377\\000A\\000d\\000o\\000b\\000e\\000 \\000P\\000S\\000L\\000 \\0001\\000.\\000\\\n'
b'3\\000e\\000 \\000f\\000o\\000r\\000 \\000C\\000a\\000n\\000o\\000n\\000\\000)\n'
b'>> \n'
b'endobj\n'
b'2 0 obj\n'
b'<< \n'
b'/Pages 3 0 R \n'
b'/Type /Catalog \n'
b'/OutputIntents 13 0 R \n'
b'/Metadata 14 0 R \n'
b'>> \n'
b'endobj\n'
b'4 0 obj\n'
b'<< /Type /XObject /Subtype /Image /Width 1240 /Height 1753 /BitsPerComponent 8 \n'
b'/ColorSpace /DeviceGray /Filter [ /FlateDecode /DCTDecode ] /Length 7753 >> \n'
b'stream\r\n'
b'x\x01\xed]\t\\TU\xdb\x1f\xdc\x97,\xcd\xa1\xb2pI\x19e\xa4\xf1\xcd\x05R\xd4\xcc\xe5\xaa3\x846\x83\x86\xa2\x92\xbb\x02\x82+\xa1\x14\xee\x9aM\x9a2\x0e\x98"j\xc3\xaa\x16\xbc\xe8\xb8\xe0\xd6\xeb\x82\x92J\x06*"\xa6\xe6\x9a\xa2\x98\x0bh\xa2\xc2\xf7\x7f\xce\x9d\x9d\x81\xd8\xfd\xbe\xef-\xcf\xef.\xe7\xde{\x9e\xe5<\xfb9C\x85\x99\x85\xbf\x0b\x1a\xcb\xfaK\xfb\x0blj\xd8\x08\xc2\xf0OPX x\xad\xef\x18\xff\xa9\xfe\xad\xa4\xfe\xe3\x04\xf8\xaf\xf0\x82\xa0\xaf\xa0\xd6;\xef\xb4z\xa7\x95}\xabV\xf6\xce\x8e\xf6

……

我怎样才能得到文本而不是上面的字符?

当你有一个 Binary.PDF 时,它主要由多个对象组成,许多对象可以对不同部分有自己的编码,因此没有单一编码,它可能是十六进制或平面或 zip 或......和部分是乱序的,看看左边的 2 和 4 之间有什么差距,所以第一步是尝试将它们合理化为右边的更少格式。但是我们会发现这不会使任务变得更容易。

在此处输入图像描述

我们可以看到这个文件被严重压缩并且依赖于图像,所以扩展没有太大帮助。 如果我们简单地复制或导出文本,我们就能确切地看到原因。 它立即变得清晰,它是图像加上 OCR,而 OCR 有很多缺陷,而不是拼写检查,重新开始可能更好。

在此处输入图像描述

对于初始质量测试,我建议您简单地复制和粘贴,这会让您感觉到什么可能是最好的结果。

虽然控制台上的命令行 output 有其自身的编码问题,但文本文件的相同 output 不需要解码。 我在 Win7x32 上使用 Xpdf 4.03 进行测试,但大多数 64 位 Python 应该有 PDFtoTEXT poppler 版本 2022.02 或更早版本。

如果我们直观地查看文本的构造,我们还可以看到如果将其提取为顺序文本块将如何导致问题,因为通常 OCR 会将行流分成许多部分。

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM