在 python 中将 PDF 文件(或任何二进制文件)转换为字符串(不是从 pdf 中抓取文本)

Sha*_*dor 2 python pdf string binary

我正在使用只接受字符串的 api。它的目的是存储东西。我希望能够读取二进制文件,将二进制数据转换为字符串,然后存储该字符串。然后我想检索字符串,转换回二进制文件,然后保存文件。

所以我想做的是(在Python中):

PDF -> 作为字符串加载到程序中 -> 存储字符串 -> 检索字符串 -> 保存为二进制 PDF 文件

例如,我有一个名为 PDFfile 的 PDF。我想阅读它:

datafile=open(PDFfile,'rb')
pdfdata=datafile.read()
Run Code Online (Sandbox Code Playgroud)

当我阅读 .read 函数时,它说它应该产生一个字符串。它没有,或者如果有,它也采用将其定义为二进制的部分。我稍后有两行代码将其打印出来:

print(pdfdata[:20])
print(str(pdfdata[:20]))
Run Code Online (Sandbox Code Playgroud)

结果是这样的:

b'%PDF-1.3\n%\xc4\xe5\xf2\xe5\xeb\xa7\xf3\xa0\xd0\xc4'
b'%PDF-1.3\n%\xc4\xe5\xf2\xe5\xeb\ xa7\xf3\xa0\xd0\xc4'

对我来说,这些看起来像是 2 个字节类型,但显然,第二个是一个字符串。当我这样做时,type(pdfdata)我会得到字节。

我正在努力尝试获取代表 PDF 文件的干净字符串,然后将其转换回字节格式。如果我在未对其进行字符串化的情况下发送该 API,则该 API 会失败。

str(pdfdata)
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用编码和解码,但出现编码/解码无法处理 0xc4 的错误,这显然位于二进制文件中。

最后的奇怪之处:

当我存储 str(pdfdata) 并将其检索到“retdata”时,我会打印一些字节并与原始数据进行比较

print(pdfdata[:20])
print(retdata[:20])
Run Code Online (Sandbox Code Playgroud)

我得到了非常不同的结果

b'%PDF-1.3\n%\xc4\xe5\xf2\xe5\xeb\xa7\xf3\xa0\xd0\xc4'
b'%PDF-1.3\n%\xc4\xe

但如果我显示 retdata 的 50 个字符,数据就在那里

b'%PDF-1.3\n%\xc4\xe5\xf2\xe5\xeb\xa7\xf3\xa0\xd0\

不用说,当我检索数据并将其存储为 pdf 时,它已损坏并且无法工作。

当我保存字符串化的 pdf 和检索到的数据的字符串版本时,它们是相同的。所以字符串的存储和检索工作正常。

所以我认为当我转换为字符串时会发生损坏。

我知道我有点啰嗦,但你们喜欢了解所有信息。

Sha*_*dor 7

好的,我让这个工作了。关键是在将二进制数据转换为字符串之前对其进行正确编码。

步骤1)读入二进制数据

datafile=open(PDFfile,'rb')
pdfdatab=datafile.read()    #this is binary data
datafile.close()
Run Code Online (Sandbox Code Playgroud)

步骤2)将数据编码为字节数组

import codecs
b64PDF = codecs.encode(pdfdatab, 'base64')
Run Code Online (Sandbox Code Playgroud)

步骤3)将字节数组转换为字符串

Sb64PDF=b64PDF.decode('utf-8')
Run Code Online (Sandbox Code Playgroud)

现在可以恢复字符串了。要取回它,您只需执行相反的操作即可。将字符串数据从存储加载到字符串变量 retdata 中。

#so we have a string and want it to be bytes
bretdata=retdata.encode('utf-8')

#now lets get it back into the binary file format
bPDFout=codecs.decode(bretdata, 'base64')

#open a new file and put defragments data into it!
datafile=open(newPDFFile,'wb')
datafile.write(bPDFout)
datafile.close()
Run Code Online (Sandbox Code Playgroud)