vue + Lodop 制作可视化设计页面 实现打印设计功能(四)

news/2024/9/18 3:21:31 标签: 前端, vue.js, typescript

历史:

vue2 + Lodop 制作可视化设计页面 实现打印设计功能(一)

vue + Lodop 制作可视化设计页面 实现打印设计功能(二)

vue + Lodop 制作可视化设计页面 实现打印设计功能(三)

前言:

在上篇文章我们已经简单的实现了一个自定义控件HPText,在这篇我们来引入lodop实现打印预览

主要技术栈:vue3+vite+pinia+less+typescript

目录:

  1. 项目创建及模块定义,简单实现拖拽新增
  2. 新增第一个自定义组件-HPText(文本组件)
  3. 引入lodop,打印预览
  4. 组件点击拖拽移动
  5. 新增HPText组件的菜单,组件菜单设置时组件动态变化
  6. 框选组件,批量移动
  7. 待定...

正文:

要引入lodop,首先需要引入pinia,也就是需要把page信息以及com组件信息存在store中,之后写一个解析page信息的解析工具方法即可

引入pinia

  • 定义comStore

在这个里面定义3个方法 :初始化page,初始化组件列表,添加组件

import {defineStore} from 'pinia'
import {IOptionItem, IPage} from "../domains/qy-component.ts";
import {createComponent} from "../components/tool.ts";

export interface IComState {
    page: IPage,
    optionItems: IOptionItem[]
}

export const useComStore = defineStore('com', {
    state: (): IComState => ({
        page: {},
        optionItems: []
    }),
    getters: {},
    actions: {
        initPage(pageInfo: IPage) {
            this.page = pageInfo
        },
        initOptionItems(options: IOptionItem) {
            this.optionItems = options
        },
        async add(index, x, y) {
            let com = await createComponent(this.optionItems[index].type)
            com.attr.x = x;
            com.attr.y = y;
            this.page.tempItems.push({
                ...com,
                ...this.optionItems[index]
            })
        }
    }
})
  • 改造viewport.index.vue

主要是把之前的dropToAddCom函数改成调用 useComStore  的add方法,页面上渲染的page以及com从useComStore 中通过 computed获取

const comStore = useComStore()
const widget = computed(() => comStore.page.tempItems)
const page = computed(() => comStore.page)

const dropToAddCom = async (ev:DragEvent) => {
  ev.preventDefault()
  let index = ev.dataTransfer.getData('index')
  const rest = edit.value.getBoundingClientRect();
  await comStore.add(
      index,
      Math.round(ev.clientX - rest.x),
      Math.round(ev.clientY - rest.y)
  )
}
  • 在app.vue 初始化数据
const comStore = useComStore()

onMounted(()=>{
  //初始化数据
  comStore.initPage({
    title: 'demo',
    width: 566,
    height: 377,
    pageWidth: 150,
    pageHeight: 100,
    tempItems: []
  })
  comStore.initOptionItems(datas)
})

引入lodop

  • 在lodop官网下载 驱动

把其中的LodopFuncs.js 放入代码

  • 定义工具方法

主要功能是解析page的内容,生成Lodop代码执行

import getLodop from './LodopFuncs.js'
import {IPage, QYComponent} from "../domains/qy-component.ts";
import {createComHtml} from "../components/tool.ts";

export default {preview}

let strCompanyName = ''
let strLicense = ''
let strLicenseA = ''
let strLicenseB = ''

/**
 * 打印预览功能
 * @param {*Object} template 打印模板
 * @param {*Array} data 打印数据
 */
async function preview(template: IPage, data) {
    let LODOP = _createLodop(template.title, template.width, template.height, template.pageWidth, template.pageHeight)
    let tempItems = [...template.tempItems]
    if (data.length > 1) {
        // 打印多份
        for (let i = 0; i < data.length; i++) {
            LODOP.NewPageA()
            for (let index = 0; index < tempItems.length; index++) {
                await _addPrintItem(LODOP, tempItems[index], data[i])
            }
        }
    } else {
        // 单份
        for (let index = 0; index < tempItems.length; index++) {
            await _addPrintItem(LODOP, tempItems[index], data[0])
        }
    }
    LODOP.PREVIEW()
}

async function _addPrintItem(LODOP:any, printItem: QYComponent, data:any) {
    await createComHtml(printItem, data, LODOP);
    LODOP.SET_PRINT_STYLEA(0, "ItemType", printItem.itemType);
}


function _createLodop(pageName, width, height, pageWidth = 0, pageHeight = 0, top = 0, left = 0) {
    let LODOP = getLodop()
    // 设置软件产品注册信息
    LODOP.SET_LICENSES(strCompanyName, strLicense, strLicenseA, strLicenseB)
    LODOP.PRINT_INITA(top, left, width, height, pageName)
    LODOP.SET_PRINT_PAGESIZE(1, pageWidth ? pageWidth + 'mm' : 0, pageHeight ? pageHeight + 'mm' : 0, '')
    return LODOP
}
  • 定义HPText解析方法

首先在QYComponent  中定义一个 抽象函数 generatePrint

然后在HPText 中 实现 此函数

   generatePrint(LODOP, item, data){
        let html = this.toHtml(item, data);
        LODOP.ADD_PRINT_HTM(
            item.attr.y,
            item.attr.x,
            item.attr.width,
            item.attr.height,
            html
        )
    }

    toHtml(item, data):string{
        let txt = item.title;
        return `
            <div style="
              word-break:break-all;
              overflow: hidden;
              display: flex;
              font-size: 12pt;
              width: ${item.attr.width}px;
              height:${item.attr.height}px;
              white-space:pre-wrap;">${txt}</div>`;
    }

至此就实现了引入lodop 并预览

细心的可能发现了解析的方法里存在一个data参数,这个参数其实用于动态解析加载内容的,在toHtml中通过data以及item生成对应txt即可。

 效果

demo示例


http://www.niftyadmin.cn/n/5658344.html

相关文章

论文学习笔记 VMamba: Visual State Space Model

概览 这篇论文的动机源于在计算机视觉领域设计计算高效的网络架构的持续需求。当前的视觉模型如卷积神经网络&#xff08;CNNs&#xff09;和视觉Transformer&#xff08;ViTs&#xff09;在处理大规模视觉任务时展现出良好的表现&#xff0c;但都存在各自的局限性。特别是&am…

JS Web

Web API 浏览器内置window对象&#xff0c;是最顶层的对象&#xff1b; 它代表的是整个浏览器js运行环境&#xff0c;所以这个对象的属性方法可以直接在js代码中使用&#xff0c;无需加 window. 作为前缀&#xff1b; 所有其他对象都是它的属性&#xff0c;通过它我们可以访问到…

10大差异!Linux运维VS云计算运维深度解析

在当今这个信息技术飞速发展的时代&#xff0c;云计算与容器化技术已经变得无处不在。 随着这些技术的广泛应用&#xff0c;企业对于如何高效、稳定地运维自己的系统和服务提出了更高的要求。 Linux运维和云计算运维作为两种不同的运维模式&#xff0c;它们各自在技术实现、管…

猜数字困难版(1-10000)

小游戏&#xff0c;通过提示每次猜高或猜低以及每次猜中的位数&#xff0c;10次内猜中1-10000的一个数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…

浙大数据结构:04-树6 Complete Binary Search Tree

这道题利用了完全二叉树的性质&#xff0c;我也参考了一些代码写的。 &#xff08;自己一开始写了别的方法&#xff0c;但一直过不了最后一个测试点&#xff0c;红温了&#xff09; 机翻&#xff1a; 1、条件准备 用vector存输入的数据&#xff0c;另一个数组存输出的结果&a…

php 实现JWT

在 PHP 中&#xff0c;JSON Web Token (JWT) 是一种开放标准 (RFC 7519) 用于在各方之间作为 JSON 对象安全地传输信息。JWT 通常用于身份验证系统&#xff0c;如 OAuth2 或基于令牌的身份验证。 以下是一个基本的 PHP 实现 JWT 生成和验证的代码示例。 JWT 的组成部分 JWT …

【时时三省】(C语言基础)指针进阶 例题7

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 二维数组 第一个a 因为它有12个元素 每个元素占4个字节 所以就打印48 第二个a&#xff3b;0&#xff3d;&#xff3b;0&#xff3d; 表示是第一行第一个元素 所…

[M滑动窗口] lc 2555. 两个线段获得的最多奖品(滑动窗口+同向双指针+代码技巧)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;2555. 两个线段获得的最多奖品 2. 题目解析 挺有意思的一道题目&#xff0c;同向双指针简单dp 的思想。 思路&#xff1a; 题目要求枚举两个线段&#xff0c;其实可以想到经典题目「两数之和」。我们可以枚举…