Typora导出html文件图片自动转换成base64

Typora导出html文件图片自动转换成base64

一、出现问题

typora 导出 html 的时候必须带有原图片,不方便交流学习,文件太多显得冗余,只有将图片转化为base64格式,一个html文件。

本文档下载链接:https://www.lanzv.com/i0XYv1myf3ne 密码:bay7

Jar包下载:https://www.lanzv.com/iekaA1myf3ja 密码:444r

Java代码下载:https://www.lanzv.com/iPon51myf3kb 密码:a1y5

typora最新版本及激活码:https://www.lanzv.com/b05evh1aj 密码:3jaa

二、解决方案

  • 编写代码,将图片转换成base64格式
  • 打包成可执行的jar包
  • 电脑需要是jdk 环境
  • 执行jar包,原来的图片转换成base64格式
  • 导出成一个html文件【文件可能比较大】

三、编码实现

3.1.创建Java项目




3.2.代码

本文档下载链接:https://www.lanzv.com/i0XYv1myf3ne 密码:bay7

Jar包下载:https://www.lanzv.com/iekaA1myf3ja 密码:444r

Java代码下载:https://www.lanzv.com/iPon51myf3kb 密码:a1y5

java 复制代码
package com.xiaoxiao.util;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class TyporaImageToBase64 {
    /**
     * @param src img src 内容
     * @param end 下次查找字符串起始位置
     * @return java.lang.String
     * @throws
     * @description 递归执行查找同一行字符串多个 img 标签
     */
    public static String execute(String src, int end) {
        String result = matchImg(src, end);
        if (result.isEmpty()) {
            return src;
        } else {
            String[] split = result.split(",");
            String s1 = fileToBase64(split[0]);
            if (s1.isEmpty()) {
                return src;
            } else {
                String replace = src.replace(split[0], s1);
                return execute(replace, Integer.valueOf(split[1]) + 20);
            }
        }
    }

    /**
     * @param str 原始字符串
     * @return java.lang.String
     * @Description 匹配 img src 内容
     **/
    public static String matchImg(String str, int start) {
        int img = str.indexOf("<img", start); // 起始位置
        if (img == -1) {
            return "";
        }
        int l = str.indexOf("\"", img) + 1; // src 左侧 双引号
        int r = str.indexOf("\"", l); // src 右侧 双引号
        String substring = str.substring(l, r);
        if (substring.startsWith("data")) { // 跳过已经 base64 编码的文件 和 http 地址
            return matchImg(str, r);
        }
        return substring + "," + r; // src 地址 返回 src 内容以及最后的位置 使用逗号拼接
    }

    /**
     * @param path 文件路径
     * @return java.lang.String
     * @Description 文件转 base64
     **/
    public static String fileToBase64(String path) {
        File file = new File(path);
        if (!file.exists()) {
            System.err.printf("File not exist!");
            return "";
        }
        byte bytes[] = null;
        try (FileInputStream fileInputStream = new FileInputStream(path);) {
            bytes = new byte[fileInputStream.available()];
            fileInputStream.read(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Image convert base64 fail!");
        }
        // 文件后缀处理
        String suffix = getSuffix(path);
        return "data:image/" + suffix + ";base64," + Base64.getEncoder().encodeToString(bytes);
    }

    /**
     * @param str
     * @return java.lang.String
     * @throws
     * @description 获取文件后缀
     */
    public static String getSuffix(String str) {
        return str.substring(str.lastIndexOf(".") + 1);
    }

    // 主方法
    public static void main(String[] args) {
        // 获取文件路径
        if (args.length == 0) {
            System.out.println("No parameters passed");
            return;
        }
        String arg = args[0];
        // 获取文件后缀
        String suffix = getSuffix(arg);
        File srcFile = new File(arg);

        File outFile = new File(arg.replace("." + suffix, "").concat("-base64.").concat(suffix));
        try (BufferedReader bfr = new BufferedReader(new InputStreamReader(new FileInputStream(srcFile), StandardCharsets.UTF_8));
             BufferedWriter bfw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),StandardCharsets.UTF_8))
        ) {
            String len = "";
            while ((len = bfr.readLine()) != null) {
                String result = "";
                if (len.indexOf("<img") != -1) {
                    result = execute(len, 0);
                }
                if (result.equals("")) {
                    bfw.write(len);
                } else {
                    bfw.write(result);
                }
            }
            //必须关闭IO流,否则无法操作文件
            bfr.close();
            bfw.close();
            //成功,删除转换成功的源文件
            boolean resultDelete = srcFile.delete();
            System.out.println("Sorce file delete finish, " + resultDelete);
            boolean reultRename = outFile.renameTo(srcFile);
            System.out.println("Out file rename finish, " + reultRename);
            System.out.println("File convert success!");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("error");
            System.out.println("File convert fail!");
        }

    }
}

3.3.打包成Jar包






四、如何使用

找到自己的jar包路径

java 复制代码
java -jar 【TyporaImageToBase64.jar路径】 "${outputPath}"


java -jar D:\JAVA\Typora\TyporaImageToBase64.jar "${outputPath}"



endl

相关推荐
QQ_19632884751 天前
Python-flask框架西山区家政服务评价系统网站设计与开发-Pycharm django
python·pycharm·flask
闪电橘子7 天前
Pycharm运行程序报错 Process finished with exit code -1066598273 (0xC06D007F)
ide·python·pycharm·cuda
我要七分甜7 天前
Pycharm中Anaconda的详细配置过程
python·pycharm
Franklin7 天前
2025-11-28日,天塌了,Pycharm将不开源了!!最后一个开源社区版本2025.2.5
ide·python·pycharm
wx_bishe2887 天前
python社区流浪动物猫狗救助救援网站_4a4i2--论文_pycharm django vue flask
python·pycharm·django·毕业设计
澾慟7 天前
PyCharm Remote Interpreter连接远程服务器运行IndexTTS2
pycharm· indextts2· remote interpreter
智慧地球(AI·Earth)7 天前
在Windows上使用Claude Code并集成到PyCharm IDE的完整指南
ide·人工智能·windows·python·pycharm·claude code
思绪无限7 天前
使用Conda创建Python环境并在PyCharm中配置运行项目
python·pycharm·conda·安装教程·python环境配置·环境配置教程
前端小旋风7 天前
pycharm 2025 专业版下载安装教程【附安装包】
python·pycharm
喵~来学编程啦7 天前
【一篇搞定配置】一篇带你从配置到使用(PyCharm远程)完成服务器运行项目(配置、使用一条龙)【全网最详细版】
服务器·python·pycharm