V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
auto
V2EX  ›  Java

求助! Java 代码 word 转 pdf 有什么好方法吗?现在找到几个,各有优势,之前的人用的 open office,但是是使用命令在代码中启动的,而且还要单独弄个包,感觉很麻烦,还不好

  •  
  •   auto · 2021-07-29 13:19:32 +08:00 · 4337 次点击
    这是一个创建于 973 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1 、poi + itext 。 先转 html 再绘制,听说格式有差异。比较复杂,格式兼容差,跨平台。

    2 、借助 openoffice 现在暂时用的这个 3 、jacob + ms linux 部署,这个似乎只能 windows 用 4 、docx4j 的 export pdf 组件。 感觉有点慢,对中文的支持似乎也不太行啊 5 、aspose 等其他组件。 付费的,前公司用的这个,感觉很好用啊,有没有类似的啊?
    第 1 条附言  ·  2021-07-29 14:04:54 +08:00
    linux 环境下,最好可以直接 maven 包管理的
    37 条回复    2022-06-23 17:42:59 +08:00
    bthulu
        1
    bthulu  
       2021-07-29 13:27:33 +08:00
    调用 wps 接口啊
    auto
        2
    auto  
    OP
       2021-07-29 14:04:31 +08:00
    @bthulu 只能在 window 环境中吧,linux 不行。
    bthulu
        3
    bthulu  
       2021-07-29 14:16:51 +08:00
    @auto 你不能开一台 windows 专门做这个事么, 在这台 windows 上起个接口, 接收上传的 word 文件, 返回 pdf 文件. 其他 Linux 机器调这个接口不就行了
    bthulu
        4
    bthulu  
       2021-07-29 14:18:07 +08:00
    还可以考虑各大云厂商提供的 word 转 pdf 服务
    aLazarus
        5
    aLazarus  
       2021-07-29 14:33:33 +08:00
    ```
    <dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.core</artifactId>
    <version>2.0.2</version>
    </dependency>
    ```
    aLazarus
        6
    aLazarus  
       2021-07-29 14:35:02 +08:00
    @aLazarus 如果在 linux 使用某些字体,需要 Override getFont 方法
    auto
        7
    auto  
    OP
       2021-07-29 15:01:46 +08:00
    @bthulu 这个没办法,公司腾讯云只弄了 linux 服务
    InTen
        8
    InTen  
       2021-07-29 16:32:54 +08:00
    openoffice/libreoffice,ONLYOFFICE Document Server API,或者第三方云服务
    philipjf
        9
    philipjf  
       2021-07-29 16:35:33 +08:00 via iPhone
    macOS 自带 automation
    cnoder
        10
    cnoder  
       2021-07-29 16:40:39 +08:00
    libreoffice
    shoaly
        11
    shoaly  
       2021-07-29 16:45:52 +08:00
    https://help.aliyun.com/document_detail/63761.html
    不光是转 pdf , 还能转 png , jpg
    z9961
        12
    z9961  
       2021-07-29 17:50:14 +08:00
    jacob+office 其他的转出来的效果都不好
    terry1024
        13
    terry1024  
       2021-07-29 18:20:33 +08:00
    收藏了 关注
    auto
        14
    auto  
    OP
       2021-07-29 18:40:48 +08:00
    @z9961 似乎只能 windows ?
    auto
        15
    auto  
    OP
       2021-07-29 18:41:28 +08:00
    @shoaly 可能不能直接调 ali 的接口,万一哪天这个接口收费了咋办👀
    shoaly
        16
    shoaly  
       2021-07-29 18:43:39 +08:00
    @auto 如果是要免费撸的.... 当我没说吧
    MarkLeeyun
        17
    MarkLeeyun  
       2021-07-29 18:55:52 +08:00
    我感觉 java 可以可以调用某些 exe 文件就好了。
    也算一个比较折衷的方案了。
    比如 java 构造一个运行时调用 pandoc.
    哈哈,这是我的想法。大家不要笑。
    heyenyan
        18
    heyenyan  
       2021-07-29 18:57:35 +08:00
    aspose-word
    ikas
        19
    ikas  
       2021-07-29 19:37:00 +08:00
    完美的想多了....找合适的转换工具.java 开任务处理...几乎都是这样的
    akira
        20
    akira  
       2021-07-29 20:50:30 +08:00
    open office 已经算是比较好的了。

    word 转 pdf 最大的问题是兼容性问题,好用不好用根本不是个事,能不能转才是重点
    paulluis2dev
        21
    paulluis2dev  
       2021-07-29 22:30:02 +08:00
    我专门做过这个,免费的话也是我们现在方案是 LibreOffice 转,LibreOffice 版本越高转换效果越好,差异越小。可以调命令也可以引依赖,但本质还是起 soffice 进程转
    mmdsun
        22
    mmdsun  
       2021-07-29 23:52:01 +08:00 via Android
    java 有收费的 spire.doc 可以转换。

    如果想完美+免费的话,就用 Windows 机子。java 也能调用 dll 或者 COM 组件。

    引入 Microsoft.Office.Interop.Word.dll
    转换就几句话。

    document = application.Documents.Open(sourcePath);

    document.ExportAsFixedFormat(targetPath, WdExportFormat.wdExportFormatPDF);
    mmdsun
        23
    mmdsun  
       2021-07-30 00:03:34 +08:00 via Android
    还有一种方式就是 Linux 命令转化,效果也还可以。

    比如 pandoc,unoconv 。(不知道现在哪个好用,若楼主用了效果好可以告知一下。)

    这种 java 也能调用拿 Runtime.execute 方法执行命令即可。

    ( java exec 执行命令很多坑 的自己封装脚本执行)
    cz5424
        24
    cz5424  
       2021-07-30 00:13:50 +08:00 via iPhone
    @auto 这接口就是收费的 0.08 元 /次
    fangshuai
        25
    fangshuai  
       2021-07-30 00:26:14 +08:00
    poi-tl 生成 word 文档,在 linux 上安装 openoffice 或 libreoffice,通过 jodconverter api 进行转换,转换效果还是可以的
    statumer
        26
    statumer  
       2021-07-30 00:46:01 +08:00 via Android
    aspose 效果是最好的,你可以自己破解一下
    其他开源方案都比较辣鸡,亲测
    kpingdd
        27
    kpingdd  
       2021-07-30 01:41:12 +08:00
    试试 spire.doc 吧,速度可能不太理想
    sundev
        28
    sundev  
       2021-07-30 02:05:36 +08:00 via iPhone
    最好的方案是调用 office,我试过了,其他都不完美!我现在专门弄了一台 windows 然后安装 office,程序调用 com 接口!
    magicdu
        29
    magicdu  
       2021-07-30 08:27:48 +08:00 via Android
    aspose-word,感觉还可以,就是有些表格样式需要调整下
    linbingcheng
        30
    linbingcheng  
       2021-07-30 08:58:39 +08:00
    这种事情不花钱买服务对接,个人实现真的很鸡肋,完全没法看,别人都是一个团队在做,专业的事情要找专业的干
    encro
        31
    encro  
       2021-07-30 09:17:36 +08:00
    1,只有买第三方服务,格式无法保证,看对方实现方法,网上最多的 libreoffice 方案;
    2,用微软自带 office 转换,需要 c#与 windows,格式是最好的,默认速度有点慢(大于 5 秒),有办法优化到 2 秒左右,不过是公司机密,不能告诉你;

    如果你只是看看可以用方法 1,如果你需要打印那么需要方法 2 或者 spire/aspose 。

    我们公司因为量比较大,以及全部需要打印,所以采用的是 2,自己建立的 c#队列服务,调用方队列发送过来,完了再发送回去。
    encro
        32
    encro  
       2021-07-30 09:22:33 +08:00
    @shoaly
    效果怎么样?能用于打印还是预览?
    shoaly
        33
    shoaly  
       2021-07-30 11:58:04 +08:00
    @encro 我们当时的目的是 把 ppt 和 word 转换成线上预览 且需要防盗版水印... 所以直接就直接转换成 jpg 页面了, 效果挺好的... 没怎么转 pdf, 虽然是支持的. 效果挺好的
    STtree
        34
    STtree  
       2021-07-30 15:59:18 +08:00
    以前研究过这个问题,linux 下 openoffice 应该是最好的解决方案了,然而还是很难做到 1:1 还原。这种要想有好的效果,要么调 MS Office 或 wps,要么就上一些收费服务和模块。
    encro
        35
    encro  
       2021-07-30 23:35:25 +08:00
    @shoaly

    应该订订也是用这个方案,感觉还可以,好像只有偶尔有问题。楼主可以试一下。
    stormfeng
        36
    stormfeng  
       2022-06-23 12:38:06 +08:00
    楼上各种方案,都不是 博主想要的 maven 呀!
    1 )调接口? 还要尼玛的注册 aliyun 沙雕账号,还要实名制的手机号? 接口还收费,尼玛什么玩意。
    如果所有的需求都去调接口,那还要程序猿干什么? 程序媛就够了呢
    2 )调 wps 或者 windows 接口? 你以为你部署在自己的 windows 测试自己玩呢? 谁的 项目不是跑在线上的 linux 呀
    3 )调 libreoffice ? 你让运维给你现场去装 这个 软件到 linux 服务器吗? 运维问: 你谁啊你?
    4 )还有的 调用 google doc 或者 微软 doc 在线接口的,我就问问了,你们的老大知道你把 文档远程传输到外网了吗?
    5 ) fr.opensagres.xdocreport.core , 这个其实是需要 POI 的,并且不支持 word 中有表格的,会报错的。
    6 ) aspose-word , 效果虽好,但是 收费,有水印。https://zh.blog.aspose.com/2021/04/23/%E5%9C%A8java%E4%B8%AD%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E5%B0%86word-doc-docx%E8%BD%AC%E6%8D%A2%E4%B8%BApdf/
    7 ) spire doc ,效果也不错,但是 收费,有水印
    https://www.e-iceblue.cn/spiredocforjavaconversion/java-convert-word-to-pdf.html
    8 ) jOfficeConvert:demo 看起来不错,但是收费,而且还看不到源码 。 官网只是说自己使用了 Microsoft Word Viewing Technology 实现的。但是 完全搜索不到相关信息在 微软的官网。所以,难道就是 windows seerver 服务器本地装了 office 进行转换的 ?
    https://www.qoppa.com/pdfhtml/demo/html5-pdf-viewer-live-demo/
    9 ) openoffice 和 jodconverter 没试过,没有发言权。
    10)其他方案,大部分看了,都是垃圾,要么 项目太老了,要么太新了,不匹配旧的 POI 和 jdk7 , https://stackoverflow.com/questions/3022376/how-can-i-convert-a-word-document-to-pdf
    综上:
    思路如下: 用收费版的 先把 word 转换为 pdf ,然后再把其中的水印去掉!
    具体的代码都有了:
    http://www.codebaoku.com/it-java/it-java-250846.html
    stormfeng
        37
    stormfeng  
       2022-06-23 17:42:59 +08:00
    @stormfeng 直接 CV 大法该代码 会有 3 个坑,
    1 ) 去除水印的 pdf 损坏打不开; 2 )文字水印无法去除; 3 )无法去除图片水印。

    我调试了半天才发现, 应该是防止 CV 大师们随意施展大法吧,挺好。
    1 )这行代码,会导致 pdf 文件损坏,直接 注释掉这行代码即可。
    // document.removePage(document.getNumberOfPages() - 1);

    2 ) replaceText(page, "Ltd.", ""); // 这里的几行代码,要改成 跟你的看到的水印一毛一样的。aspose 不同的版本,水印文字也有差异。否则无法删除。

    3 )该行代码,参数 X1 可调,removeImage(page, "X1"); // 可以改为 X2 X3 等等,数字代表 遍历到的图片序号

    总结:
    改好的代码,已经上传了,here
    https://blog.csdn.net/w1047667241/article/details/125431049
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   980 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:56 · PVG 05:56 · LAX 14:56 · JFK 17:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.