【JavaScript】实现页面中填写文档、电子签名,填写完后 转为pdf并自动下载;附带psd转图片预览效果

news2024/12/28 18:47:30

效果图:

需求:

 用户可以在线进行文档编辑,在线电子签名,然后点击可以另存为pdf文档

实现:

首先实现布局

让填写文档 随着页面的变化 一直保持居中

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            display: flex;
            justify-content: center;
        }

        .bgImg {
            background-image: url("./2.jpg");
            background-size: contain;
            height: 1562px;
            background-repeat: no-repeat;
            width: 1110px;
            position: relative;
        }

        input {
            display: inline-block;
            height: 35px;
            width: 135px;
            background-color: #ffffff00;
            border: none;
            outline: none;
        }

        .input1 {
            position: absolute;
            top: 162px;
            left: 191px;
            width: 580px;
            height: 28px;
        }

        .input2 {
            position: absolute;
            top: 207px;
            left: 277px;
            width: 520px;
            height: 28px;
        }

        .input3 {
            position: absolute;
            top: 258px;
            left: 235px;
            width: 545px;
            height: 28px;
        }

        .input4 {
            position: absolute;
            top: 305px;
            left: 328px;
            width: 135px;
            height: 28px;
        }
    </style>
</head>

<body>
    <div class="content" style="visibility:hidden;">
        <div id="customDiv">
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
        </div>

        <span id="submit">提交</span>
    </div>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        $(window, document).on('resize', function () {
            resizeCenterBak();
        }).on('load', function () {
            resizeCenterBak();
            $('.content').css('visibility', 'visible');
        });
        function resizeCenterBak() {
            $('body').css({
                width: "1920px",
                height: "1080px"
            });
            var ratioX = $(window).width() / $('body').width();
            var ratioY = $(window).height() / $('body').height();
            var ratio = Math.min(ratioX, ratioY);
            $('body').css({
                transform: "scale(" + ratio + ")",
                transformOrigin: "left top",
                marginLeft: ($(window).width() - $('body').width() * ratio) / 2
            });
        }
    </script>
</body>

</html>

内容转为图片

然后将填写好的内容  一切进行截图

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            display: flex;
            justify-content: center;
        }

        .bgImg {
            background-image: url("./2.jpg");
            background-size: contain;
            height: 1562px;
            background-repeat: no-repeat;
            width: 1110px;
            position: relative;
        }

        input {
            display: inline-block;
            height: 35px;
            width: 135px;
            background-color: #ffffff00;
            border: none;
            outline: none;
        }

        .input1 {
            position: absolute;
            top: 162px;
            left: 191px;
            width: 580px;
            height: 28px;
        }

        .input2 {
            position: absolute;
            top: 207px;
            left: 277px;
            width: 520px;
            height: 28px;
        }

        .input3 {
            position: absolute;
            top: 258px;
            left: 235px;
            width: 545px;
            height: 28px;
        }

        .input4 {
            position: absolute;
            top: 305px;
            left: 328px;
            width: 135px;
            height: 28px;
        }
    </style>
</head>

<body>
    <div class="content" style="visibility:hidden;">
        <div id="customDiv">
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
        </div>

        <span id="submit">提交</span>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.0/html2canvas.min.js"></script>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        $(window, document).on('resize', function () {
            resizeCenterBak();
        }).on('load', function () {
            resizeCenterBak();
            $('.content').css('visibility', 'visible');
        });
        function resizeCenterBak() {
            $('body').css({
                width: "1920px",
                height: "1080px"
            });
            var ratioX = $(window).width() / $('body').width();
            var ratioY = $(window).height() / $('body').height();
            var ratio = Math.min(ratioX, ratioY);
            $('body').css({
                transform: "scale(" + ratio + ")",
                transformOrigin: "left top",
                marginLeft: ($(window).width() - $('body').width() * ratio) / 2
            });
        }
        $("#submit").click(function () {
            var targetDiv = document.getElementById("customDiv");
            var divRect = targetDiv.getBoundingClientRect();

            // 获取缩放倍数
            var Scale = 760 / divRect.width;
            targetDiv.style.transform = "scale(" + Scale + ")";

            var contentWidth = Scale * divRect.width
            var contentHeight = Scale * divRect.height
            var c = document.createElement('canvas');
            c.width = contentWidth * 1;
            c.height = contentHeight * 1;

            var opts = {
                scale: 1,
                canvas: c,
                useCORS: true,
                logging: true
            };

            var printWindow = window.open("", "_blank");
            
            html2canvas(targetDiv, opts).then(function (canvas) {
                var imageData = canvas.toDataURL(); // 获取截图数据
                var imageElement = new Image();
                imageElement.src = imageData;

                printWindow.document.write('<html><head>');
                printWindow.document.write('<title>打印</title>');
                printWindow.document.write('</head><body>');
                printWindow.document.write(imageElement.outerHTML); // 将截图添加到新窗口
                printWindow.document.write('<//body><//html>');
                printWindow.document.close();
            });
        });
    </script>
</body>

</html>
补充说明:
html2canvas是什么

html2canvas 是一个 JavaScript 库,用于将当前页面或指定的 HTML 元素转换为 <canvas> 元素

主要作用是实现将 HTML 元素转换为图像的功能,这样你就可以在网页上进行截图、生成缩略图、保存网页内容为图像等操作

电子签名

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        body {
            display: flex;
            flex-direction: column;
            align-items: center;
        }
    </style>
</head>

<body>
    <canvas></canvas>
    <div class="content">
        <button onclick="cancel()">取消</button>
        <button onclick="save()">保存</button>
    </div>
</body>
<script src="https://code.jquery.com/jquery-3.6.0.js" type="text/javascript"></script>
<script>
    const config = {
        width: 600, // 宽度
        height: 400, // 高度
        lineWidth: 6, // 线宽
        strokeStyle: 'red', // 线条颜色
        lineCap: 'round', // 设置线条两端圆角
        lineJoin: 'round', // 线条交汇处圆角
    }

    const canvas = document.querySelector('canvas')
    canvas.width = config.width
    canvas.height = config.height
    canvas.style.border = '1px solid #000'
    const ctx = canvas.getContext('2d')
    var element;

    // 设置填充背景色
    ctx.fillStyle = '#fff'
    // 绘制填充矩形
    ctx.fillRect(
        0, // x 轴起始绘制位置
        0, // y 轴起始绘制位置
        config.width, // 宽度
        config.height // 高度
    );

    // 保存上次绘制的 坐标及偏移量
    const client = {
        offsetX: 0, // 偏移量
        offsetY: 0,
        endX: 0, // 坐标
        endY: 0
    }

    // 判断是否为移动端
    const mobileStatus = (/Mobile|Android|iPhone/i.test(navigator.userAgent))

    // 初始化
    const init = event => {
        // 获取偏移量及坐标
        const { offsetX, offsetY, pageX, pageY } = mobileStatus ? event.changedTouches[0] : event

        // 修改上次的偏移量及坐标
        client.offsetX = offsetX
        client.offsetY = offsetY
        client.endX = pageX
        client.endY = pageY

        // 清除以上一次 beginPath 之后的所有路径,进行绘制
        ctx.beginPath()
        // 根据配置文件设置相应配置
        ctx.lineWidth = config.lineWidth
        ctx.strokeStyle = config.strokeStyle
        ctx.lineCap = config.lineCap
        ctx.lineJoin = config.lineJoin
        // 设置画线起始点位
        // client.endX - canvas.offsetLeft, client.endY - canvas.offsetTop
        ctx.moveTo(client.endX - canvas.offsetLeft, client.endY - canvas.offsetTop)
        // 监听 鼠标移动或手势移动
        window.addEventListener(mobileStatus ? "touchmove" : "mousemove", draw)
    }
    // 绘制
    const draw = event => {
        // 获取当前坐标点位
        const { pageX, pageY } = mobileStatus ? event.changedTouches[0] : event
        const offsetX = pageX - canvas.offsetLeft
        const offsetY = pageY - canvas.offsetTop
        // 修改最后一次绘制的坐标点
        client.endX = offsetX
        client.endY = offsetY

        // 根据坐标点位移动添加线条
        ctx.lineTo(offsetX, offsetY)

        // 绘制
        ctx.stroke()
    }
    // 结束绘制
    const cloaseDraw = () => {
        // 结束绘制
        ctx.closePath()
        // 移除鼠标移动或手势移动监听器
        window.removeEventListener("mousemove", draw)
    }
    // 创建鼠标/手势按下监听器
    window.addEventListener(mobileStatus ? "touchstart" : "mousedown", init)
    // 创建鼠标/手势 弹起/离开 监听器
    window.addEventListener(mobileStatus ? "touchend" : "mouseup", cloaseDraw)

    // 取消-清空画布
    const cancel = () => {
        // 保存当前的填充样式
        const currentFillStyle = ctx.fillStyle;

        // 设置填充样式为背景色
        ctx.fillStyle = '#fff';

        // 填充整个画布以覆盖绘制内容
        ctx.fillRect(0, 0, canvas.width, canvas.height);

        // 恢复之前的填充样式
        ctx.fillStyle = currentFillStyle;
    }
    // 保存-将画布内容保存为图片
    const save = () => {
        // 将canvas上的内容转成blob流
        canvas.toBlob(blob => {
            const url = URL.createObjectURL(blob);
            var imageElement = new Image();
            imageElement.src = url;

            // 打开一个文档流,将处理好的截图在新窗口展示,看看效果
            var printWindow = window.open("", "_blank");
            printWindow.document.write('<html><head>');
            printWindow.document.write('<title>打印</title>');
            printWindow.document.write('</head><body>');
            printWindow.document.write(imageElement.outerHTML); // 将截图添加到新窗口
            printWindow.document.write('<//body><//html>');
            printWindow.document.close();
            $('.sig_big').css('visibility', 'hidden');
        })
    }
</script>

</html>
补充说明:

const url = URL.createObjectURL(blob); 生成的url是Blob URL

Blob URL与base64吗,有什么区别?

Blob URL 是一种用于引用二进制数据的特殊 URL 格式。它指向浏览器中的二进制数据块(Blob 对象),可以是图像、音频、视频或其他文件类型。Blob URL 的格式是 blob:<origin>/<unique-id>,其中 <origin> 表示 URL 的来源,<unique-id> 是一个唯一的标识符。例如:blob:http://127.0.0.1:5500/d96d1b24-0a77-4010-b6c0-4d44ef95e485

Base64 是一种编码方式,用于将二进制数据转换为纯文本字符串。Base64 编码后的数据可以方便地传输和存储,但需要进行编码和解码才能使用

如何将 Blob 对象转换为 File 对象,将其作为文件上传到后台?
canvas.toBlob(blob => {
                    const url = URL.createObjectURL(blob);
                    const reader = new FileReader();
                    reader.readAsDataURL(blob);
                    reader.onload = function () {
                        const file = new File([blob], 'fileName.jpg', { type: blob.type });
                        const formData = new FormData();
                        formData.append('file', file);
                    }
                })

创建一个 FileReader 对象,使用 readAsDataURL(blob) 方法读取指定的blob,将其转换为 base64 编码的字符串。这个过程会触发 FileReader 的 onload 事件 

new File([blob], 'fileName.jpg', { type: blob.type }) 中的三个参数分别为

[blob]:要包含在 File 对象中的二进制数据,通常是一个 Blob 对象,用数组的形式传递。

'fileName.jpg':File 对象的文件名,通常需要与上传的文件名保持一致。

{ type: blob.type }:File 对象的 MIME 类型(或内容类型),通常是上传文件的实际类型。

将图片转为pdf并下载

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .content {
            display: flex;
            justify-content: center;
        }

        .bgImg {
            background-image: url("./2.jpg");
            background-size: contain;
            height: 1562px;
            background-repeat: no-repeat;
            width: 1110px;
            position: relative;
        }

        input {
            display: inline-block;
            height: 35px;
            width: 135px;
            background-color: #ffffff00;
            border: none;
            outline: none;
        }

        .input1 {
            position: absolute;
            top: 162px;
            left: 191px;
            width: 580px;
            height: 28px;
        }

        .input2 {
            position: absolute;
            top: 207px;
            left: 277px;
            width: 520px;
            height: 28px;
        }

        .input3 {
            position: absolute;
            top: 258px;
            left: 235px;
            width: 545px;
            height: 28px;
        }

        .input4 {
            position: absolute;
            top: 305px;
            left: 328px;
            width: 135px;
            height: 28px;
        }
    </style>
</head>

<body>
    <div class="content" style="visibility:hidden;">
        <div id="customDiv">
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
            <div class="bgImg">
                <div class="text">
                    <input type="text" class="input1">
                    <input type="text" class="input2">
                    <input type="text" class="input3">
                    <input type="text" class="input4">
                </div>
            </div>
        </div>

        <span id="submit">提交</span>
    </div>
    <script src="./html2canvas.min.js"></script>
    <script src="./jspdf.umd.min.js"></script>
    <script src="./jquery-3.6.0.min.js"></script>
    <script>
        $(window, document).on('resize', function () {
            resizeCenterBak();
        }).on('load', function () {
            resizeCenterBak();
            $('.content').css('visibility', 'visible');
        });
        function resizeCenterBak() {
            $('body').css({
                width: "1920px",
                height: "1080px"
            });
            var ratioX = $(window).width() / $('body').width();
            var ratioY = $(window).height() / $('body').height();
            var ratio = Math.min(ratioX, ratioY);
            $('body').css({
                transform: "scale(" + ratio + ")",
                transformOrigin: "left top",
                marginLeft: ($(window).width() - $('body').width() * ratio) / 2
            });
        }
        $("#submit").click(function () {
            var targetDiv = document.getElementById("customDiv");
            var divRect = targetDiv.getBoundingClientRect();

            var Scale = 760 / divRect.width;
            targetDiv.style.transform = "scale(" + Scale + ")";

            var contentWidth = Scale * divRect.width
            var contentHeight = Scale * divRect.height

            var c = document.createElement('canvas');
            c.width = contentWidth * 1;
            c.height = contentHeight * 1;
            var opts = {
                scale: 1,
                canvas: c,
                useCORS: true,
                logging: true
            };
            var printWindow = window.open("", "_blank");
            html2canvas(targetDiv, opts).then(function (canvas) {
                var imageData = canvas.toDataURL(); // 获取截图数据
                var imageElement = new Image();
                imageElement.src = imageData;

                printWindow.document.write('<html><head>');
                printWindow.document.write('<title>打印</title>');
                printWindow.document.write('</head><body>');
                printWindow.document.write(imageElement.outerHTML); // 将截图添加到新窗口
                printWindow.document.write('<//body><//html>');
                printWindow.document.close();

                var pageHeight = canvas.width / 592.28 * 841.89;

                var pdf = new jspdf.jsPDF('', 'px', 'a4');
                var position = 0;

                while (position < canvas.height) {
                    var leftHeight = canvas.height - position;
                    var maxHeight = Math.min(pageHeight, leftHeight);
                    pdf.addImage(canvas, 'JPEG', 0, 0, null, null, null, 'FAST');
                    position += maxHeight;

                    if (position < canvas.height) {
                        pdf.addPage();
                    }
                }

                pdf.save('我导出的PDF.pdf');
            });
        });
    </script>
</body>

</html>
补充说明:
jspdf.umd.min.js 是什么

jsPDF(JavaScript PDF)库的压缩版本。jsPDF 是一个用于在客户端生成 PDF 文件的 JavaScript 库

主要作用是通过 JavaScript 生成 PDF 文件,使你能够以编程方式创建、编辑和下载 PDF 文档。

扩展:pdf如何转成图片

转成一张图

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>PDF to Merged Image Converter</title>
    <style>
        #merged-image {
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <input type="file" id="pdf-file">
    <canvas id="merged-image"></canvas>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
    <script>
        const pdfFile = document.getElementById('pdf-file');
        const mergedImageCanvas = document.getElementById('merged-image');
        const mergedImageContext = mergedImageCanvas.getContext('2d');

        pdfFile.addEventListener('change', async (event) => {
            const file = event.target.files[0];

            // 判断文件格式是否为 PDF
            if (file.type !== 'application/pdf') {
                alert('只能上传 PDF 格式文件!');
                return;
            }

            // 创建一个 FileReader 对象,用于读取 PDF 文件数据
            const reader = new FileReader();
            reader.readAsArrayBuffer(file);

            reader.onload = async function () {
                // 将 PDF 文件数据解析成 PDF.js 对象
                const pdf = await pdfjsLib.getDocument(reader.result).promise;

                let mergedWidth = 0;
                let mergedHeight = 0;

                // 计算合并后图像的总宽度和高度
                for (let i = 1; i <= pdf.numPages; i++) {
                    const page = await pdf.getPage(i);
                    const viewport = page.getViewport({ scale: 2 });
                    mergedWidth += viewport.width;
                    mergedHeight = Math.max(mergedHeight, viewport.height);
                }

                // 设置合并后图像的 Canvas 尺寸
                mergedImageCanvas.width = mergedWidth;
                mergedImageCanvas.height = mergedHeight;

                let currentX = 0;

                // 遍历 PDF 文件的每一页,并将其绘制到合并后的 Canvas 上
                for (let i = 1; i <= pdf.numPages; i++) {
                    const page = await pdf.getPage(i);
                    const viewport = page.getViewport({ scale: 2 });

                    // 创建一个临时的 Canvas 元素,用于绘制当前页面
                    const tempCanvas = document.createElement('canvas');
                    tempCanvas.width = viewport.width;
                    tempCanvas.height = viewport.height;
                    const context = tempCanvas.getContext('2d');

                    // 将 PDF 页面内容绘制到临时的 Canvas 上
                    const renderContext = { canvasContext: context, viewport };
                    await page.render(renderContext).promise;

                    // 将临时的 Canvas 绘制到合并后的 Canvas 上
                    mergedImageContext.drawImage(tempCanvas, currentX, 0);

                    currentX += viewport.width;
                }
            };
        });
    </script>
</body>

</html>

根据pdf页数转成多张图

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>PDF to Image Converter</title>
    <style>
      #pdf-container {
        display: flex;
        flex-wrap: wrap;
        justify-content: center;
      }

      img {
        margin: 10px;
        border: 1px solid black;
      }
    </style>
  </head>
  <body>
    <input type="file" id="pdf-file">
    <div id="pdf-container"></div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
    <script>
      const pdfFile = document.getElementById('pdf-file');
      const pdfContainer = document.getElementById('pdf-container');

      pdfFile.addEventListener('change', async (event) => {
        const file = event.target.files[0];

        // 判断文件格式是否为 PDF
        if (file.type !== 'application/pdf') {
          alert('只能上传 PDF 格式文件!');
          return;
        }

        // 创建一个 FileReader 对象,用于读取 PDF 文件数据
        const reader = new FileReader();
        reader.readAsArrayBuffer(file);

        reader.onload = async function () {
          // 将 PDF 文件数据解析成 PDF.js 对象
          const pdf = await pdfjsLib.getDocument(reader.result).promise;

          // 遍历 PDF 文件的每一页,并将其转换为图片显示在页面上
          for (let i = 1; i <= pdf.numPages; i++) {
            const page = await pdf.getPage(i);
            const viewport = page.getViewport({ scale: 1 });

            // 创建一个 Canvas 元素,用于绘制 PDF 页面内容
            const canvas = document.createElement('canvas');
            canvas.width = viewport.width;
            canvas.height = viewport.height;
            const context = canvas.getContext('2d');

            // 将 PDF 页面内容绘制到 Canvas 上
            const renderContext = { canvasContext: context, viewport };
            await page.render(renderContext).promise;

            // 将 Canvas 转换为图片并显示在页面上
            const imageUrl = canvas.toDataURL();
            const img = document.createElement('img');
            img.src = imageUrl;
            pdfContainer.appendChild(img);
          }
        };
      });
    </script>
  </body>
</html>

pdf.min.js是做什么的,有什么作用

pdf.min.js是一个JavaScript库,用于在Web页面中显示和操作PDF文档。它提供了一系列的API和功能,使得在浏览器中嵌入和处理PDF文件变得更加容易

jspdf.umd.min.js与pdf.min.js 有什么区别

pdf.min.js是一个用于在Web页面中显示和操作PDF文档的库,它提供了显示、缩放、滚动、导航、搜索、标注和打印等功能。而jspdf.umd.min.js是一个用于生成PDF文档的库,它提供了创建、编辑和导出PDF文档的功能

完结撒花,有问题欢迎留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1265591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv8自用训练教程——训练、测试、推理

前言 继YOLOv5大成之后&#xff0c;原作者U神又开源了更强的YOLOv8&#xff0c;说是论文在写&#xff0c;不知道这次会不会吃帽子。 代码 Github地址&#xff1a;https://github.com/ultralytics/ultralytics 预训练权重下载地址&#xff1a;https://github.com/ultralytics…

基于单片机温湿度光照自动窗帘系统设计

**单片机设计介绍&#xff0c; 基于单片机温湿度光照自动窗帘系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的温湿度光照自动窗帘系统是一种智能家居系统&#xff0c;通过使用单片机作为控制核心&#xff0c…

奇异值分解SVD(singular value decomposition)

奇异值分解 SVD是一个很有用的矩阵因子化方法。 SVD提出的目的&#xff1a;任何一个 m n m\times n mn的矩阵都可以当作一个超椭圆&#xff08;高维空间的椭圆&#xff09;&#xff0c;可以把它们当作单位球体S的像。 一个超椭圆可以通过将单位球型在正交方向 u 1 , u 2 , . …

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器&#xff1a; 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux&#xff1a; [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

[机缘参悟-120] :计算机世界与佛家看世界惊人的相似

目录 前言&#xff1a; 一、计算机 - 有序性不过是人为设计出来的&#xff01;&#xff01;&#xff01; 1.1 破相1&#xff1a;计算机的物质基础不过是一堆电子元器件的机缘组合 1.2 破相2&#xff1a;计算机不过是各种电信号的有序运动&#xff08;有序是关键&#xff09…

【c++|SDL】二、读取图片、显示图片、动画制作

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 读取图片&#xff0c;显示图片&#xff0c;动画 SDL中有两种在屏幕上显示的方法 SDL_Surface: 使用软件渲染处理SDL_Texture: 使用硬件加速渲染处理 1.…

C++二分查找、离线算法:最近的房间

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 一个酒店里有 n 个房间&#xff0c;这些房间用二维整数数组 rooms 表示&#xff0c;其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一…

基于SSM的云鑫曦科技办公自动化管理系统设计与实现

基于SSM的云鑫曦科技办公自动化管理系统设计与实现 摘 要: 随着时代的发展&#xff0c;单位办公方式逐渐从传统的线下纸张办公转向了使用个人pc的线上办公&#xff0c;办公效率低下的传统纸质化办公时代的淘汰&#xff0c;转型到信息化办公时代&#xff0c;面对当今数据逐渐膨…

上海亚商投顾:沪指震荡反弹 汽车产业链掀涨停潮

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡反弹&#xff0c;北证50指数跌超4%&#xff0c;近50只北交所个股跌超10%。 新能源车产业链掀…

探索短剧市场的商机:打造短视频平台的全方位指南

目前短剧市场蓬勃发展&#xff0c;上半年备案数远超电视剧&#xff0c;彰显了短剧小程序市场潜力巨大&#xff0c;商业价值巨大。用户对短小精悍娱乐内容的需求不断增加&#xff0c;而新兴市场中有限的短剧小程序正好能够迎合这一需求。 搭建短视频平台的关键步骤&#xff1a; …

Postgres 数据库中 ULID 和 UUID 的性能

大家好&#xff01;在本文中&#xff0c;我想分享我对经常用作标识符的数据类型的知识和看法。今天我们将同时讨论两个主题。这些是数据库端按键和键的数据类型衡量的搜索速度。 我将使用PostgreSQL数据库和演示Java服务来比较查询速度。 UUID 和 ULID 为什么我们需要某种难…

MyBatis使用教程详解<下>

回顾上一篇博文,我们讲了如何使用注解/XML的方式来操作数据库,实际上,一个Mapper接口的实现,这两种方式是可以并存的. 上一篇博文中,我们演示的都是比较简单的SQL语句,没有设计到复杂的逻辑,本篇博文会讲解复杂SQL的实现及一些细节处理.话不多说,让我们开始吧. 一. #{}和${} …

基于LNMP快速搭建WordPress平台

目录 1 LNMP简介 2 WordPress简介 3 安装MySQL环境 3.1 安装MySQL 3.1.1 下载wget工具 3.1.2 下载MySQL官方yum源安装包 3.1.3 安装MySQL官方yum源 3.1.4 mysql安装 3.2 启动MySQL 3.3 获取默认密码 3.4 登录MySQL ​ 3.5 修改密码 3.6 创建WordPress数据库并授权 3.6.1 创…

5 时间序列预测入门:LSTM+Transformer

0 引言 论文地址&#xff1a;https://arxiv.org/abs/1706.03762 1 Transformer Transformer 模型是一种用于处理序列数据的深度学习模型&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;任务。它在许多 NLP 任务中取得了重大突破&#xff0c;如机器翻译、文本…

微服务实战系列之Cache

前言 欢迎来到Cache&#xff08;缓存&#xff09;的世界&#xff01; 自从世界第一台计算机诞生之日起&#xff0c;人们对效率的渴望逐步增强。从CPU到存储&#xff0c;从芯片到内存&#xff0c;一批又一批的先驱以一种孜孜不倦的“工匠”精神&#xff0c;为计算机运行效率的提…

【数据结构 —— 二叉树的链式结构实现】

数据结构 —— 二叉树的链式结构实现 1.树的概念及其结构1.1.树概念1.2.树的结构1.3树的相关概念1.4.树的表示1.5. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树的概念及其结构2.1二叉树的概念2.2.现实中的二叉树&#xff1a;2.3. 特殊的二叉树…

Flutter开发type ‘Future<int>‘ is not a subtype of type ‘int‘ in type cast错误

文章目录 问题描述错误源码 问题分析解决方法修改后的代码 问题描述 今天有个同事调试flutter程序时报错&#xff0c;问我怎么解决&#xff0c;程序运行时报如下错误&#xff1a; type ‘Future’ is not a subtype of type ‘int’ in type cast 错误源码 int order Databas…

FFmpeg介绍

官方网站&#xff1a;http://www.ffmpeg.org/ 项目组成 libavformat 封装模块&#xff0c;封装了Protocol层和Demuxer、Muxer层&#xff0c;使得协议和格式对于开发者来说是透明的。FFmpeg能否支持一种封装格式的视频的封装与解封装&#xff0c;完全取决于这个库&#xff0c…

《微信小程序开发从入门到实战》学习三十五

4.2 云开发JSON数据库 4.2.3 权限控制 在云开发控制台可以对数据库中的数据进行操作&#xff0c; 在小程序端和云函数可以分别使用小程序API和服务端API对数据中的数据进行操作。 以上操作受到权限控制。 对数据库进行查询属于读操作&#xff0c;增删改操作属于写操作。 …

Python自动化办公:PDF文件的加密与解密

在本篇文章中&#xff0c;我们将介绍如何使用PyPDF2库对PDF文件进行加密和解密操作。 包括如何给PDF文件添加密码&#xff0c;以及如何从受密码保护的PDF文件中删除密码。 注&#xff1a;删除密码的操作&#xff0c;前提是需要知道密码哦 1. 安装PyPDF2库 首先&#xff0c;…