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 和检索到的数据的字符串版本时,它们是相同的。所以字符串的存储和检索工作正常。
所以我认为当我转换为字符串时会发生损坏。
我知道我有点啰嗦,但你们喜欢了解所有信息。
好的,我让这个工作了。关键是在将二进制数据转换为字符串之前对其进行正确编码。
步骤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)
| 归档时间: |
|
| 查看次数: |
10189 次 |
| 最近记录: |