pdf2HtmlEX的使用

项目使用背景

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

优点:

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

缺点:

  • Linux安装太麻烦了(但是我用docker,一切环境都不是事儿)
  • 格式和html标签没法自定义,html的后续操作难度加大

github地址 --点我

插件的安装方法

查看作者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] <input.pdf> [<output.html>]  
  -f,--first-page <int>         需要转换的起始页 (默认: 1)  
  -l,--last-page <int>          需要转换的最后一页 (默认: 2147483647)  
  --zoom <fp>                   缩放比例  
  --fit-width <fp>              适合宽度 <fp> 像素  
  --fit-height <fp>             适合高度 <fp> 像素  
  --use-cropbox <int>           使用剪切框 (default: 1)  
  --hdpi <fp>                   图像水平分辨率 (default: 144)  
  --vdpi <fp>                   图像垂直分辨率 (default: 144)  
  --embed <string>              指定哪些元素应该被嵌入到输出  
  --embed-css <int>             将CSS文件嵌入到输出中 (default: 1)  
  --embed-font <int>            将字体文件嵌入到输出中 (default: 1)  
  --embed-image <int>           将图片文件嵌入到输出中 (default: 1)  
  --embed-javascript <int>      将javascript文件嵌入到输出中 (default: 1)  
  --embed-outline <int>         将链接嵌入到输出中 (default: 1)  
  --split-pages <int>           将页面分割为单独的文件 (default: 0)  
  --dest-dir <string>           指定目标目录 (default: ".")  
  --css-filename <string>       生成的css文件的文件名 (default: "")  
  --page-filename <string>      分割的网页名称  (default:"")  
  --outline-filename <string>   生成的链接文件名称 (default:"")  
  --process-nontext <int>       渲染图行,文字除外 (default: 1)  
  --process-outline <int>       在html中显示链接 (default: 1)  
  --printing <int>              支持打印 (default: 1)  
  --fallback <int>              在备用模式下输出 (default: 0)  
  --embed-external-font <int>   嵌入局部匹配的外部字体 (default: 1)  
  --font-format <string>        嵌入的字体文件后缀 (ttf,otf,woff,svg) (default: "woff")  
  --decompose-ligature <int>    分解连字-> fi (default:0)  
  --auto-hint <int>             使用fontforge的autohint上的字体时不提示 (default: 0)  
  --external-hint-tool <string> 字体外部提示工具 (overrides --auto-hint) (default: "")  
  --stretch-narrow-glyph <int>  伸展狭窄的字形,而不是填充 (default: 0)  
  --squeeze-wide-glyph <int>    收缩较宽的字形,而不是截断 (default: 1)  
  --override-fstype <int>       clear the fstype bits in TTF/OTF fonts (default:0)  
  --process-type3 <int>         convert Type 3 fonts for web (experimental) (default: 0)  
  --heps <fp>                   合并文本的水平临界值,单位:像素(default: 1)  
  --veps <fp>                   vertical threshold for merging text, in pixels (default: 1)  
  --space-threshold <fp>        断字临界值 (临界值 * em) (default:0.125)  
  --font-size-multiplier <fp>   一个大于1的值增加渲染精度 (default: 4)  
  --space-as-offset <int>       把空格字符作为偏移量 (default: 0)  
  --tounicode <int>             如何处理ToUnicode的CMap (0=auto, 1=force,-1=ignore) (default: 0)  
  --optimize-text <int>         尽量减少用于文本的HTML元素的数目 (default: 0)  
  --bg-format <string>          指定背景图像格式 (default: "png")  
  -o,--owner-password <string>  所有者密码 (为了加密文件)  
  -u,--user-password <string>   用户密码 (为了加密文件)  
  --no-drm <int>                覆盖文档的 DRM 设置 (default: 0)  
  --clean-tmp <int>             转换后删除临时文件 (default: 1)  
  --data-dir <string>           指定的数据目录 (default: ".\share\pdf2htmlEX")  
  --debug <int>                 打印调试信息 (default: 0)  
  -v,--version                  打印版权和版本信息  
  -h,--help                     打印使用帮助信息  

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,518评论 15 147
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,067评论 4 62
  • 老马抓着壮壮的小胖手,送到嘴边,轻轻地亲了一下。想当初,大女儿这么大的时候,老马忙于工作,管教孩子的任务全都推给了...
    璀璨喵说阅读 418评论 1 4
  • 暑假开始,世界杯淘汰赛开始。第一天,法国对阿根廷,乌拉圭对葡萄牙。梅西与c罗双双出局,第二天,俄罗斯对西班牙,居然...
    风之行板阅读 136评论 0 0
  • 日更之战旷日持久,各路好汉各显神威,战场一片混乱,我这个小兵只能躲于战场的一角,瞻仰那些大神伟岸的身姿。 说的这么...
    将军将离阅读 566评论 16 14