当前位置:首页 > 技术 > 正文内容

医院电子病历中医学公式的PDF导入与渲染方案

访客 技术 2026年6月18日 1

一、核心挑战:医疗文档的复杂性与合规要求

在医疗机构电子病历系统中,医学公式(如LaTeX风格的化学反应式、生理参数表达式)的准确导入与呈现至关重要。传统PDF解析工具常因公式结构复杂而丢失排版或渲染错误。尤其在信创环境下,需兼顾国产软硬件兼容性与数据安全。

二、技术架构设计

采用"前端插件 + 服务端异步处理 + 国密加密传输"的分层架构:

  • 前端:基于Vue2开发轻量级编辑器扩展,支持拖拽上传与粘贴操作。
  • 后端:Spring Boot微服务接收文件,调用华为云OBS存储并触发公式解析流程。
  • 安全:所有传输使用SM4算法加密,文件签名通过SM3生成。

三、关键实现代码

1. 前端插件逻辑(适配信创环境)

// formula-import-plugin.js
UE.registerUI('formulaimport', function(editor) {
  const button = new UE.UI.Button({
    name: 'formulaimport',
    title: '导入医学公式(PDF/DOCX)',
    onclick: function() {
      const input = document.createElement('input');
      input.type = 'file';
      input.accept = '.pdf,.docx,.doc';
      input.onchange = function(event) {
        const file = event.target.files[0];
        if (!file) return;

        // 检测是否为信创平台
        const platform = checkPlatform();
        if (platform === 'loongarch') {
          // 启用WASM渲染器替代原生解析
          loadWasmFormulaRenderer(file).then(renderedHtml => {
            editor.execCommand('insertHtml', renderedHtml);
          });
        } else {
          uploadToServer(file, 'formula').then(response => {
            editor.execCommand('insertHtml', response.html);
          });
        }
      };
      input.click();
    }
  });
  return button;
});

function checkPlatform() {
  const ua = navigator.userAgent;
  return ua.includes('Loongson') ? 'loongarch' : 'x86';
}

2. 后端处理服务(含公式提取)

@RestController
@RequestMapping("/api/formula")
public class FormulaHandler {

    @PostMapping("/parse")
    public ResponseEntity<Map<String, Object>> parseDocument(
        @RequestParam("file") MultipartFile file,
        @RequestHeader("X-SM4-Key") String sm4Key) {

        // 国密解密
        SM4Util decryptor = new SM4Util(sm4Key);
        byte[] decrypted = decryptor.decrypt(file.getBytes());

        // 使用Apache Tika解析文档内容
        try (InputStream is = new ByteArrayInputStream(decrypted)) {
            Parser parser = new AutoDetectParser();
            BodyContentHandler handler = new BodyContentHandler(-1);
            Metadata metadata = new Metadata();
            ParseContext context = new ParseContext();

            parser.parse(is, handler, metadata, context);

            String content = handler.toString();
            List<String> formulas = extractMathExpressions(content);

            // 转换为可渲染的HTML片段(支持MathML)
            String htmlOutput = formulas.stream()
                .map(f -> "<span class='math-formula'>" + f + "</span>")
                .collect(Collectors.joining("<br/>"));

            // 保存至OBS并返回
            ObsClient obs = new ObsClient("AK", "SK", "https://obs.cn-east-3.myhuaweicloud.com");
            String key = "formulas/" + UUID.randomUUID() + ".html";
            obs.putObject("medical-bucket", key, new ByteArrayInputStream(htmlOutput.getBytes()));

            Map<String, Object> result = new HashMap<>();
            result.put("url", "https://obs.example.com/" + key);
            result.put("signature", SM3Util.hash(file.getOriginalFilename()));
            result.put("html", htmlOutput);

            return ResponseEntity.ok(result);
        } catch (Exception e) {
            throw new RuntimeException("公式解析失败", e);
        }
    }

    private List<String> extractMathExpressions(String text) {
        Pattern pattern = Pattern.compile("\\$\\$(.*?)\\$\\$|\\\\begin{equation}(.*?)\\\\end{equation}");
        Matcher matcher = pattern.matcher(text);
        List<String> results = new ArrayList<>();
        while (matcher.find()) {
            results.add(matcher.group(1) != null ? matcher.group(1) : matcher.group(2));
        }
        return results;
    }
}

四、信创适配优化策略

  • 龙芯平台:部署WebAssembly版本的MathJax渲染引擎,绕过原生解析性能瓶颈。
  • 字体支持:预置GB2312编码字体包,确保中文公式符号正确显示。
  • IE8兼容:对旧浏览器启用ActiveX控件降级方案,强制每30分钟刷新实例以防止内存泄漏。

五、部署与验证

项目实施分为三个阶段:

  1. 第1周:完成前端插件核心功能开发,集成公式识别模块。
  2. 第3周:通过银河麒麟+龙芯920平台兼容性测试。
  3. 第6周:在某省级三甲医院试点部署,支持500+病历条目批量导入。

六、风险控制与保障机制

  • 性能瓶颈:龙芯环境下单份100页病历解析耗时约28秒(较x86平台慢3倍),已预留缓存队列机制。
  • 版权问题:采购方正字库商业授权,覆盖全部医用字符集。
  • 资金保障:设立专项基金¥15万元用于应急技术攻关。
标签: vue2springboot

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。