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

效果图:

需求:

 用户可以在线进行文档编辑,在线电子签名,然后点击可以另存为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文档的功能

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十八数藏的文化数字革新:传统之美的数字转变

在数字时代的冲击下&#xff0c;十八数藏以其独特的文化数字革新&#xff0c;将传统之美注入数字的脉络中&#xff0c;实现了非遗之珍的数字转变。这种数字化的创新不仅为传统工艺赋予了新的生命&#xff0c;也使得传承变得更为生动与全面。 十八数藏通过数字技术&#xff0c;将…

腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群

原创/朱季谦 最近买了一台4核16的腾讯云轻量应用服务器,花了我快四百的大洋&#xff0c;打算搭建一堆docker组件集群&#xff0c;最先开始是通过docker搭建redis集群&#xff0c;计划使用三个端口&#xff0c;分别是7001,7002,7003。 腾讯云服务器有防火墙限制&#xff0c;故…

建议收藏:华为海思IC设计笔试题,含解析(附下载)

华为海思一直以来是从业者想要进入的热门公司。但是岗位就那么多&#xff0c;在面试的时候&#xff0c;很多同学因为准备不充分&#xff0c;与岗位失之交臂&#xff0c;无缘进入该公司。今天为大家带来华为海思芯片岗的真题解析&#xff0c;如有错漏&#xff0c;欢迎指正哈。 今…

大数据平台/大数据技术与原理-实验报告--MapReduce编程

实验名称 MapReduce编程 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.10.30-2023.11.03 实验仪器设备以及实验软硬件要求 专业实验室&#xff08;配有centos7.5系统…

Vue3-VueRouter4路由语法解析

1.创建路由实例由createRouter实现 2.路由模式 1&#xff09;history模式使用createWebHistory()&#xff1a;地址栏不带# 2&#xff09;hash模式使用createWebHashHistory()&#xff1a;地址栏带# 3&#xff09;参数是基础路径&#xff0c;默认/ 括号里的就是设置路径的前…

实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

场景复现 举个例子&#xff0c;针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略&#xff0c;比如&#xff0c;在内存比较大的设备&#xff0c;可以一次性加载&#xff0c;繁殖需要使用懒加载&#xff0c;这个时候我们就可以采用配置文件配置中心去控制了 Cond…

使用Zoho Projects项目管理系统进行研发排期的策略与方法

研发排期旨在有序地填充待开发的就绪队列&#xff0c;明确最近的发布计划&#xff0c;让准备就绪的需求如行云流水般进入开发阶段。 使用Zoho Projects项目管理系统进行研发排期的步骤如下&#xff1a; 1.创建项目&#xff1a; 登录Zoho Projects账户&#xff0c;创建一个新项…

如何使用 Java 在Excel中创建下拉列表

下拉列表&#xff08;下拉框&#xff09;可以确保用户仅从预先给定的选项中进行选择&#xff0c;这样不仅能减少数据输入错误&#xff0c;还能节省时间提高效率。在MS Excel中&#xff0c;我们可以通过 “数据验证” 提供的选项来创建下拉列表&#xff0c;但如果要在Java程序中…

SRGAN 使用指南:将低分辨率图像转换为高分辨率图像

SRGAN、ESRGAN、Real-ESRGAN 使用指南 SRGAN网络结构优化目标 ESRGANReal-ESRGAN SRGAN 超分辨率&#xff1a;从低分辨率(LR)图像来估计其对应高分辨率(HR)图像的任务&#xff0c;被称作超分辨率(SR)。 SRGAN 图像超分辨率的深度学习模型&#xff0c;通过生成对抗网络&#x…

ESP32-Web-Server编程-HTML 基础

ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时&#xff0c;一个 HTML 文件被发送给浏览器&#xff0c;浏览器解释该文件的内容&#xff0c;…

Java核心知识点整理大全20-笔记

目录 17. 设计模式 17.1.1. 设计原则 17.1.24. 解释器模式 18. 负载均衡 18.1.1.1. 四层负载均衡&#xff08;目标地址和端口交换&#xff09; 18.1.1.2. 七层负载均衡&#xff08;内容交换&#xff09; 18.1.2. 负载均衡算法/策略 18.1.2.1. 轮循均衡&#xff08;Roun…

Nginx-进程

Nginx-相关问题_01 Windows关闭所有nginx服务 windows 系统下开发调试时不用每次频繁的 启动->任务管理器->查找进程->结束进程&#xff01; 查看nginx的进程占用情况 tasklist | find /i "nginx.exe" || exit关闭nginx的所有进程 taskkill /im nginx.…

iOS-打包上架构建版本一直不出现/正在处理/自动消失

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

[UGUI]Unity背包系统制作详细步骤

二、背包制作 1.创建空物体&#xff0c;然后创建UI-Image 制作背包整个背包所在的父UI的背景图 选中BG&#xff0c;找到他的锚点设置&#xff0c;按住Alt键&#xff0c;点击右下角的适配&#xff0c;让锚点和内容都匹配画布 PS&#xff1a;不按Alt键是设置一个元素的锚点位…

Go 数组

一、数组介绍 1、Array 介绍 数组是指一系列同一类型数据的集合数组中包含的咩个数据被成为数组元素&#xff08;element&#xff09;&#xff0c;这种类型可以是任意的原始类型&#xff0c;比如 int、string 等一个数组包含的元素格式被称为数组的长度在 Golang 中数组是一个…

基于可穿戴的健康监护终端--研究进展报告

基于可穿戴的健康监护终端--研究进展报告 1 引言2 传感器介绍2.1 呼吸速率传感器2.2 温度传感器2.3 心脏跳动传感器 3 论文介绍3.1 Effective Data Decision-Making and Transmission System Based on Mobile Health for Chronic Disease Management in the Elderly3.2 Design …

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件&#xff0c;是用来代替原来的Android.mk文件的。在Android7.0以前&#xff0c;Android都是使用make来组织各模块的编译&#xff0c;对应的编译配置文件就是Android.mk。在Android7.0开始&#xff0c;Google引入了ninja和kat…

C# 实现微信退款及对帐

目录 需求 基础准备 关键代码 操作界面 ​编辑 退款订单类及方法 退款功能实现 对帐 支付商家后台相关要点 实时交易帐单查询 精确交易帐单查询 小结 需求 在招聘报名系统里&#xff0c;考务费支付是其中一个环节&#xff0c;支付方式很多种&#xff0c;比如银联、…

基于单片机的智能饮水机控制系统(论文+源码)

1. 系统设计 本次智能饮水机控制系统的设计研究一款以STC89C52单片机为核心的智能饮水机控制系统&#xff0c;其主要功能设计如下&#xff1a; 1.该饮水机利用DS18B20数字温度传感器实时采集饮水机内水的温度&#xff0c;其检测温度范围为0-100℃&#xff0c;精度0.1℃&#…