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

时间:2019-05-21 02:07:50

标签: python string pdf binary

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

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

PDF->以字符串形式加载到程序中->存储字符串->检索字符串->另存为二进制PDF文件

例如,我有一个称为PDFfile的PDF。我想在以下地方阅读它:

datafile=open(PDFfile,'rb')
pdfdata=datafile.read()

当我阅读.read函数时,它说应该是字符串。它也没有,或者如果有的话,也将其定义为二进制文件。稍后我有两行代码将其打印出来:

print(pdfdata[:20])
print(str(pdfdata[:20]))

结果是这样的:

  

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将失败。

str(pdfdata)

我也尝试过编码和解码,但是遇到编码/解码无法处理0xc4的错误,该错误显然在二进制文件中。

最后的奇怪之处:<​​/ p>

当我存储str(pdfdata)并将其检索到'retdata'时,我从中打印出一些字节并与原始字节进行比较

print(pdfdata[:20])
print(retdata[:20])

我得到的结果完全不同

  

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和检索到的数据的字符串版本时,它们是相同的。因此字符串的存储和检索工作正常。

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

我知道我变得lo口,但是你们喜欢拥有所有信息。

1 个答案:

答案 0 :(得分:1)

好的,我知道了。关键是要在将二进制数据转换为字符串之前对其进行正确的编码。

步骤1)读入二进制数据

datafile=open(PDFfile,'rb')
pdfdatab=datafile.read()    #this is binary data
datafile.close()

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

import codecs
b64PDF = codecs.encode(pdfdatab, 'base64')

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

Sb64PDF=b64PDF.decode('utf-8')

现在可以恢复字符串了。为了找回它,您只需经历相反的过程。将存储中的字符串数据加载到字符串变量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()