我是前端使用jsPDF进行生成PDF文件,使用Base64进行加密,解密;后台进行文件流下载
1.前端使用jsPDF和html2canvas进行生成PDF文件(当然有这同样的毛病,生成时候有滚动条的情况下,内容会丢失,我这里使用的是网上很多人的一种思路,把要进行生成的标签,进行复制一份,对这个复制了的对象进行操作,就不会丢失内容了。并且,这里没有让用户在前台页面进行下载,这里是直接进行传递到后台进行后台自动下载。)
@这里主要用到了两个js,一个是html2canvas.js;一个是jsPDF.js;两个文件必须要引用
(文件可以网上自己下载,我这里也是网上随便找的,如果没找到,可以联系我,我发给你)
主要就是使用到jsPDF.output()//这个方法,进行传递后台解密,文件流下载(这里的我操作的是一个div,给div起一个id就可以了,这里还要说一下,这个背景必须要换,它默认黑色,自己试试就知道了)
function onclick()
{
var targetDom = $("#JSDDGSDAFAS_id");
var copyDom = targetDom.clone();
copyDom.addClass('super');
copyDom.width(targetDom.width() + "px");
copyDom.height(targetDom.height() + "px");
$('body').append(copyDom);
copyDom.css({ "background": "#FFFFFF" });
html2canvas(copyDom, {
allowTaint: true,
taintTest: false,
onrendered: function (canvas) {
//返回图片URL,参数:图片格式和清晰度(0-1)
var pageData = canvas.toDataURL('image/jpeg', 1.0);
//方向默认竖直,尺寸ponits,格式a4【595.28,841.89]
var pdf = new jsPDF('', 'pt', 'a4');
//需要dataUrl格式
pdf.addImage(pageData, 'JPEG', 0, 0, 595.28, 592.28 / canvas.width * canvas.height);
//pdf.save('pdf.pdf');//调用这个就是直接在前台进行下载
//去掉前面的字符串后,就是文件的加密字符串
var datauri = pdf.output('dataurlstring');
var base64 = datauri.substring(28); //然后把这个字符串送到后台解密
//移除添加的元素
$('.super').remove();
var url=""//自己的地址
$.post(url, { file: base64 }, function (returndata) {
try {
var ss = JSON.parse(returndata);
//如果想要关闭当前页,网上有很多,这里就说一下谷歌浏览器,
//谷歌浏览器比较特殊,只能把window.location.href = 'about:blank '才可以关闭
//window.open("about:blank", "_self").close();//关闭当前页
window.open(JSON.parse(ss[0]).data.url);
$('#GZSP_XS_Sure_Mask').hide();
} catch (e) {
$.messager.alert('提示', returndata, 'info');
}
});
}
});
}
2.后台这里使用的.net;不过大体思路都是一样的,用其他语言也是可以的。方法对就行
//根据前台传递过来的文件流,生成文件,这里我写的是绝对地址,文件名fileNanme自己起
FileStream writeStream = new FileStream(@"E:\bmcp\bmcpWeb\BaseJSD\JSD_PDF\" + fileName, FileMode.Create);// 文件不保存创建一个文件
string BASEFile = Request["file"];//这里获得传递过来的文件流,这个是我本地得到前台传递过来的参数方法,自己要根据实际情况进行判断
byte[] b = Convert.FromBase64String(BASEFile);//BASEFile为前台页面传递过来的数据
// Base64解码
for (int i = 0; i < b.Length; ++i)
{
// 调整异常数据
if (b[i] < 0)
{
b[i] += 32;
}
writeStream.WriteByte(b[i]);// 写入本地文件
}
//关闭流
writeStream.Close();