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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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