后端导出PDF

本文记录了一个项目中使用Vue前端通过html2canvas截图,将base64编码传递给SpringBoot后端,利用ITEXT生成PDF的过程中遇到的问题及解决方案。包括base64 URL转义问题和html2canvas截图时表格竖线不完整的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目环境:

前端:VUE+html2canvas

后端:SpringBoot+ITEXT

之前导出pdf的功能都是在前端导出,或者在后端另外画一套模版,项目组不允许前端导出,担心兼容性问题,并且要求所见及所得,页面本身比较复杂,导致后端使用模版的话工作量会比较大。

经同事推荐使用了html2canvas,这个前台插件可以将前台页面截图,转为base64编码,将值传递到后端。

后端代码为:

传入参数:String pdfBase64Str;
//1---因为框架将请求中的字符串进行了url转义,这里要进行反转义,反转义后为正常的base64字符串
pdfBase64Str = URLDecoder.decode(pdfBase64Str);

BASE64Decoder decoder = new sun.misc.BASE64Decoder();
//将base64转义为byte串
byte[] bytes = decoder.decodeBuffer(pdfBase64Str);
//URLDecoder.decode(item);
//2---转化成图片
com.itextpdf.text.Image image = Image.getInstance(bytes);
//3---创建了一个文档对象,并设置了尺寸
Document doc = new Document(new RectangleReadOnly(png1.getWidth(),png1.getHeight()));
//pdf画的对象,将文档对象输出到返回头中
PdfWriter
        .getInstance(doc, response.getOutputStream());
doc.open();
doc.newPage();
//这里不知道有什么用,未进行测试
doc.add(new Paragraph(""));
//对齐方式
image.setAlignment(Image.MIDDLE);
//将图片写入pdf页中
doc.add(image);
doc.close();

使用过程中碰到了几个问题,网上没有明确的解答,在这里记录下踩到的坑。

一。base64被进行URL转义,项目中使用微服务架构,不同子工程中有的会自动进行转义,有的不会。因为代码是中途接手的,不知道前边的人对代码做了什么修改。

因为转义中对“+”没有进行转义,所以推测是js对参数进行了转义,没有进行抓包,但是nerwork中发送的参数没有进行转义,所以推测是tomcat进行了转义。

碰到的问题在于,自行转义时使用的是老版本的JS转义,其中“+”没有转义,而“ ”会转义成“+”,反转义的时候会导致转换出的字符串错误。

解决方案:

1.在前端通过“encodeURIComponent”组件对参数进行转义,这个组件转义的结果与java版本相同,传入参数就可以直接进行反转义。

2.属于紧急处理方案,在前台传递参数时将,base64码按位切割,后台使用数组接,这样就不会触发转义,同时因为是按位传值,接收时,可以通过数组中数据位数判断时候进行了转义,再进行反转义。

 

二。前端使用html2canvas进行截图时,这个插件对表格支持不好,会出现表格中排中的竖线不到底的情况。

解决方案是前端意外发现的,border-left:0px将边框设为0px就可以在打印中显示出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值