项目使用背景
内部使用的文件管理系统,实现doc,docx文件的在线预览功能;整体功能类似于知网的功能缩减版:文件的管理,在线预览,查重功能。其中还使用到pdf2htmlEX实现pdf转html,最终实现文章重复部分标红操作。
-- 同OpenOffice4使用篇
优点:
格式完美转换,样式一模一样,解析的html标签还算工整。
缺点:
Linux安装太麻烦了(但是我用docker,一切环境都不是事儿)
格式和html标签没法自定义,html的后续操作难度加大
插件的安装方法
查看作者GitHub里面有最原始的方法,也是最好的。
linux安装起来比较的麻烦,每个版本的系统可能都不一样,有些没办法装上。
最简单的方法就是使用安装好的docker镜像,把自己的开发环境集成上去就ok了。
2019329-195816.jpg
docker search pdf2htmlEX
找了个熟悉系统的版本,centos。项目打包上句就ok了
插件使用方法
插件是以调用命令执行的,所以只要能掉命令就行
java采用 Runtime.getRuntime() 来运行
以下是java代码示例
import org.apache.commons.lang3.StringUtils;
import java.io.File;
/**
* pdf转html工具类
*
* @author 1nchaos
* @date 2019/3/7 13:20
*/
public class Pdf2HtmlUtil {
/**
* 调用pdf2htmlEX将pdf文件转换为html文件
*
* @param exeFilePath pdf2htmlEX.exe文件路径
* @param pdfFile pdf文件绝对路径
* @param destDir 生成的html文件存放路径
* @param htmlFileName 生成的html文件名称
* @return
*/
public static boolean pdf2html(String exeFilePath, String pdfFile, String htmlFileName) {
if (StringUtils.isBlank(exeFilePath) && StringUtils.isBlank(pdfFile)
&& StringUtils.isBlank(htmlFileName)) {
System.out.println("传递的参数有误!");
return false;
}
Runtime rt = Runtime.getRuntime();
StringBuilder command = new StringBuilder();
command.append(exeFilePath).append(" ");
// 生成文件存放位置,需要替换文件路径中的空格
// if (destDir != null && !"".equals(destDir.trim())) {
// command.append("--dest-dir ").append(destDir.replace(" ", "\" \"")).append(" ");
// }
// 尽量减少用于文本的HTML元素的数目 (default: 0)
command.append("--optimize-text 1 ");
command.append("--zoom 1.4 ");
// html中显示链接:0——false,1——true
command.append("--process-outline 0 ");
// 嵌入html中的字体后缀(default ttf)
command.append("--font-format woff ");
// ttf,otf,woff,svg 需要替换文件路径中的空格
command.append(pdfFile.replace(" ", "")).append(" ");
if (!"".equals(htmlFileName.trim())) {
command.append(htmlFileName.replaceAll(" ", ""));
if (!htmlFileName.contains(".html")) {
command.append(".html");
}
}
if (streamPrintInfo(rt, command)) return true;
return false;
}
/**
* 调用pdf2htmlEX将pdf文件转换为html文件
*
* @param exeFilePath pdf2htmlEX.exe文件路径
* @param pdfFile pdf文件绝对路径
* @param destDir 生成的html文件存放路径
* @param htmlFileName 生成的html文件名称
* @return
*/
public static boolean pdf2html(String exeFilePath, String pdfFile, String htmlFileName, String destDir) {
if (StringUtils.isBlank(exeFilePath) && StringUtils.isBlank(pdfFile)
&& StringUtils.isBlank(htmlFileName)) {
System.out.println("传递的参数有误!");
return false;
}
Runtime rt = Runtime.getRuntime();
StringBuilder command = new StringBuilder();
command.append(exeFilePath).append(" ");
// 生成文件存放位置,需要替换文件路径中的空格
if (destDir != null && !"".equals(destDir.trim())) {
command.append("--dest-dir ").append(destDir.replace(" ", "\" \"")).append(" ");
}
// 尽量减少用于文本的HTML元素的数目 (default: 0)
command.append("--optimize-text 1 ");
command.append("--zoom 1.4 ");
// html中显示链接:0——false,1——true
command.append("--process-outline 0 ");
// 嵌入html中的字体后缀(default ttf)
command.append("--font-format woff ");
// ttf,otf,woff,svg 需要替换文件路径中的空格
command.append(pdfFile.replace(" ", "\" \"")).append(" ");
if (!"".equals(htmlFileName.trim())) {
command.append(htmlFileName);
if (!htmlFileName.contains(".html")) {
command.append(".html");
}
}
if (streamPrintInfo(rt, command)) return true;
return false;
}
/**
* @param pdfFile
* @param destDir 生成的html文件存放路径
* @return
*/
public static boolean pdf2htmlLinux(String pdfFile, String destDir) {
if (StringUtils.isBlank(pdfFile) && StringUtils.isBlank(destDir)) {
System.out.println("传递的参数有误!");
return false;
}
Runtime rt = Runtime.getRuntime();
StringBuilder command = new StringBuilder();
command.append("pdf2htmlEX").append(" ");
// 尽量减少用于文本的HTML元素的数目 (default: 0)
command.append("--optimize-text 1 ");
command.append("--zoom 1.4 ");
// html中显示链接:0——false,1——true
command.append("--process-outline 0 ");
// 嵌入html中的字体后缀(default ttf)
command.append("--font-format woff ");
// ttf,otf,woff,svg 需要替换文件路径中的空格
command.append(pdfFile.replace(" ", "\" \"")).append(" ");
// 生成文件存放位置,需要替换文件路径中的空格
if (destDir != null && !"".equals(destDir.trim())) {
command.append("--dest-dir ").append(destDir.replace(" ", "\" \"")).append(" ");
}
return streamPrintInfo(rt, command);
}
public static boolean pdf2htmlLinux(String pdfFile, String htmlFileName, String destDir) {
if (StringUtils.isBlank(pdfFile) && StringUtils.isBlank(htmlFileName)) {
System.out.println("传递的参数有误!");
return false;
}
Runtime rt = Runtime.getRuntime();
StringBuilder command = new StringBuilder();
command.append("pdf2htmlEX").append(" ");
// 生成文件存放位置,需要替换文件路径中的空格
if (destDir != null && !"".equals(destDir.trim()))
command.append("--dest-dir ").append(destDir.replace(" ", "\" \"")).append(" ");
// 尽量减少用于文本的HTML元素的数目 (default: 0)
command.append("--optimize-text 1 ");
command.append("--zoom 1.4 ");
// html中显示链接:0——false,1——true
command.append("--process-outline 0 ");
// 嵌入html中的字体后缀(default ttf)
command.append("--font-format woff ");
// ttf,otf,woff,svg 需要替换文件路径中的空格
command.append(pdfFile.replace(" ", "\" \"")).append(" ");
if (!"".equals(htmlFileName.trim())) {
command.append(htmlFileName);
if (!htmlFileName.contains(".html")) {
command.append(".html");
}
}
if (streamPrintInfo(rt, command)) return true;
return false;
}
private static boolean streamPrintInfo(Runtime rt, StringBuilder command) {
try {
System.out.println("Command:" + command.toString());
Process p = rt.exec(command.toString());
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
// 开启屏幕标准错误流
errorGobbler.start();
StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");
// 开启屏幕标准输出流
outGobbler.start();
int w = p.waitFor();
int v = p.exitValue();
if (w == 0 && v == 0) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
以下是命令参数
用法: pdf2htmlEX [options] []
-f,--first-page 需要转换的起始页 (默认: 1)
-l,--last-page 需要转换的最后一页 (默认: 2147483647)
--zoom 缩放比例
--fit-width 适合宽度 像素
--fit-height 适合高度 像素
--use-cropbox 使用剪切框 (default: 1)
--hdpi 图像水平分辨率 (default: 144)
--vdpi 图像垂直分辨率 (default: 144)
--embed 指定哪些元素应该被嵌入到输出
--embed-css 将CSS文件嵌入到输出中 (default: 1)
--embed-font 将字体文件嵌入到输出中 (default: 1)
--embed-image 将图片文件嵌入到输出中 (default: 1)
--embed-javascript 将javascript文件嵌入到输出中 (default: 1)
--embed-outline 将链接嵌入到输出中 (default: 1)
--split-pages 将页面分割为单独的文件 (default: 0)
--dest-dir 指定目标目录 (default: ".")
--css-filename 生成的css文件的文件名 (default: "")
--page-filename 分割的网页名称 (default:"")
--outline-filename 生成的链接文件名称 (default:"")
--process-nontext 渲染图行,文字除外 (default: 1)
--process-outline 在html中显示链接 (default: 1)
--printing 支持打印 (default: 1)
--fallback 在备用模式下输出 (default: 0)
--embed-external-font 嵌入局部匹配的外部字体 (default: 1)
--font-format 嵌入的字体文件后缀 (ttf,otf,woff,svg) (default: "woff")
--decompose-ligature 分解连字-> fi (default:0)
--auto-hint 使用fontforge的autohint上的字体时不提示 (default: 0)
--external-hint-tool 字体外部提示工具 (overrides --auto-hint) (default: "")
--stretch-narrow-glyph 伸展狭窄的字形,而不是填充 (default: 0)
--squeeze-wide-glyph 收缩较宽的字形,而不是截断 (default: 1)
--override-fstype clear the fstype bits in TTF/OTF fonts (default:0)
--process-type3 convert Type 3 fonts for web (experimental) (default: 0)
--heps 合并文本的水平临界值,单位:像素(default: 1)
--veps vertical threshold for merging text, in pixels (default: 1)
--space-threshold 断字临界值 (临界值 * em) (default:0.125)
--font-size-multiplier 一个大于1的值增加渲染精度 (default: 4)
--space-as-offset 把空格字符作为偏移量 (default: 0)
--tounicode 如何处理ToUnicode的CMap (0=auto, 1=force,-1=ignore) (default: 0)
--optimize-text 尽量减少用于文本的HTML元素的数目 (default: 0)
--bg-format 指定背景图像格式 (default: "png")
-o,--owner-password 所有者密码 (为了加密文件)
-u,--user-password 用户密码 (为了加密文件)
--no-drm 覆盖文档的 DRM 设置 (default: 0)
--clean-tmp 转换后删除临时文件 (default: 1)
--data-dir 指定的数据目录 (default: ".\share\pdf2htmlEX")
--debug 打印调试信息 (default: 0)
-v,--version 打印版权和版本信息
-h,--help 打印使用帮助信息
最后感谢作者带来这么好的插件!!!完美转换