网页转长图插件html2canvas【前端】

2024-05-11 19:04

本文主要是介绍网页转长图插件html2canvas【前端】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网页转长图插件html2canvas【前端】

  • 前言
  • 版权
  • 推荐
  • 网页转长图插件html2canvas【前端】
    • wkImageStorage
    • 流程
    • 使用
    • 后端
      • application.properties
      • WkConfig
      • ShareController
      • ImageCleanupTask
    • 前端
      • html2canvas.js
      • share.html
      • share.js
      • getShare.js
      • getShare.html
  • 最后

前言

2024-5-10 18:00:10

以下内容源自《【前端】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://jsss-1.blog.csdn.net
禁止其他平台发布时删除以上此话

推荐

网页转长图插件html2canvas【前端】

wkImageStorage

wkhtmltoimage 不能导出动态数据
在这里插入图片描述

流程

要实现网页转长图的功能,可以使用以下步骤和技术:

  1. 前端部分:
  • 创建一个按钮或链接,触发网页转长图的操作。
  • 使用 HTML2Canvas 库将当前网页内容转换为 canvas 元素。
  • 将 canvas 元素转换为图片,并拼接成长图。
  1. 后端部分:
  • 前端通过 AJAX 将转换后的图片数据发送到后端。
  • 后端接收到图片数据后保存为图片文件。
  1. 完整步骤:
  • 用户点击网页上的按钮触发网页转长图的操作。
  • 前端使用 HTML2Canvas 将当前网页内容转换为 canvas 元素。
  • 前端将 canvas 元素转换为图片数据。
  • 前端通过 AJAX 将图片数据发送到后端。
  • 后端接收到图片数据后保存为图片文件。
  • 后端返回图片文件的 URL 给前端。
  • 前端显示长图或提供下载链接给用户。
  1. 注意事项:
  • 转换过程可能会涉及到跨域问题,需要确保前后端的跨域设置正确。
  • HTML2Canvas 库的使用需要注意性能,避免转换过程过慢或耗时过长。
  • 图片文件的存储位置和命名需要考虑安全性和可维护性。

以上是设计网页转长图功能的一般步骤,具体实现过程可能会根据项目需求和技术栈有所不同。希望这些信息对你有帮助,如果有任何问题或需要进一步的指导,请随时告诉我。

使用

html2canvas使用教程

html2canvas快速使用

后端

application.properties

wk.image.storage=d:/eldhealth-work/data/wk-images
wk.image.max_storage_size=524288000

WkConfig

package com.jsss.configuration;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.io.File;@Configuration
public class WkConfig {private static final Logger logger = LoggerFactory.getLogger(WkConfig.class);@Value("${wk.image.storage}")private String wkImageStorage;@PostConstructpublic void init() {// 创建WK图片目录File file = new File(wkImageStorage);if (!file.exists()) {file.mkdir();logger.info("创建WK图片目录: " + wkImageStorage);}}}

ShareController

package com.jsss.share.controller;import com.jsss.common.BusinessException;
import com.jsss.common.ErrorCode;
import com.jsss.common.ResponseModel;
import com.jsss.common.Toolbox;
import com.jsss.utils.Constant;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletResponse;
import java.io.*;@Controller
@CrossOrigin(origins = "${jsss.web.path}", allowedHeaders = "*", allowCredentials = "true")
public class ShareController implements Constant, ErrorCode {private static final Logger logger = LoggerFactory.getLogger(ShareController.class);@Value("${jsss.web.path}")private String domain;@Value("${server.servlet.context-path}")private String contextPath;@Value("${wk.image.storage}")private String wkImageStorage;@PostMapping("/uploadImage")@ResponseBodypublic ResponseModel uploadImage(String token,String imageData) {// 截取 base64 编码的部分String base64Data = imageData.substring(imageData.indexOf(",") + 1);// 解码Base64字符串为字节数组byte[] imageBytes = Base64Utils.decodeFromString(base64Data);// 文件名String fileName = Toolbox.getRandomString();// 保存字节数组为图片文件String imagePath = wkImageStorage + "/" +  fileName+ ".png";try (FileOutputStream fos = new FileOutputStream(imagePath)) {fos.write(imageBytes);} catch (IOException e) {e.printStackTrace();return new ResponseModel("Error saving image");}return new ResponseModel(fileName);}// 获取长图@RequestMapping(path = "/share/image/{fileName}", method = RequestMethod.GET)@ResponseBodypublic void getShareImage(@PathVariable("fileName") String fileName, HttpServletResponse response) {if (StringUtils.isBlank(fileName)) {throw new BusinessException(PARAMETER_ERROR,"文件名不能为空!");}File file = new File(wkImageStorage + "/" + fileName + ".png");if (!file.exists()) {throw new BusinessException(PARAMETER_ERROR,"文件不存在!");}response.setContentType("image/png");try {OutputStream os = response.getOutputStream();FileInputStream fis = new FileInputStream(file);byte[] buffer = new byte[1024];int b = 0;while ((b = fis.read(buffer)) != -1) {os.write(buffer, 0, b);}} catch (IOException e) {logger.error("获取长图失败: " + e.getMessage());}}}

ImageCleanupTask

package com.jsss.share.component;import com.jsss.share.controller.ShareController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Arrays;
import java.util.Date;@Component
public class ImageCleanupTask {private static final Logger logger = LoggerFactory.getLogger(ShareController.class);@Value("${wk.image.storage}")String DIRECTORY_PATH;@Value("${wk.image.max_storage_size}")long MAX_STORAGE_SIZE;@Scheduled(cron = "0 0 0 * * *") // 每天凌晨执行public void cleanupImages() {File directory = new File(DIRECTORY_PATH);if (!directory.exists()) {return; // 目录不存在,直接返回}long totalSize = 0;File[] files = directory.listFiles();if (files == null) {return; // 目录为空,直接返回}// 按文件最后修改时间从大到小排序Arrays.sort(files, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified()));for (File file : files) {long fileSize = file.length();totalSize += fileSize;Date currentDate = new Date();Date fileDate = new Date(file.lastModified());boolean isBeforeToday = fileDate.before(currentDate);if (isBeforeToday || totalSize > MAX_STORAGE_SIZE) {file.delete();logger.info("删除图片: " + file.getName());}}}
}

前端

html2canvas.js

下载插件

npm install --save html2canvas

找到这个js,引入到项目中

share.html

测试页面

可以利用js把导出按钮添加到所有页面

$(document).ready(function() {// 创建要添加的<div>元素var content =<div class="nav navbar-nav navbar-right" id="share" style="padding; margin-right: 20px;"><button id="convertButton">导出</button></div>`;$(".container-fluid").append(content);});
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>老年人健康管理</title><link rel="icon" href="#"><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="./css/common.css"></head><body><nav class="navbar navbar-default"><div class="container-fluid"><div class="navbar-header"><a class="navbar-brand" href="#" target="_blank">老年人健康管理</a></div><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><li><a href="home.html">首页</a></li><li><a href="register.html">个人注册</a></li><li class="active"><a href="javascript:void(0);">账户登录 <span class="sr-only">(current)</span></a></li></ul></div></div></nav><div class="container"><button id="convertButton">导出</button></div></body><script src="./bootstrap/js/jquery-3.5.1.min.js"></script><script src="./bootstrap/js/bootstrap.min.js"></script><script src="./js/common.js"></script><script src="./js/user.js"></script><script src="./share/js/html2canvas.js"></script><script src="./share/js/share.js"></script></html>

share.js

// 绑定按钮点击事件
$(document).ready(function () {// 分享单击事件$("#convertButton").click(function (e) { share(e);});
});function share() {// 使用 HTML2Canvas 将当前网页内容转换为 canvas 元素html2canvas(document.documentElement).then(function(canvas) {// 将 canvas 转换为图片var imgData = canvas.toDataURL('image/png');$.ajax({type: 'POST',url: SERVER_PATH + "/uploadImage",data: {imageData: imgData},success: function(result) {var fileName = result.data;// 在新建标签页中打开 getShare 页面并传递文件名作为参数window.open('http://127.0.0.1:5500/getShare.html?fileName=' + fileName, '_blank');}});});
}

getShare.js

$(document).ready(function () {var fileName=$.getUrlParam("fileName");if(!fileName){false;}getShare(fileName);
});function getShare(fileName){var imageUrl = SERVER_PATH + "/share/image/"+fileName;console.log(imageUrl);// 显示长图var imgElement = document.createElement('img');imgElement.style.width = '100%';imgElement.style.height = '100%';imgElement.src = imageUrl;document.body.appendChild(imgElement);// 提供下载链接给用户// var downloadLink = document.createElement('a');// downloadLink.href = imageUrl;// downloadLink.download = 'image_file.jpg';// downloadLink.innerHTML = '下载图片';// document.body.appendChild(downloadLink);}

getShare.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>老年人健康管理</title><link rel="icon" href="#"><link rel="stylesheet" href="./bootstrap/css/bootstrap.min.css"><link rel="stylesheet" href="./css/common.css"></head><body></body><script src="./bootstrap/js/jquery-3.5.1.min.js"></script><script src="./bootstrap/js/bootstrap.min.js"></script><script src="./js/common.js"></script><script src="./js/user.js"></script><script src="./share/js/getShare.js"></script></html>

最后

2024-5-10 18:00:23

迎着日光月光星光,直面风霜雨霜雪霜。

这篇关于网页转长图插件html2canvas【前端】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980393

相关文章

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

禁止HTML页面滚动的操作方法

《禁止HTML页面滚动的操作方法》:本文主要介绍了三种禁止HTML页面滚动的方法:通过CSS的overflow属性、使用JavaScript的滚动事件监听器以及使用CSS的position:fixed属性,每种方法都有其适用场景和优缺点,详细内容请阅读本文,希望能对你有所帮助... 在前端开发中,禁止htm

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring