DevExpress Office File API教程 - 如何使用AI服务增强Word文档可访问性和语言支持?

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装Microsoft Office,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CSV 和 Snap Report等企业级文件。

在之前两篇与AI相关的博客中,我们了解了如何使用DevExpress Office File API库和Azure AI OpenAI服务为Word和Excel文档中使用的图像、图表和超链接生成可访问的描述:

  1. DevExpress Office File API中文教程 - 如何用OpenAI模型增强Office文档可访问性?
  2. 界面组件DevExpress Office File API - 如何用OpenAI增强文档可访问性?

在这篇文章中,我们将详细介绍另一个易于访问的文档生成重要技巧——在多语言的Word文档中检测和设置段落的校对语言。此外,我们还将描述如何翻译多语言文档,以及如何生成可访问的注释,并将段落翻译为所选语言。

获取DevExpress v24.1正式版下载(Q技术交流:532598169)

在生成可访问的Word文档(特别是多语言文档)时,必须指定证明语言并为文本段落添加翻译,这有几个原因。语言设置帮助屏幕阅读器解释和发音文本,辅助功能和工具(如拼写/语法检查器)依赖于这些设置来提供准确的建议和更正。在将Word文档导出为可访问的PDF格式时,语言设置也很重要。带有段落翻译的注释有助于增加文档内容的清晰度,有助于文档的可访问性,并增强多语言环境中的协作。

为了满足这些特殊需求,我们将使用DevExpress Word Processing Document和两个Azure人工智能服务——语言和翻译。请在GitHub上的示例项目中查看这些功能的新端点:Office File API – Integrate AI。

在将此解决方案合并到您的应用程序之前,请务必阅读并理解Azure AI服务的使用条款和条件。

实现细节
使用Azure AI语言API

Azure AI语言服务需要Azure订阅,订阅后,在Azure门户网站中创建语言资源来获取密钥和端点。

注意:您可以创建多服务资源来访问具有相同密钥和端点的多个AI服务。

安装Azure.AI.TextAnalytics NuGet包到您的项目中,使用语言服务API进行文本语言检测。下面的代码片段对TextAnalyticsClient进行身份验证,向服务发送文本,服务返回有关检测到的语言的信息。对于这个实现,我们只需要“ISO 693-1”格式的语言名称。

public class AzureAILanguageHelper
{
private TextAnalyticsClient client;
internal AzureAILanguageHelper(string key, Uri endpoint)
{
AzureKeyCredential azureCredential = new AzureKeyCredential(key);
client = new TextAnalyticsClient(endpoint, azureCredential);
}
internal async Task<string> DetectTextLanguage(string text)
{
DetectedLanguage detectedLanguage = await client.DetectLanguageAsync(text);
return detectedLanguage.Iso6391Name.Replace('_', '-');
}
}
使用Azure AI Translator API

就像语言服务一样,Azure AI Translator也需要Azure订阅,您需要在Azure门户网站中创建Translator资源(或使用多服务资源)。

安装Azure.AI.Translation.Text NuGet包到您的项目中,并验证TextTranslationClient。

注意:如果使用Azure AI多服务或区域转换器资源,必须指定“region”参数用于客户端身份验证。

下面的代码片段发送文本/目标语言名称(采用“ISO 693-1”格式),并获得翻译后的内容作为响应。

public class AzureAITranslationHelper
{
TextTranslationClient client;
internal AzureAITranslationHelper(string key, Uri endpoint, string region = "global")
{
AzureKeyCredential azureCredential = new AzureKeyCredential(key);
client = new TextTranslationClient(azureCredential, endpoint, region);
}
internal async Task<string> TranslateText(string text, string sourceLanguage, string targetLanguage)
{
Response<IReadOnlyList<TranslatedTextItem>> response = await client.TranslateAsync(targetLanguage, text, sourceLanguage);
TranslatedTextItem translatedTextItem = response.Value.First();
return translatedTextItem.Translations[0].Text;
}
}
实现Word Processing Document API API端点

要在DevExpress驱动的Word Processing Document API应用程序中使用上面的API,请在RichEditDocumentServer实例中加载文档,并遍历Document.Paragraphs集合。使用Document.GetText方法获取段落文本,使用Document.BeginUpdateCharacters 方法访问段落字符属性。检查段落文本和字符设置 - 如果段落文本不为空并且语言设置(CharacterProperties.Language)未指定,则调用azureaillanguagehelper。DetectTextLanguage方法检测段落语言。完成后,将检测到的语言作为CultureInfo对象分配给CharacterProperties.Language属性,并使用Document.EndUpdateCharacters方法完成段落编辑。如果检测到的语言不同于默认文档语言(在当前示例中,我们假设默认语言是英语),则使用AzureAITranslationHelper.TranslateText方法将段落文本翻译为所需的语言。此时,您可以向当前段落添加注释,并在该注释中插入翻译后的文本。

public async Task<IActionResult> GenerateLanguageSettingsForParagraphs
(IFormFile documentWithHyperlinks,
[FromQuery] RichEditFormat outputFormat) {
try {
var languageHelper =
new AzureAILanguageHelper(languageAzureKey, languageEndPoint);
var translationHelper =
new AzureAITranslationHelper(translationAzureKey, translationEndPoint);
using (var server = new RichEditDocumentServer())
{
await RichEditHelper.LoadFile(server, documentWithHyperlinks);
server.IterateSubDocuments(async (document) =>
{
foreach (var paragraph in document.Paragraphs)
{
CharacterProperties cp =
document.BeginUpdateCharacters(paragraph.Range);
string paragraphText =
document.GetText(paragraph.Range);
if (cp.Language.Value.Latin ==
null && !string.IsNullOrWhiteSpace(paragraphText))
{
CultureInfo? culture = null;
string language =
languageHelper.DetectTextLanguage(paragraphText).Result;
try { culture = new CultureInfo((language)); }
catch { }
finally
{
if (culture != null)
{
// Set the paragraph language
cp.Language =
new DevExpress.XtraRichEdit.Model.LangInfo(culture, null, null);
if (language != "en")
{
// Generate an accessible comment with the paragraph translation
Comment comment =
document.Comments.Create(paragraph.Range, "Translator");
SubDocument commentDoc = comment.BeginUpdate();
string translatedText =
translationHelper.TranslateText(paragraphText, language, "en").Result;
commentDoc.InsertText(commentDoc.Range.Start,
$"Detected Language: {language}\r\nTranslation (en): {translatedText}");
comment.EndUpdate(commentDoc);
}
}
}
}
document.EndUpdateCharacters(cp);
}
});
Stream result =
RichEditHelper.SaveDocument(server, outputFormat);
string contentType =
RichEditHelper.GetContentType(outputFormat);
string outputStringFormat =
outputFormat.ToString().ToLower();
return File(result, contentType, $"result.{outputStringFormat}");
}
}
catch (Exception e)
{
return StatusCode(500, e.Message + Environment.NewLine + e.StackTrace);
}
}
检查输出

输出的Word文件将包括每个非空文档段落的语言设置(可在Language对话框中查看),以及每个非英语文本段落的相应翻译注释。

DevExpress Office File API教程 - 如何使用AI服务增强Word文档可访问性和语言支持?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用隐式事件执行控制图

什么是隐式事件&#xff1f; 隐式事件是图表执行时发生的内置事件&#xff1a; 图表唤醒 进入一个状态 退出状态 分配给内部数据对象的值 这些事件是隐式的&#xff0c;因为您没有显式地定义或触发它们。隐式事件是它们发生的图表的子级&#xff0c;仅在父图表中可见。 隐式事…

【AI生成】海上风电中卫星网络与无线自组网的应用分析

随着可再生能源的不断发展&#xff0c;海上风电作为其中的重要组成部分&#xff0c;在我国能源结构调整中占据越来越重要的地位。近年来&#xff0c;我国海上风电产业发展迅速&#xff0c;海上风电场数量和规模不断扩大&#xff0c;相应地&#xff0c;海上风电运维和安全保障的…

git branch -a 不显示远程分支修复

使用git remote -v命令&#xff0c;查看所有的远程仓库及其URL如果没有&#xff0c;说明没有远程仓库&#xff0c;继续往下走使用git remote add origin <url>命令来添加或修改远程仓库&#xff1a;其中<url>是远程仓库的正确URL&#xff0c;就是git项目的http的地…

实现Java中的图像处理功能

实现Java中的图像处理功能 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本篇文章中&#xff0c;我们将探讨如何在Java中实现图像处理功能。图像处理是计算机…

Embedding的概念和展开

前言 本章&#xff0c;我们介绍一个非常细的细节技术。让我们微调大模型的一些特性和能力。 在大模型的AI套路演化过程中&#xff0c;其实经历了太多的技术革新和方式变化&#xff0c;Embedding其实也可能是其中一个高速湮灭的技术点之一。 对比LoRA现在大红大紫&#xff0c…

每个 Node.js 开发人员都应该知道的13个库(下)

7. Sequelize Mongoose是一个Node。基于js的MongoDB对象建模工具&#xff0c;通常被称为对象数据建模&#xff08;ODM&#xff09;库&#xff0c;它提供了诸如钩子、模型验证、连接和查询等功能。 Mongoose为应用程序数据提供了一个基于模式的解决方案&#xff0c;它在应用程…

【JavaScript脚本宇宙】玩转数据存储:深入剖析提升 Web 应用程序性能的六大利器

从本地到云端&#xff1a;全面解析满足各种需求的高性能 JavaScript 数据库库 前言 本文将介绍几个流行的JavaScript数据库库&#xff0c;包括localForage、Dexie.js、PouchDB、LokiJS和NeDB。每个库都有自己的特点和适用场景。通过比较它们的功能和使用方式&#xff0c;可以…

论文翻译 | ITER-RETGEN:利用迭代检索生成协同增强检索增强的大型语言模型

论文地址&#xff1a;Enhancing Retrieval-Augmented Large Language Models with Iterative Retrieval-Generation Synergy 摘要 检索增强生成由于有望解决包括过时知识和幻觉在内的大型语言模型的局限性而引起广泛关注。然而&#xff0c;检索器很难捕捉相关性&#xff0c;尤…

BurpSuite2024.5.3专业版,仅支持Java21以上

01更新介绍 此版本引入了对 WebSocket 的 Burp Scanner 支持、对录制的登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。我们还删除了一些冗余的扫描检查。 Burp Scanner 对 WebSockets 的支持我们更新了内部代理的配置&#xff0c;以允许 WebSocket 流量。这使…

代码随想录算法训练营第五十一天| 115.不同的子序列、583. 两个字符串的删除操作、 72. 编辑距离

LeetCode 115.不同的子序列 题目链接&#xff1a;https://leetcode.cn/problems/distinct-subsequences/description/ 文章链接&#xff1a;https://programmercarl.com/0115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.html 思路 * dp[i][j]&#xff1a;以i-1…

Docker快速极简配置nginx实现不同域名访问分流

文章目录 前言安装配置使用镜像拉取及环境配置修改代理文件编写docker-compose文件启动nginx代理 总结 前言 本文主要记录如何使用docker安装配置Nginx&#xff0c;如何使用Nginx把通过80、443端口访问的请求根据域名分发到不同端口。那么什么是Nginx呢&#xff0c;下边做个简…

将产品制作成3D模型在网站上展示需要多少费用?

将产品制作成3D模型并在网站上展示的费用会因多种因素而异&#xff0c;包括模型的复杂度、所需的细节程度、制作3D模型的软件和工具、以及是否需要专业设计师的服务等。此外&#xff0c;不同的3D模型制作服务提供商可能会有不同的定价标准。 如果能自己制作3D模型&#xff0c;…

友力科技IDC机房搬迁方案流程分享

机房搬迁流程 系统搬迁实施流程包括&#xff1a;准备、拆卸、装运、安装、调试等五个流程&#xff0c;具体如下&#xff1a; 准备:包括相关人员和设备准备、新机房环境准备、网络环境、备份、现场所有设备打标签、模块、设备准备等准备工作。拆卸&#xff1a;主要只核心设备下…

iptables(2)安装及规则查询

安装iptables 我是用的系统是debian 12,目前没有安装iptables。 防火墙已经安装完成了 iptables 的配置语法 iptables (选项) (参数) # 通用匹配:源地址目标地址的匹配 -p:指定要匹配的数据包协议类型 -s, --source [!] address[/mask] :把指定的一个/一组地址作为源地…

防坑知识:如果要查自己的大数据信用报告,这几种平台一定不要选!

很多小伙伴在候遇到申贷碰壁&#xff0c;特别是被告知原因是大数据不良之后&#xff0c;都急着去了解自己的大数据信用情况&#xff0c;常见的方式就是在百度搜索大数据信用&#xff0c;大数据报告查询&#xff0c;哪里能查大数据信用等关键词&#xff0c;随便找一个地方就去查…

Python 中处理大量用户阅读历史数据的策略

Python 中处理大量用户阅读历史数据的策略 处理大量数据时&#xff0c;效率和性能成为关键考虑因素。Python 提供了一系列工具和技术&#xff0c;可以帮助我们高效地处理大数据集。以下是一些处理大量用户阅读历史数据的策略。 1. 使用合适的数据存储解决方案 对于大规模数据…

【深度C++】之“目录”

0. 关于【深度C】 2023年5月&#xff0c;看了一个月《C Primer&#xff08;第5版&#xff09;》的我&#xff0c;感觉很“头疼”。 虽然看了很多&#xff0c;但是并没有组织在一起。仿佛一个有很多线头的毛线团&#xff0c;无从整理。 比如一口气让你说出const的用法&#x…

不常见的逻辑漏洞

文章目录 1. 逻辑漏洞2. 理赔类逻辑漏洞3. 支付类漏洞3.1 超时未发货商品赔付漏洞3.2 骗取某宝运费险漏洞 4. 批量注册场景5. 享受特权用户功能6. 社交类型场景7. 购物类型场景8. 签约漏洞场景 1. 逻辑漏洞 逻辑漏洞不可以用扫描器去扫&#xff0c;漏洞&#xff0c;就是由于开发…

MVCC多版本并发控制机制、事务的隔离级别

目录 一、MVCC多版本并发控制机制 二、事务的隔离级别 一、MVCC多版本并发控制机制 1、定义&#xff1a; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并发控制&#xff09;一种并发控制机制&#xff0c;在数据库中用来控制并发执行的事务&#xf…

好消息!终于解决了!Coze工作流错误中断问题终于得到解决!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 解决方案 📒📝 常见的工作流中断问题📝 好消息来了!⚓️ 相关链接 ⚓️📖 介绍 📖 大家是否曾经遇到过这样的问题:在Coze平台辛辛苦苦设计的一个工作流,尤其是流程非常复杂和长的情况下,只要中间一个环节出错,整…