美文网首页山川
Typora导出html文件时图片自动转换成base64

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

作者: 天天小志 | 来源:发表于2021-10-20 19:21 被阅读0次

在使用markdown工具typora编写文档时,由于里面会插入一些本地的图片,当我们把文档导出html时发给其他人时,由于找不到图片对应的文件,会导致图片无法显示。此文将介绍使用扩展命令的方式在导出html时将图片转换成base64内嵌到html文件中,具体参考如下:

注:参考了文章,由于使用时中文发生了乱码,做了一些修改:

  1. 修复中文乱码;
  2. 导出完成后删除源文件,并重命名为源文件名称。

1. 编写Java代码生成扩展jar包

需要借助Java代码进行操作,重新读取已导出的文件,并转换文件中的图片为base64。已编写好的jar包下载地址(如果直接下载可以直接跳到第2章节):点击下载TyporaToBase64.jar

  1. 代码实现
package com.ttxz.imagetobase64;

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

public class Main {
    /**
     * @param src img src 内容
     * @param end 下次查找字符串起始位置
     * @return java.lang.String
     * @throws
     * @description 递归执行查找同一行字符串多个 img 标签
     * @date 2021/10/1 11:07
     * @Author Mr.Fang
     */
    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 内容
     * @date 2021/9/30 0030 16:32
     * @auther Mr.Fang
     **/
    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
     * @date 2021/9/30 0030 16:37
     * @auther Mr.Fang
     **/
    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 获取文件后缀
     * @date 2021/10/1 16:43
     * @Author Mr.Fang
     */
    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!");
        }

    }
}
  1. 打包jar


    1. 进入项目配置
    2. 打开Artifacts选项卡
    3. 点击新增
    4. 选择JAR配置
    5. Create JAR from Modules
    6. 选择模块
    7. 点击确定
    8. 点击确定
    9. 选择Build Artifacts
    10. 选择Build
    11. 查看输出Jar包
  2. Typora配置
  • Typora提供了导出后可以执行自定义命令
  • 首先将生成的Jar或是下载的,复制到Typora的安装目录下(默认安装路径是:C:\Program Files\Typora
  • 打开Typora,依次点击文件-偏好设置-导出-HTML
  • 勾选运行自定义命令和显示命令行输出
  • 在自定义命令处输入自定义的指令(依赖java环境):
java -jar C:\Program" "Files\Typora\TyporaToBase64.jar "${outputPath}"
  • 配置完成后如图示:


    Typora配置自定义命令
  • 最终导出的输出示例:


    Typora导出成功示例
  • 注:更多参数信息查看官网 https://support.typora.io/Export/

相关文章

网友评论

    本文标题:Typora导出html文件时图片自动转换成base64

    本文链接:https://www.haomeiwen.com/subject/vstxaltx.html