在使用
markdown
工具typora
编写文档时,由于里面会插入一些本地的图片,当我们把文档导出html
时发给其他人时,由于找不到图片对应的文件,会导致图片无法显示。此文将介绍使用扩展命令的方式在导出html
时将图片转换成base64
内嵌到html
文件中,具体参考如下:
- 修复中文乱码;
- 导出完成后删除源文件,并重命名为源文件名称。
1. 编写Java
代码生成扩展jar包
需要借助
Java
代码进行操作,重新读取已导出的文件,并转换文件中的图片为base64。已编写好的jar
包下载地址(如果直接下载可以直接跳到第2章节):点击下载TyporaToBase64.jar
- 代码实现
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!");
}
}
}
-
打包jar
1. 进入项目配置
2. 打开Artifacts选项卡
3. 点击新增
4. 选择JAR配置
5. Create JAR from Modules
6. 选择模块
7. 点击确定
8. 点击确定
9. 选择Build Artifacts
10. 选择Build
11. 查看输出Jar包 - 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/
网友评论