我正在尝试base64
编码matplotlib
生成的图并将其写入GAE的html页面。
稍后,将图表数字化
最后,使用xhtml2pdf
库将html页面转换为pdf。
如果情节由jqplot
创建,则代码效果很好。但是,一旦切换到matplotlib
,我就会遇到一个名为Incorrect padding
的错误,我不知道如何解决。感谢您的任何建议。
import matplotlib
import matplotlib.pyplot as plt
import StringIO
import urllib, base64
plt.figure(1)
plt.hist([2,3,4,5,6,7], bins=3)
fig = plt.gcf()
imgdata = StringIO.StringIO()
fig.savefig(imgdata, format='png')
imgdata.seek(0) # rewind the data
uri_1 = 'data:image/png;base64,'
uri_2 = urllib.quote(base64.b64encode(imgdata.buf))
uri_2 += "=" * ((4 - len(uri_2 ) % 4) % 4)
uri_3 = uri_1 + uri_2
uri_4 = '<img id="chart1" src = "%s"/>' % (uri_3)
var n_plot = $('img[id^="chart"]').size();
i=1;
var imgData = [];
while(i <= n_plot){
//sometimes the plots are generated under jqplot
try{
imgData.push($('#chart'+i).jqplotToImageStr({}));
i=i+1
}
// This case is generated by matplotlib
catch(e){
imgData.push($('#chart'+i).attr('src'));
i=i+1
}
}
imgData_json = JSON.stringify(imgData)
pdf = pisa.CreatePDF(imgData_json, file(filename, "wb"))
答案 0 :(得分:1)
这就是问题所在:
uri_2 += "=" * ((4 - len(uri_2 ) % 4) % 4)
为什么你认为网址需要额外的填充?如果需要,b64encode
的输出将被填充,添加额外的填充只会使解码器混淆。有些人可能会忽略额外的填充,但大多数会产生错误。
哦,而且对于数据网址,不必引用字符串 - base64不包含真正需要转义的字符。只有当您需要在常规网址中使用base64时才需要这样做,因为+
和=
会导致问题,但数据网址却不是这样。