最近在搞毕设,遇到一个问题,纪念踩坑两天。。。
需求:前端Vue使用jsPDF生成一个PDF文件,在不经过用户操作的情况下直接上传服务器保存。
坑:
必须用字节流传输,否则汉字图片无法显示。字节流与字符流的区别见我之前的博客。
先上端代码
finalSub(){
this.pdf = new jsPDF("", "pt", "a4");
// fonts support
this.pdf.addFileToVFS("font.ttf", font);
this.pdf.addFont("font.ttf", "ali", "normal");
this.pdf.addFont("font.ttf", "ali", "bold");
this.pdf.setFont("ali");
var datauri = this.pdf.output('dataurlstring');
var base64 = datauri.split("base64,")[1];
var data={'data':base64};
finalSave(data)
.then(res=>{
if(res.data.code==0){
alert("本年度报告存档成功");
}else{
alert("存档失败");
}).catch(err=>{
alert(res.data.message);
值得注意的是,网上很多代码里面对于base64的字符串获取方法都是pdf.output("dataurlstring").substring(28);,这个是有问题的,很多时候对于我们个人来讲base64加密子串未必从28开始,比如我的就是从51开始,所以采用分割字符串的形式比较稳妥。
另外jsPDF提供的方法output可以输出不同的信息,此处参数为dataURLstring含义是将pdf文件的信息以url字符串的形式输出,将这个字符串传到后端即可。
@PostMapping("finalSave")
public JsonResult finalSave(@RequestBody HashMap<String, String> u){
BufferedOutputStream bos=null;
try {
Date date = new Date(); // 创建日期格式化对象,在获取格式化对象时可以指定风格
DateFormat df = new SimpleDateFormat("yyyy");
String str = df.format(date);
File f =new File(str+".pdf");
if(!f.exists()){
f.createNewFile();
bos = new BufferedOutputStream(new FileOutputStream(f));
byte[] b = Base64.getDecoder().decode(u.get("data"));
bos.write(b);
} catch (IOException e) {
e.printStackTrace();
return new JsonResult(ResultCode.FALSE,true);
}finally {
try {
bos.flush();
bos.close();
} catch (IOException e) {
e.printStackTrace();
return new JsonResult(ResultCode.SUCCESS,true);
测试满足需求。
最近在搞毕设,遇到一个问题,纪念踩坑两天。。。需求:前端Vue使用jsPDF生成一个PDF文件,在不经过用户操作的情况下直接上传服务器保存。坑:必须用字节流传输,否则汉字图片无法显示。字节流与字符流的区别见我之前的博客。先上端代码finalSub(){ this.pdf = new jsPDF("", "pt", "a4"); // fon...
* @param html { String } DOM树
* @param isOne { Boolean } 是否为单页 默认 否(false)
* @return 文件 {pdf格式}
setPrint(html,isOne) {
let html = document.getElementById("doa_print_pdf_content
这里代码引入了html2canvas和jspdf
//需要 npm i html2Canvas 和 npm i jspdf
在这里将getPdf 这个函数挂载到Vue的原型上,最后return一个promise对象(包含了resolve的base64Pdf,以便于处理),在局部组件内可进行.then以进行上传后端等操作。
插件代码如下
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
利用jsPDF把图片转成pdf格式保存本地
参考地址:jsPDF:https://rawgit.com/MrRio/jsPDF/master/docs/jsPDF.html
利用jsPDF吧图片转成pdf:
Npm install jsPDF
引入jsPDF
import {jsPDF} from ‘jspdf’
const recordPdf = new jsPDF('p','cm','a4')
result.forEach( (item,index)=>{
jspdf中有一个方法 将pdf转base64
var buffer = PDF.output("datauristring");// 转base64
var myfile = dataURLtoFile(buffer, title) //转文件
var formdata = new FormData()
formdata.append('file', myfile)
如果...
output在新的窗口显示在本页面插入文件名称设置
使用jspdf生成的pdf文档,网上一般都是如何下载到本地中,使用save()方法,但是现在并不想下载,而是直接显示在页面中。
output
查找了官方文档,发现可以使用output方法:
output(type, options) → {string|window|ArrayBuffer|Blob|jsPDF|null|undefined}
源码: jspdf.js, line 3010
生成PDF文档。
若类型参数未定义,则输出是以字符串作为.
最近在公司里实习作项目,项目中有一个优化需求,就是将指定的jsp页面导出为pdf文件输出。因为之前从未了解过相关方面只知识,所以在查了一番资料后,发现大家写的都很散,不是很清楚,甚至有的代码执行不出来,不能输出。总之,遇见了各种各样的问题。
在查资料的过程中,我看到了两种较为常用的方法,就是itext和jspdf。但是博主对itext没有怎么研究,主要是因为似乎比较复杂,没怎么看。相对来说,js...
function createPDFObject(imgData) {
//默认a4纸张
$("#containerHtml").css("margin-top","100px");
var doc = new jsPDF('p', 'pt',"a4");
var pdfTitle = "{{ sur...
Selective Cross-City Transfer Learning for Traffic Prediction via Source City Region Re-Weighting笔记
GISer_study:
java eclipse 提示 用户“sa”登录失败的一种解决办法
m0_66120999:
JSPDF生成文件直接上传服务器保存
汇编语言ASSUME ,Missing or unreachable CS
Masob:
使用Ewomail开源版搭建自己的邮箱服务器
xiao485:
Selective Cross-City Transfer Learning for Traffic Prediction via Source City Region Re-Weighting笔记
Strassen矩阵乘法
Selective Cross-City Transfer Learning for Traffic Prediction via Source City Region Re-Weighting笔记
Strassen矩阵乘法