求助! Java 代码 word 转 pdf 有什么好方法吗?现在找到几个,各有优势,之前的人用的 open office,但是是使用命令在代码中启动的,而且还要单独弄个包,感觉很麻烦,还不好 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
auto
V2EX    Java

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

  •  
  •   auto 2021-07-29 13:19:32 +08:00 5580 次点击
    这是一个创建于 1535 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 最大的问题是兼容性问题,好用不好用根本不是个事,能不能转才是重点
    500
        21
    500  
       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 效果是最好的,你可以自己破解一下
    其他开源方案都比较辣鸡,亲测
    optimistic
        27
    optimistic  
       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     Solana     1004 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:33 PVG 02:33 LAX 11:33 JFK 14:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86