菜鸡一匹 2020-04-13 19:34 采纳率: 0%
浏览 370
已结题

JAVA将SVG转换成element对象和XML,翻译其中的汉字后再转换回SVG

项目需求上传多个SVG图片将其中的汉字翻译后再下载成zip包,自己技术很菜于是在网上找了很久大佬们的方法集中起来,自己记录一下,方便以后学习!

首先上POM依赖

        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-codec</artifactId>
            <version>1.7</version>
        </dependency>

        <dependency>
            <groupId>batik</groupId>
            <artifactId>batik-transcoder</artifactId>
            <version>1.6-1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jxpath</artifactId>
            <version>1.4.0</version>
        </dependency>

SVG转换代码:

/**
     * 解析svg
     * @param file 当前文件
     * @param vehicleCode 车型号
     * @throws Exception
     */
    public File analysisSVG(File file,String vehicleCode) throws Exception {
        //当前登录人
        SysUserEntity su = sysUserService.getById(getUserId());

        List<OnlineTranslationEntity> list = new ArrayList<>();

        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
        Document doc = f.createDocument(file.toURI().toString());

        //转换成XML格式
        /*Element element1 = doc.getDocumentElement();
        String elementStr1 = convertElemToSVG(element1);
        System.out.println("XML内容是:"+elementStr1);*/


        //存放翻译后的集合
        List<String> yingyu = new ArrayList<>();
        //拿到所有text标签的内容
        NodeList text = doc.getDocumentElement().getElementsByTagName("text");
        //遍历text里面的所有内容
        for (int i = 0; i < text.getLength(); i++) {
            //拿到当前text标签里面的内容
            String textContent = text.item(i).getTextContent();
            //进行汉字判断
            Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
            Matcher isNum = p.matcher(textContent);
            if (isNum.find()) {
                ElectricApplianceEntity chinese = dataService.getOne(new QueryWrapper<ElectricApplianceEntity>().eq("parts_chinese", textContent));
                if(chinese == null){
                    OnlineTranslationEntity onlineTranslationEntity = new OnlineTranslationEntity();
                    onlineTranslationEntity.setCreateUser(su.getUsername());
                    onlineTranslationEntity.setCreateDate(new Date());
                    onlineTranslationEntity.setTranslationWords(textContent);
                    onlineTranslationEntity.setVehicleNumber(vehicleCode);
                    list.add(onlineTranslationEntity);


                    ElectricApplianceEntity chinese1 = new ElectricApplianceEntity();
                    chinese1.setPartsEnglish("暂无该词汇");
                    chinese = chinese1;
                }
                text.item(i).setTextContent(chinese.getPartsEnglish());
                yingyu.add(chinese.getPartsEnglish());
            }
        }
        //去重
        list = list.stream().collect(
                Collectors.collectingAndThen(Collectors.toCollection(
                        () -> new TreeSet<>(Comparator.comparing(o -> o.getTranslationWords()))), ArrayList::new)
        );
        this.saveBatch(list);

        //输出成SVG文件
        Transformer t = TransformerFactory.newInstance().newTransformer();
        FileOutputStream stream = new FileOutputStream(file);
        t.transform(new DOMSource(doc), new StreamResult(stream));
        //关闭流
        stream.close();
        return file;
    }


    /**
     * 将element转换成XML字符串
     * @param element
     * @return
     */
    public String convertElemToSVG(Element element) {
        TransformerFactory transFactory = TransformerFactory.newInstance();
        Transformer transformer = null;
        try {
            transformer = transFactory.newTransformer();
        } catch (TransformerConfigurationException e) {
            e.printStackTrace();
        }
        StringWriter buffer = new StringWriter();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        try {
            transformer.transform(new DOMSource(element), new StreamResult(buffer));
        } catch (TransformerException e) {
            e.printStackTrace();
        }
        String elementStr = buffer.toString();
        return elementStr;
    }
  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 23:37
    关注

    参考GPT和自己的思路:

    好的,针对你的问题,我可以给你以下回答:

    这段代码主要实现了将 SVG 文件中的汉字进行翻译并替换为对应的英文单词,同时将 SVG 文件保存为新的文件。其中使用了 Batik 库来处理 SVG 文件,使用 JXPath 库来处理 XML 文件。具体步骤如下:

    1. 在 POM 文件中添加 Batik 和 JXPath 两个库的依赖。

    2. 使用 SAXSVGDocumentFactory 类将 SVG 文件解析成 Document 对象。

    3. 遍历 SVG 文件中的所有 text 标签,对其中包含汉字的文本进行翻译,并将翻译后的结果替换原文本内容。

    4. 将翻译后的 Document 对象保存成新的 SVG 文件。

    5. 将 Document 对象转换成 XML 字符串,如果需要的话。

    需要注意的是,上述代码可能还需要一些其他的辅助方法,比如:

    • 获取当前登录用户的信息。
    • 将翻译结果存储到数据库中。
    • 对 List 集合进行去重。

    另外,如果需要将 SVG 文件转换成 XML 字符串,可以使用 Transformer 的 transform 方法将 Document 对象转换成 StreamResult,然后使用 StringWriter 将 StreamResult 转换成字符串。

    希望以上回答对你有帮助。如果还有其他问题,欢迎继续咨询我。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月21日

悬赏问题

  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)