hiprint:实现项目部署与打印1-官网提供普通html版本

一、文件下载指引

1、官网路径

网页官网主要提供html的使用

http://hiprint.io/

2、下载路径

二、启动下载的项目

1、解压文件

将下载的安装包进行解压

2、放入编辑工具运行

这里以vscode为例,使用nodejs、npm安装(没有环境先安装npm安装环境,网上很多)

(1)开启终端

(2)启用http服务

bash 复制代码
# 安装 http-server 全局包
npm install -g http-server
bash 复制代码
# 启动服务器,端口为 8000
http-server -p 8000

(3)进入项目

执行完上述命令,即可给出本地地址,复制到浏览器打开即可(这里最好使用cmd的终端模式)

3、页面展示

官网提供的很多代码都是缺失的,所以主页页面还是参考主页面,可拖拽编辑打印都没问题

三、将代码整理为简单的模板打印

这里将设计页面与打印页面进行独立,设计页面设计完可下载模板,然后指定模板(这里定死)在打印页面直接展示打印数据,可进行打印

1、添加设计页面design.html

根据之前提供的custom.html页面进行修改,去掉不必要的信息,并且添加导入导出模板功能

代码如下

html 复制代码
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>模板设计页面</title>
    <link href="css/hiprint.css" rel="stylesheet" />
    <link href="css/print-lock.css" rel="stylesheet" />

    <link href="content/bootstrap.min.css" rel="stylesheet">
    <script src="content/jquery-3.7.1.min.js"></script>
    <script src="content/bootstrap.min.js"></script>

    <style>
        .hinnn-layout,
        .hinnn-layout * {
            box-sizing: border-box;
        }


        .hinnn-layout {
            display: flex;
            flex: auto;
            flex-direction: column;

        }

        .hinnn-layout.hinnn-layout-has-sider {
            flex-direction: row;
        }

        .hinnn-layout-sider {
            display: flex;
            flex-direction: row;
            position: relative;
        }

        .hinnn-layout-content {
            flex: auto;
        }

        .hinnn-header {
            position: relative;

            z-index: 1030;
            display: block;
        }


        .wrapper {
            min-height: 100%;
        }

        .height-100-per {
            height: 100%;
        }
        
        /* 模板管理区域样式 */
        .template-management {
            margin: 15px 0;
            padding: 15px;
            border: 1px solid #e8e8e8;
            background-color: #f9f9f9;
        }
        
        .template-management h3 {
            margin-top: 0;
            margin-bottom: 15px;
        }
        
        .template-management .form-group {
            margin-bottom: 10px;
        }
        
        .template-management .btn {
            margin-right: 10px;
        }
    </style>
</head>

<body>
    <layout class="layout hinnn-layout hinnn-layout-has-sider height-100-per" style="background:#fff;">


        <content class="hinnn-layout-content" style="border-left:1px solid #e8e8e8;">
            <div class="container-fluid height-100-per print-content">
                <!-- 模板管理区域 -->
                <div class="template-management">
                    <h3>模板管理</h3>
                    <div class="form-group">
                        <label for="templateNameInput">模板名称:</label>
                        <input type="text" id="templateNameInput" class="form-control" style="width: 300px; display: inline-block; margin-right: 10px;" placeholder="请输入模板名称">
                        <button id="saveTemplateBtn" class="btn btn-primary">保存模板</button>
                        <button id="exportTemplateBtn" class="btn btn-warning">导出模板文件</button>
                    </div>
                    <div class="form-group">
                        <label for="templateList">保存的模板:</label>
                        <select id="templateList" class="form-control" style="width: 300px; display: inline-block; margin-right: 10px;">
                            <option value="">-- 选择模板 --</option>
                        </select>
                        <button id="loadTemplateBtn" class="btn btn-success">加载模板</button>
                        <button id="deleteTemplateBtn" class="btn btn-danger">删除模板</button>
                    </div>
                    <div class="form-group">
                        <label for="importTemplateFile">导入模板文件:</label>
                        <input type="file" id="importTemplateFile" accept=".json" style="display: inline-block; margin-right: 10px;">
                    </div>
                    <div class="form-group">
                        <a href="print.html" class="btn btn-info">前往打印页面</a>
                    </div>
                </div>
                
                <div class="row">
                    <div class="col-sm-12">
                        <div class="row">
                            <!-- 左侧拖拽元素 -->
                            <div class="col-sm-3 col-md-2" style="padding-right:0px;">
                                <div class="rect-printElement-types hiprintEpContainer">
                                    <ul class="hiprint-printElement-type">

                                        <li>
                                            <span class="title"><code>拖拽列表</code></span>
                                            <ul>
                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.text" style="">

                                                        <span class="glyphicon glyphicon-text-width"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">文本</span>
                                                    </a>
                                                </li>

                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.image" style="">
                                                        <span class="glyphicon glyphicon-picture"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">图片</span>
                                                    </a>
                                                </li>
                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.longText">
                                                        <span class="glyphicon glyphicon-subscript"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">长文</span>


                                                    </a>
                                                </li>

                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.tableCustom" style="">
                                                        <span class="glyphicon glyphicon-th" aria-hidden="true"></span>
                                                        <span class="glyphicon-class">表格</span>
                                                    </a>
                                                </li>

                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.html">
                                                        <span class="glyphicon glyphicon-header"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">html</span>
                                                    </a>
                                                </li>

                                            </ul>
                                        </li>
                                        <li>
                                            <span class="title">辅助</span>
                                            <ul>
                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.hline" style="">

                                                        <span class="glyphicon glyphicon-resize-horizontal"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">横线</span>
                                                    </a>
                                                </li>

                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.vline" style="">
                                                        <span class="glyphicon glyphicon-resize-vertical"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">竖线</span>
                                                    </a>
                                                </li>
                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.rect">
                                                        <span class="glyphicon glyphicon-unchecked"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">矩形</span>
                                                    </a>
                                                </li>
                                                <li>
                                                    <a class="ep-draggable-item" tid="testModule.oval">
                                                        <span class="glyphicon glyphicon-record"
                                                            aria-hidden="true"></span>
                                                        <span class="glyphicon-class">椭圆</span>
                                                    </a>
                                                </li>
                                            </ul>
                                        </li>
                                    </ul>
                                </div>
                            </div>
                            <div class="col-sm-9 col-md-10">
                                <!-- 纸张调整+---预览、打印按钮 -->
                                <div class="hiprint-toolbar" style="margin-top:15px;">
                                    <ul>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('A3')">A3</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('A4')">A4</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('A5')">A5</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('B3')">B3</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('B4')">B4</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="setPaper('B5')">B5</a></li>

                                        <li><a class="hiprint-toolbar-item"><input type="text" id="customWidth"
                                                    style="width: 50px;height: 19px;border: 0px;"
                                                    placeholder="宽/mm" /></a></li>
                                        <li><a class="hiprint-toolbar-item"><input type="text" id="customHeight"
                                                    style="width: 50px;height: 19px;border: 0px;"
                                                    placeholder="高/mm" /></a></li>

                                        <li><a class="hiprint-toolbar-item"
                                                onclick="setPaper($('#customWidth').val(),$('#customHeight').val())">自定义</a>
                                        </li>
                                        <li><a class="hiprint-toolbar-item" onclick="rotatePaper()">旋转</a></li>
                                        <li><a class="hiprint-toolbar-item" onclick="clearTemplate()">清空</a></li>

                                        <li>
                                            <a class="btn hiprint-toolbar-item " style="color: #fff;background-color: #d9534f;border-color: #d43f3a;" id="A4_preview">快速预览</a>
                                        </li>
                                        <li>
                                            <a id="A4_directPrint" class="btn hiprint-toolbar-item " style="color: #fff;background-color: #d9534f;border-color: #d43f3a;">打印</a>
                                        </li>
                                    </ul>
                                    <div style="clear:both;"></div>
                                </div>
                                <!-- 打印模板 -->
                                <div id="hiprint-printTemplate" class="hiprint-printTemplate" style="margin-top:20px;"></div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </content>
        <sider class="hinnn-layout-sider">
            <div class="container height-100-per" style="width:250px;">
                <div class="row">
                    <div class="col-sm-12">
                        <div id="PrintElementOptionSetting" style="margin-top:10px;"></div>
                    </div>
                </div>
            </div>


        </sider>
    </layout>


    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
        <div class="modal-dialog modal-lg" role="document" style="width: 825px;">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                            aria-hidden="true">&times;</span></button>
                    <h4 class="modal-title" id="myModalLabel">打印预览</h4>
                </div>

                <div class="modal-body">
                    <button type="button" class="btn btn-danger" id="A4_printByHtml">打印</button>
                    <div class="prevViewDiv"></div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>

                </div>
            </div>
        </div>
    </div>


    <!--[[ 测试专用  单独使用无需引入  -->
    <script src="custom_test/custom-etype-provider.js"></script>
    <script src="custom_test/custom-print-json.js"></script>
    <!--测试专用  单独使用无需引入 ]]  -->
    
    <!--单独使用无需引入  -->
    <script src="polyfill.min.js"></script>
    <script src="plugins/jquery.minicolors.min.js"></script>
    <script src="plugins/JsBarcode.all.min.js"></script>
    <script src="plugins/qrcode.js"></script>
    <script src="hiprint.bundle.js"></script>
    <script src="plugins/jquery.hiwprint.js"></script>


    <script>
        var hiprintTemplate;
        $(document).ready(function () {

            //初始化打印插件
            hiprint.init({
                providers: [new customElementTypeProvider()]
            });

            //hiprint.PrintElementTypeManager.build('.hiprintEpContainer', 'testModule');
            //设置左侧拖拽事件
            hiprint.PrintElementTypeManager.buildByHtml($('.ep-draggable-item'));

            // 清空设计区域
            $('#hiprint-printTemplate').empty();
            
            // 创建空模板
            hiprintTemplate = new hiprint.PrintTemplate({
                template: { panels: [{ index: 0, height: 297, width: 210, paperHeader: 0, paperFooter: 0, printElements: [] }] },
                settingContainer: '#PrintElementOptionSetting',
                paginationContainer: '.hiprint-printPagination'
            });
            
            // 打印设计
            hiprintTemplate.design('#hiprint-printTemplate');
            
            // 隐藏页码
            setTimeout(function() {
                $('.hiprint-paperNumber').hide();
                if ($('#hiprint-printTemplate').children().length === 0) {
                    // 重新设计
                    hiprintTemplate.design('#hiprint-printTemplate');
                    // 重新隐藏页码
                    setTimeout(function() {
                        $('.hiprint-paperNumber').hide();
                    }, 100);
                }
            }, 100);

            // 加载保存的模板列表
            loadTemplateList();

            // 保存模板按钮点击事件
            $('#saveTemplateBtn').click(function () {
                var templateName = $('#templateNameInput').val().trim();
                
                if (!templateName) {
                    alert('请输入模板名称');
                    return;
                }
                
                // 检查是否有重复的模板名称
                var templates = getTemplates();
                var isDuplicate = false;
                for (var id in templates) {
                    if (templates[id].name === templateName) {
                        isDuplicate = true;
                        break;
                    }
                }
                
                if (isDuplicate) {
                    if (!confirm('已存在同名模板,是否覆盖?')) {
                        return;
                    }
                }
                
                // 获取当前模板
                var currentTemplate = hiprintTemplate.getJson();
                var templateData = {
                    name: templateName,
                    template: currentTemplate,
                    timestamp: new Date().getTime()
                };
                
                // 保存到localStorage
                saveTemplate(templateData);
                alert('模板保存成功');
                loadTemplateList(); // 刷新模板列表
            });
            
            // 导出模板文件按钮点击事件
            $('#exportTemplateBtn').click(function () {
                var templateName = $('#templateNameInput').val().trim();
                
                if (!templateName) {
                    alert('请输入模板名称');
                    return;
                }
                
                // 获取当前模板
                var currentTemplate = hiprintTemplate.getJson();
                var templateData = {
                    name: templateName,
                    template: currentTemplate,
                    timestamp: new Date().getTime(),
                    exportDate: new Date().toISOString()
                };
                
                // 创建JSON字符串
                var jsonStr = JSON.stringify(templateData, null, 2);
                
                // 创建Blob对象
                var blob = new Blob([jsonStr], { type: 'application/json' });
                
                // 创建下载链接
                var url = URL.createObjectURL(blob);
                var a = document.createElement('a');
                a.href = url;
                a.download = templateName + '_template.json';
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
                URL.revokeObjectURL(url);
                
                alert('模板导出成功');
            });
            
            // 导入模板文件
            $('#importTemplateFile').change(function (e) {
                var file = e.target.files[0];
                if (!file) return;
                
                var reader = new FileReader();
                reader.onload = function (e) {
                    try {
                        var templateData = JSON.parse(e.target.result);
                        
                        if (templateData && templateData.template) {
                            // 总是使用文件名作为模板名称,不进行任何截断
                            // 从文件名中移除.json后缀作为模板名称
                            var templateName = file.name ? file.name.replace('.json', '') : '';
                            templateData.name = templateName || '导入的模板_' + new Date().getTime();
                            // 总是生成新的timestamp,避免覆盖原有模板
                            templateData.timestamp = new Date().getTime();
                            
                            // 检查是否有重复的模板名称
                            var templates = getTemplates();
                            var isDuplicate = false;
                            for (var id in templates) {
                                if (templates[id].name === templateData.name) {
                                    isDuplicate = true;
                                    break;
                                }
                            }
                            
                            if (isDuplicate) {
                                if (!confirm('已存在同名模板,是否覆盖?')) {
                                    return;
                                }
                            }
                            
                            // 保存到localStorage
                            saveTemplate(templateData);
                            loadTemplateList(); // 刷新模板列表
                            
                            alert('模板导入成功,已添加到模板列表中');
                        } else {
                            alert('无效的模板文件');
                        }
                    } catch (error) {
                        alert('模板文件解析失败: ' + error.message);
                    }
                };
                reader.readAsText(file);
            });
            
            // 加载模板按钮点击事件
            $('#loadTemplateBtn').click(function () {
                var templateId = $('#templateList').val();
                
                if (!templateId) {
                    alert('请选择要加载的模板');
                    return;
                }
                
                // 从localStorage加载模板
                var templateData = loadTemplate(templateId);
                
                if (templateData) {
                    try {
                        // 清空设计区域
                        $('#hiprint-printTemplate').empty();
                        
                        // 重新创建模板对象
                        hiprintTemplate = new hiprint.PrintTemplate({
                            template: templateData.template,
                            settingContainer: '#PrintElementOptionSetting',
                            paginationContainer: '.hiprint-printPagination'
                        });
                        // 重新设计
                        hiprintTemplate.design('#hiprint-printTemplate');
                        
                        // 隐藏页码
                        setTimeout(function() {
                            $('.hiprint-paperNumber').hide();
                        }, 100);
                        
                        // 更新模板名称输入框
                        $('#templateNameInput').val(templateData.name);
                        

                    } catch (error) {
                        alert('模板加载失败: ' + error.message);
                    }
                } else {
                    alert('模板加载失败');
                }
            });
            
            // 删除模板按钮点击事件
            $('#deleteTemplateBtn').click(function () {
                var templateId = $('#templateList').val();
                
                if (!templateId) {
                    alert('请选择要删除的模板');
                    return;
                }
                
                if (confirm('确定要删除选中的模板吗?')) {
                    deleteTemplate(templateId);
                    loadTemplateList(); // 刷新模板列表
                }
            });

            $('#A4_preview').click(function () {
                // 使用空数据预览
                $('#myModal .modal-body .prevViewDiv').html(hiprintTemplate.getHtml({}));
                $('#myModal').modal('show');
            });
            $('#A4_directPrint').click(function () {
                // 使用空数据打印
                hiprintTemplate.print({});
            });
            $('#A4_printByHtml').click(function () {
                hiprintTemplate.printByHtml($('#myModal .modal-body .prevViewDiv'));
            });
        });

        //调整纸张
        var setPaper = function (paperTypeOrWidth, height) {
            hiprintTemplate.setPaper(paperTypeOrWidth, height);
        }

        //旋转
        var rotatePaper = function () {
            hiprintTemplate.rotatePaper();
        }
        var clearTemplate = function () {
            hiprintTemplate.clear();
        }

        // 模板管理相关函数
        function getTemplates() {
            var templates = localStorage.getItem('hiprintTemplates');
            return templates ? JSON.parse(templates) : {};
        }
        
        function saveTemplate(templateData) {
            var templates = getTemplates();
            var templateId = null;
            
            // 检查是否存在同名模板,如果存在则使用原有的ID进行覆盖
            for (var id in templates) {
                if (templates[id].name === templateData.name) {
                    templateId = id;
                    break;
                }
            }
            
            // 如果不存在同名模板,则生成新的ID
            if (!templateId) {
                templateId = 'template_' + templateData.timestamp;
            }
            
            templates[templateId] = templateData;
            localStorage.setItem('hiprintTemplates', JSON.stringify(templates));
        }
        
        function loadTemplate(templateId) {
            var templates = getTemplates();
            return templates[templateId];
        }
        
        function deleteTemplate(templateId) {
            var templates = getTemplates();
            delete templates[templateId];
            localStorage.setItem('hiprintTemplates', JSON.stringify(templates));
        }
        
        function loadTemplateList() {
            var templates = getTemplates();
            var $list = $('#templateList');
            $list.empty().append('<option value="">-- 选择模板 --</option>');
            
            for (var id in templates) {
                var template = templates[id];
                $list.append('<option value="' + id + '">' + template.name + '</option>');
            }
        }

    </script>

</body>

</html>

2、添加打印页面template-view.html

这里根据设定好的json模板直接展示模板信息,点击按钮即可完成打印操作

代码中,使用的model/demoModel.json为模板,可直接根据design.html下载模板得到

代码中,使用的model/print-data.json为打印的数据,这样可以直接实现打印的动态操作

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="utf-8">
    <title>模板预览页面</title>
    <!-- hiprint -->
    <link href="css/hiprint.css" rel="stylesheet">
    <link href="css/print-lock.css" rel="stylesheet">
    <link href="css/print-lock.css" media="print" rel="stylesheet">

    <!-- jQuery (hiprint 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
    <script src="content/jquery-3.7.1.min.js"></script>
    <!-- 加载 hiprint 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
    <!-- polyfill.min.js解决浏览器兼容性问题v6.26.0-->
    <script src="polyfill.min.js"></script>
    <!-- hiprint 核心js-->
    <script src="hiprint.bundle.js"></script>
    <!-- 条形码生成组件-->
    <script src="plugins/JsBarcode.all.min.js"></script>
    <!-- 二维码生成组件-->
    <script src="plugins/qrcode.js"></script>
    <!-- 调用浏览器打印窗口helper类,可自行替换-->
    <script src="plugins/jquery.hiwprint.js"></script>

    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            background-color: #f5f5f5;
        }

        .container {
            max-width: 800px;
            margin: 0 auto;
            background-color: white;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }

        .print-btn {
            padding: 10px 20px;
            font-size: 16px;
            background-color: #d9534f;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            margin-bottom: 20px;
        }

        .print-btn:hover {
            background-color: #c9302c;
        }

        .template-container {
            border: 1px solid #e0e0e0;
            padding: 20px;
            background-color: #fafafa;
            display: inline-block;
        }

        .hiprint-printTemplate {
            margin-top: 0 !important;
        }
    </style>
</head>

<body>
    <div class="container">
        <h1>模板预览</h1>
        <button id="printBtn" class="print-btn">打印</button>
        <div class="template-container">
            <div id="templateViewDiv"></div>
        </div>
    </div>

    <script>
        // 全局变量
        var hiprintTemplate;
        var printData = {};
        var templateData = {};

        // 初始化
        $(document).ready(function () {
            // 初始化hiprint
            hiprint.init();

            // 加载打印数据
            $.getJSON('model/print-data.json', function (data) {
                printData = data;
                console.log('打印数据加载成功:', printData);
                
                // 数据加载完成后加载模板
                loadTemplate();
            }).fail(function () {
                console.error('打印数据加载失败');
                $('#templateViewDiv').html('<p style="color: red;">打印数据加载失败,请检查文件路径</p>');
            });

            // 加载模板
            function loadTemplate() {
                $.getJSON('model/demoModel.json', function (data) {
                    templateData = data;
                    if (templateData && templateData.template) {
                        // 创建打印模板对象
                        hiprintTemplate = new hiprint.PrintTemplate({
                            template: templateData.template
                        });

                        // 使用design模式显示模板(会自动添加量度并保持与模板定义一致的宽高)
                        hiprintTemplate.design('#templateViewDiv');

                        // 隐藏页码
                        setTimeout(function () {
                            $('.hiprint-paperNumber').hide();
                        }, 100);

                        console.log('模板加载成功');
                    } else {
                        console.error('无效的模板数据');
                        $('#templateViewDiv').html('<p style="color: red;">模板数据无效</p>');
                    }
                }).fail(function () {
                    console.error('模板加载失败');
                    $('#templateViewDiv').html('<p style="color: red;">模板加载失败,请检查文件路径</p>');
                });
            }

            // 打印按钮点击事件
            $('#printBtn').click(function () {
                if (hiprintTemplate) {
                    hiprintTemplate.print(printData);
                } else {
                    alert('模板尚未加载完成,请稍后再试');
                }
            });
        });
    </script>

</body>

</html>
相关推荐
不绝1912 小时前
UGUI——进阶篇
前端
Exquisite.3 小时前
企业高性能web服务器(4)
运维·服务器·前端·网络·mysql
2501_944525543 小时前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
2601_949857433 小时前
Flutter for OpenHarmony Web开发助手App实战:快捷键参考
前端·flutter
wangdaoyin20103 小时前
若依vue2前后端分离集成flowable
开发语言·前端·javascript
心柠4 小时前
vue3相关知识总结
前端·javascript·vue.js
Amumu121384 小时前
Vue Router(二)
java·前端
a1117765 小时前
图书借阅管理系统(FastAPI + Vue)
前端·vue.js·fastapi
常年游走在bug的边缘5 小时前
掌握JavaScript作用域:从函数作用域到块级作用域的演进与实践
开发语言·前端·javascript