通过java实现word转PDF

介绍

用于java项目中解决word转pdf的需求,转换的效果跟调用的工具类、字体库、源文件(是wps还是microsoft保存的,格式版本等)、系统环境等多个因素相关,没有百分百完成的方法,只有不断尝试,选择适合的方法。以下介绍三个能实现该功能的方法。

一、通过Aspose实现

说明:毕竟是需要付费买Licnse才能去水印的,还是比较好用的,我这边使用的版本是20.12。感兴趣的同学可以去aspose-words-20.12-jdk17.jar中查看License.class的源码了解验证逻辑。网上也有文章介绍这个逻辑,但大多数都是21年之前的说明了,22年后相同版本的License验证有变动。老版本(18.6版本,当前写文章的时间2022-6-26)的Licene的认证逻辑跟网上的差别不大,但是方法名称是有变动的,不要一味照搬其他文章内容,还是需要多看多思考。

项目实践过程中遇到问题:低于19.11的版本(本人测试过18.6版本的)在保存pdf后,会出现行高自动增加的问题。
用于实现的jar包20.12和18.6的地址:https://download.csdn.net/download/ka3p06/85789859

相关依赖

	<repositories>
		<repository>
			<id>AsposeJavaAPI</id>
			<name>Aspose Java API</name>
			<url>https://repository.aspose.com/repo/</url>
		</repository>
	</repositories>
      
	<dependencies>
      <dependency>
			<groupId>com.aspose</groupId>
			<artifactId>aspose-words</artifactId>
			<version>20.12</version>
			<classifier>jdk17</classifier>
		</dependency>
	</dependencies>

核心代码

/**
     * 通过aspose 将word转pdf
     *
     * @param sourcePath 源文件地址 如 /root/example.doc
     * @param targetPath 目标文件地址 如 /root/example.pdf
     */
    public static void asposeWordToPdf(String sourcePath, String targetPath) {
        LoadOptions opts = new LoadOptions();
//        opts.setMswVersion(MsWordVersion.WORD_2016);
        opts.getLanguagePreferences().setDefaultEditingLanguage(EditingLanguage.CHINESE_PRC);
        Document doc = null;
        try {
            doc = new Document(sourcePath, opts);
            ParagraphFormat pf = doc.getStyles().getDefaultParagraphFormat();
            pf.clearFormatting();

            PdfSaveOptions options = new PdfSaveOptions();
            // 文字和图像压缩
            options.setExportDocumentStructure(true);
            options.setTextCompression(PdfTextCompression.FLATE);
            options.setImageCompression(PdfImageCompression.AUTO);
 			// 接收修订
            doc.acceptAllRevisions();
            // 去掉批注
            NodeCollection nc = doc.getChildNodes(NodeType.COMMENT,true);
            if (nc != null && nc.getCount() > 0) {
                for(int i=0;i<nc.getCount();i++){
                    log.info("清除批注:{}",nc.get(i).getText());
                    Node comment =nc.get(i);
                    comment.getParentNode().removeChild(comment);
                }
            }
            // 将Word另存为PDF
            doc.save(targetPath, options);
        } catch (Exception e) {
            log.error("[aspose] word转pdf失败:{}", e.toString());
        }

    }

二、通过docx4j实现

通过docx4j实现

相关依赖

		<dependency>
			<groupId>org.docx4j</groupId>
			<artifactId>docx4j-JAXB-Internal</artifactId>
			<version>8.2.4</version>
		</dependency>
		<dependency>
			<groupId>org.docx4j</groupId>
			<artifactId>docx4j-export-fo</artifactId>
			<version>8.2.4</version>
		</dependency>

核心代码

 /**
     * 通过docx4j 实现word转pdf
     *
     * @param sourcePath 源文件地址 如 /root/example.doc
     * @param targetPath 目标文件地址 如 /root/example.pdf
     */
    public static void docx4jWordToPdf(String sourcePath, String targetPath) {
        try {
            WordprocessingMLPackage pkg = Docx4J.load(new File(sourcePath));
            Mapper fontMapper = new IdentityPlusMapper();
            fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
            fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
            fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
            fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
            fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
            fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
            fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
            fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
            fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
            fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
            fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
            fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
            fontMapper.put("等线", PhysicalFonts.get("SimSun"));
            fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
            fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
            fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
            fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
            fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
            fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
            fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
            fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
            fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
            fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
            fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));
            pkg.setFontMapper(fontMapper);

            Docx4J.toPDF(pkg, new FileOutputStream(targetPath));
        } catch (Exception e) {
            log.error("[docx4j] word转pdf失败:{}", e.toString());
        }
    }

三、通过documents4j实现

通过documents4j实现

相关依赖


		<dependency>
			<groupId>com.documents4j</groupId>
			<artifactId>documents4j-local</artifactId>
			<version>1.0.3</version>
		</dependency>
		<dependency>
			<groupId>com.documents4j</groupId>
			<artifactId>documents4j-transformer-msoffice-word</artifactId>
			<version>1.0.3</version>
		</dependency>

核心代码

 /**
     * 通过documents4j 实现word转pdf
     *
     * @param sourcePath 源文件地址 如 /root/example.doc
     * @param targetPath 目标文件地址 如 /root/example.pdf
     */
    public static void documents4jWordToPdf(String sourcePath, String targetPath) {
        File inputWord = new File(sourcePath);
        File outputFile = new File(targetPath);
        try  {
            InputStream docxInputStream = new FileInputStream(inputWord);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream)
                    .as(DocumentType.DOCX)
                    .to(outputStream)
                    .as(DocumentType.PDF).execute();
            outputStream.close();
        } catch (Exception e) {
            log.error("[documents4J] word转pdf失败:{}", e.toString());
        }
    }
  • 11
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: Java WPSPDF是指使用Java编程语言编写一个程序,通过调用WPS Office软件中的API,将WPS文档换为PDF文档。WPS Office作为一款办公软件,支持多种文档格式的打开和编辑,如.doc、.ppt、.xls等,但有时候需要将这些文档换为PDF格式,以供更广泛的使用和分享。 Java作为一种跨平台的编程语言,可以在不同的操作系统和设备上运行,具有很强的可移植性和灵活性,因此选择Java编写该程序可以满足这些需求。该程序可以实现WPS文档与PDF之间的格式换,并可以在不同的操作系统和平台上运行,同时可以在程序中设置换的参数,如文档的页面大小、分辨率、文本字体等。 通过编写该程序,可以实现WPS文档的批量换,并可以自动化处理多个文档的换过程,提高效率和减少人工干预。此外,该程序还可以对换后的PDF文档进行一些处理,如加密、签名、压缩等,以增强文档的安全性和保密性。 总之,Java WPSPDF程序是一种实用的工具,可以方便地将WPS文档换为PDF文档,并可以在不同的平台和场景下灵活运用。 ### 回答2: Java WPSPDF是指使用Java程序对WPS文件进行换,将其PDF格式。WPS是一种办公文档文件格式,它是金山软件公司开发的,与Microsoft Office的DOC格式兼容。WPS可以在Windows、Mac和Linux上运行,非常方便。但是,有时需要将WPS文件换为PDF格式,以便在各种设备上进行阅读和打印。 Java是一种广泛使用的编程语言,它具有跨平台性。使用Java WPSPDF程序,可以在不同的操作系统上运行。该程序将WPS文件换为PDF格式,保留WPS文件原有的格式和内容。换完成后,生成的PDF文件可以在各种设备上进行阅读和打印,如PC、手机和平板电脑。 Java WPSPDF程序可以应用于各种场景,如在企业中共享文档、在学校中分享学习资料、在家庭中打印或阅读电子书等等。通过Java WPSPDF程序,可以使文件的传输和共享更加便捷,提高工作效率和学习效果。 ### 回答3: Java语言可以通过调用WPS API实现将WPS文档换为PDF。WPS API提供了WPS文档换的功能,支持多种文档格式的换,包括WPS、DOC、DOCX、XLS、XLSX、PPT、PPTX等。Java程序可以调用WPS API提供的接口,将WPS文档加载为WPS API中的文档对象,然后使用WPS API提供的换功能将文档换为PDF格式。在换过程中,可以通过设置换参数,如换后的PDF文件名、是否保留原文件等,来实现不同的换需求。需要注意的是,Java程序需要在运行环境中安装相关的WPS软件才能调用WPS API进行文档换。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值