pdf2htmlex java_pdf2HtmlEX的使用

本文介绍了如何在Java项目中利用pdf2htmlEX进行PDF到HTML的转换,包括如何通过Docker简化Linux环境安装,以及提供了一个Java代码示例来调用pdf2htmlEX命令行工具进行转换。
摘要由CSDN通过智能技术生成

项目使用背景

内部使用的文件管理系统,实现doc,docx文件的在线预览功能;整体功能类似于知网的功能缩减版:文件的管理,在线预览,查重功能。其中还使用到pdf2htmlEX实现pdf转html,最终实现文章重复部分标红操作。

-- 同OpenOffice4使用篇

优点:

格式完美转换,样式一模一样,解析的html标签还算工整。

缺点:

Linux安装太麻烦了(但是我用docker,一切环境都不是事儿)

格式和html标签没法自定义,html的后续操作难度加大

插件的安装方法

查看作者GitHub里面有最原始的方法,也是最好的。

linux安装起来比较的麻烦,每个版本的系统可能都不一样,有些没办法装上。

最简单的方法就是使用安装好的docker镜像,把自己的开发环境集成上去就ok了。

e752dfeb628f

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 打印使用帮助信息

最后感谢作者带来这么好的插件!!!完美转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值