Vue3 在线 PDF 编辑 1.0 文字、圆、矩形批注

各位开发者朋友,继上次分享 PDF 画线批注的实现方案后,今天继续为大家解析 基于 Vue3 的在线 PDF 编辑 1.0 项目诞生记 中其他核心功能的技术细节。接下来,我们将深入探讨文字批注、图形批注等功能的具体实现。

基于 fabric-Canvas 的文字批注:交互设计与技术实现

在 fabric-Canvas 提供的多种文字处理方案中,本项目选用了 fabric.IText 组件实现文字批注功能。该组件具备丰富的自定义属性,可满足大部分批注场景需求,若开发者有特殊需求,也可参考 fabric 官方文档选择其他适配方案。在交互设计上,项目采用长按触发文字添加的方式,该设计平衡了误触概率与操作便捷性,当然开发者也可根据实际需求调整交互逻辑。

typescript 复制代码
const startLine = async (event: { page: string, canvas: any }, e: any) => {
    if (drawConfig.value.type === "text") {
        longPressTimer = setTimeout(() => {
            addText(event, e);
        }, 1000);
        return
    }
}

上述代码在鼠标按下事件中,通过判断当前批注类型是否为文字,并设置 1 秒的长按检测机制,超时后触发 addText 方法创建文字批注:

php 复制代码
const addText = (event: { page: string, canvas: any }, e: any) => {
    const currentIText = new fabric.IText("双击输入文本", {
        left: e.pointer.x,
        top: e.pointer.y,
        fontSize: drawConfig.value.fontSize,
        fill: drawConfig.value.fontColor,
        editable: true,
        lockScalingFlip: true, 
        lockUniScaling: true 
    });
    event.canvas.add(currentIText)
    event.canvas.requestRenderAll();
}

通过实例化 fabric.IText 对象,设置文字的位置、样式及交互属性,最终将其添加至 canvas 画布并完成渲染。

基于 fabric-Canvas 的圆、矩形批注:图形绘制的统一处理逻辑

圆形与矩形批注的实现遵循相似的技术路径,通过判断当前批注类型,调用对应的 fabric 图形组件完成绘制:

ini 复制代码
if (drawConfig.value.type === "round") {
    isDraw = true
    downPoint = { x: pointer.x, y: pointer.y };
    currentObjet = new fabric.Circle({
        left: pointer.x,
        top: pointer.y,
        radius: 0,
        fill: 'transparent',
        stroke: drawConfig.value.lineColor,
        strokeWidth: drawConfig.value.lineWidth,
        selectable: true
    });
    event.canvas.add(currentObjet);
} else if (drawConfig.value.type === "rect") {
    isDraw = true
    downPoint = { x: pointer.x, y: pointer.y };
    currentObjet = new fabric.Rect({
        left: pointer.x,
        top: pointer.y,
        width: 0,
        height: 0,
        fill: 'transparent',
        stroke: drawConfig.value.lineColor,
        strokeWidth: drawConfig.value.lineWidth,
        selectable: true
    });
    event.canvas.add(currentObjet);
}

在用户操作过程中,所有批注元素均支持选中、拖拽及删除操作。通过监听键盘事件,实现删除功能:

ini 复制代码
const handleKeyDown = (e: { key: string }) => {
    if (e.key === 'Delete') {
        const activeObject = fabricCanvas.getActiveObject();
        if (activeObject) {
            fabricCanvas.remove(activeObject);
            fabricCanvas.renderAll();
        }
    }
};

当用户按下 Delete 键时,系统获取当前选中的批注对象并将其从画布中移除,确保操作的流畅性与灵活性。

以上为本项目文字、圆形及矩形批注功能的核心实现方案。后续将带来下载与保存功能的详细解析,并计划在 2.0 版本中新增缩放、图片添加等功能。欢迎各位开发者前往 项目仓库 获取源码,也期待在评论区与大家探讨更多功能优化方向,共同完善项目生态。

相关推荐
2501_915918411 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
程序员的世界你不懂2 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技2 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip2 小时前
JavaScript二叉树相关概念
前端
attitude.x3 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java3 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)3 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5
猫头虎-前端技术4 小时前
浏览器兼容性问题全解:CSS 前缀、Grid/Flex 布局兼容方案与跨浏览器调试技巧
前端·css·node.js·bootstrap·ecmascript·css3·媒体
阿珊和她的猫4 小时前
探索 CSS 过渡:打造流畅网页交互体验
前端·css