前言

最近公司需要使用Uniapp开发微信小程序,并且需要解析Word和Excel文档中的内容,于是专门预研这方面的技术实现,下面是我预研的结果:

1、自己实现
2、Dify实现
3、飞书Aili实现

下面详细说明如何实现:

自己实现

如果是自己实现的话,需要安装依赖包

pnpm install xlsx mammoth pdfjs-dist

注意:pdf需要设置

pdfjsLib.GlobalWorkerOptions.workerSrc = '//your-cdn-serve/js/pdf.js/pdf.worker.mjs';

下面是实现细节代码,这样就完成了读取文件功能,但是,安装这些包会导致Uniapp发布的小程序包太大,超出限制,所以不推荐,但是如果是Web项目,就当我没说!:

const readExcel = async (file) => {
    const buffer = await file.arrayBuffer();
    const workbook = XLSX.read(buffer, { type: 'array' });
    const sheetName = workbook.SheetNames[0];
    const worksheet = workbook.Sheets[sheetName];
    const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 });
    return jsonData;
};

const readDocx = async (file) => {
    const arrayBuffer = await file.arrayBuffer();
    const result = await mammoth.extractRawText({ arrayBuffer });
    return result.value;
};

const readPdf = async (file) => {
    const arrayBuffer = await file.arrayBuffer();
    const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise;

    let text = '';
    for (let i = 1; i <= pdf.numPages; i++) {
        const page = await pdf.getPage(i);
        const content = await page.getTextContent();
        const pageText = content.items.map((item) => item.str).join(' ');
        text += pageText + '\n';
    }
    return text;
};

const readText = async (file) => {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result);
        reader.onerror = reject;
        reader.readAsText(file);
    });
};

Dify实现

公司部署了Dify服务,所以尽情的玩,下面我将详细介绍如何使用。
首先打开Dify的开发后台,如下所示:

在这里插入图片描述

点击工作室并创建空白应用,如下所示:

在这里插入图片描述

在这里插入图片描述
点击创建即可。

下面是我配置好的工作流,如下所示:

在这里插入图片描述
详细介绍下节点设置:

1、开始结点

添加自定义参数fileUrl,字段类型是文件列表,当然你设置成单文件也是可以的。

在这里插入图片描述

2、文档提取器节点

输入变量设置成开始节点中的fileUrl,如下所示:

在这里插入图片描述
3、结束节点

结束节点,默认输出是文档提取的内容,所以默认就好。

在这里插入图片描述
这样就完成了工作流的配置了,现在我们可以调试一下,看看有没有问题:
在这里插入图片描述
可以看到,解析没有问题!

好了,我们发布一下应用,编排好工作流并发布之后,我们需要在Uniapp中集成,下面介绍下如何集成!

1、查看官方集成文档调用技能

在这里插入图片描述
可以看到,官方文档已经有了调用技能的示例代码,我们只要改装一下加到Uniapp中即可。

2、Uniapp调用Dify工作流

runWorkflow方法中实现了调用Dify工作流方法,这样就完成了调用。

// 在 UniApp 的页面或方法中
const runWorkflow = (fileUrl) => {
  // 替换为实际参数
  const apiKey = 'your_api_key_here';
  
  uni.request({
    url: 'http://agents.einwin.com/v1/workflows/run',
    method: 'POST',
    header: {
      'Authorization': `Bearer ${apiKey}`,
      'Content-Type': 'application/json'
    },
    data: {
      inputs: {
        "fileUrl": [ // 动态键名
          {
            transfer_method: "remote_url",
            url: fileUrl,
            type: "document"
          }
        ]
      },
      response_mode: "blocking",
      user: "abc-123"
    },
    success: (res) => {
      console.log('请求成功:', res.data);
    },
    fail: (err) => {
      console.error('请求失败:', err);
      uni.showToast({ title: '请求失败', icon: 'error' });
    }
  });
}

飞书Aili实现

公司是购买了飞书Aili服务,所以尽情的玩,下面我将详细介绍如何使用。
首先打开飞书aili的开发后台,这是我的飞书后台网页
在这里插入图片描述
点击创建工作流应用->点击从空白创建,点击确认,等待创建,创建好之后跳转下面页面:
在这里插入图片描述
点击编辑技能,如下所示:
在这里插入图片描述
这是最原始的工作流页面,下面是我配置好的工作流,如下所示:
在这里插入图片描述
详细介绍下节点设置:

1、开始结点

添加自定义参数fileUrl,用于设置需要提取的文件url路径
在这里插入图片描述

2、条件分支

因为我要解析两个类型的文档,一个word一个Excel,所以需要两个分支
在这里插入图片描述

3、分支1

如果fileUrl文件是Word则往下执行
在这里插入图片描述

4、解析Word

选择文档类型,以及待解析的文件fileUrl,以及输出result,选择MarkDown格式输出
在这里插入图片描述

5、分支2

如果fileUrl文件是Excel则往下执行
在这里插入图片描述

6、解析Excel

选择文档类型,以及待解析的文件fileUrl,以及输出result,选择MarkDown格式输出
在这里插入图片描述

7、最终结果和结束节点

在最终结果里面获取word和excel中的内容并输出到结束结点
在这里插入图片描述
这样就完成了工作流的配置了,现在我们可以调试一下,看看有没有问题:
在这里插入图片描述
可以看到,解析没有问题!

好了,我们发布一下应用,编排好工作流并发布之后,我们需要在Uniapp中集成,下面介绍下如何集成!

1、查看官方集成文档调用技能
在这里插入图片描述
在这里插入图片描述
可以看到,官方文档已经有了调用技能的示例代码,我们只要改装一下加到Uniapp中即可。

2、Uniapp调用飞书Aili技能

我们添加rechatForAili方法,注意调用这个方法前,我们需要设置AppIDSkillID,根据官方文档说明,我们可以直接到工作流的页面的浏览器URL中直接拿到,spring_开头的是AppID,skill_开头的 是SkillID。

接下来,我们要通过API获取tenant_access_token,根据官方文档说明,我们创建getFeishuTenantToken方法,如下所示:

async getFeishuTenantToken() {
      const appId = ""; // 替换为你的 App ID
      const appSecret = ""; // 替换为你的 App Secret

      try {
        const response = await uni.request({
          url: "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal",
          method: "POST",
          header: {
            "Content-Type": "application/json",
          },
          data: {
            app_id: appId,
            app_secret: appSecret,
          },
        });
        const resData = response[1].data
        if (resData.code === 0) {
          this.feishuToken = resData.tenant_access_token;
          this.error = null;
        } else {
          this.error = resData.msg || "获取 Token 失败";
        }
      } catch (err) {
        this.error = "请求失败,请检查网络或配置";
      }
    },

但是,我们还需要获取appId和appSecret,这个可以到发布应用的地方获取,点进去之后,我们就可以看到了。

在这里插入图片描述
在这里插入图片描述

好了,拿到了tenant_access_token,下面就可以调用飞书aili的工作流技能了,代码如下所示:

rechatForAili(fileUrl) {
      const appId = ''
      const skillId = ''
      if (this.feishuToken){
        uni.request({
          url: `https://open.feishu.cn/open-apis/aily/v1/apps/${appId}/skills/${skillId}/start`,
          method: 'POST',
          header: {
            'Authorization': `Bearer ${this.feishuToken}`,
            'Content-Type': 'application/json'
          },
          data: {
            "global_variable": {
              "query": ""
            },
            "input": JSON.stringify({
              fileUrl: fileUrl
            })
          },
          success: (res) => {
            if (res.data?.code === 0) {
              const resData = res.data.data
              if (resData.status === 'success' && resData.output) {
          			//成功,加自己的业务逻辑
              }
            }
          }
        });
      }
    },

这样就完成了在UniApp中调用飞书Aili技能来提取文件中的内容了。

注意:

1、rechatForAili方法中,我将fileUrl放到global_variable.query中,发现报错了,然后放到input中就成功了!

2、rechatForAili方法调用时,发现报错,官方文档说可以根据Code定位问题,然后发现是缺少权限,我们根据这个code,开通权限即可!
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/39786114bb554af99bfcad0b7a61f1d3.p

总结

1、Dify工作流和Aili工作流提取文档内容我没有用到LLM,这个要看你自己的场景需不需要了,因为我的小程序已经有了AI对话,所以只差提取文档内容的功能;
2、Dify提取文件内容不需要区分是什么类型的文件,比Aili的简单;
3、需要购买Aili服务才能使用,这个看你公司的情况了;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐