auto
V2EX  ›  Java

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

  •  
  •   auto · Jul 29, 2021 · 6636 views
    This topic created in 1923 days ago, the information mentioned may be changed or developed.
    1 、poi + itext 。 先转 html 再绘制,听说格式有差异。比较复杂,格式兼容差,跨平台。

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

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

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

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

    document = application.Documents.Open(sourcePath);

    document.ExportAsFixedFormat(targetPath, WdExportFormat.wdExportFormatPDF);
    mmdsun
    mmdsun
    Jul 30, 2021 via Android
    23
    还有一种方式就是 Linux 命令转化,效果也还可以。

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

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

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

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

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

    应该订订也是用这个方案,感觉还可以,好像只有偶尔有问题。楼主可以试一下。
    stormfeng
    stormfeng
    Jun 23, 2022
    36
    楼上各种方案,都不是 博主想要的 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
    stormfeng
    Jun 23, 2022
    37
    @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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3342 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    ♥ Do have faith in what you're doing.