我正在使用仅接受字符串的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口,但是你们喜欢拥有所有信息。
答案 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()