欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 实现将docx转成PDF

实现将docx转成PDF

2024/10/24 13:29:31 来源:https://blog.csdn.net/lp840312696/article/details/141247406  浏览:    关键词:实现将docx转成PDF

最近实现了一个将docx转成PDF的功能,这里来记录一下实现过程

我是参考这篇文章Java将Word转换成PDF的常用用法_java_脚本之家

实现步骤基本上是按照上面文档中描述的内容,把大象装冰箱一共就三步

1、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>wordToPDF</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.5</version><scope>compile</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency><!--word转换为PDF文档--><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></dependencies></project>

2、增加日志的配置文件(这一步可以忽略)

application.yml


logging:config: classpath:log4j2.xml

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="INFO" monitorInterval="30"><Properties><property name="ALL_LOG_FILE_NAME">log/</property><!-- 输出日志的格式 --><property name="PATTERN">[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%M-%t] [%-5level] %logger{36}:%L - %msg%n</property></Properties><Appenders><!--这个输出控制台的配置 --><Console name="Console" target="SYSTEM_OUT"><!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --><ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${PATTERN}"/></Console><RollingFile name="RollingFileAll"fileName="${ALL_LOG_FILE_NAME}/all.log"filePattern="${ALL_LOG_FILE_NAME}/all-%d{yyyy-MM-dd}-%i.log"><Filters><!--设置只输出级别为info的日志--><ThresholdFilter level="all"/></Filters><!--文件输出格式--><PatternLayout pattern="${PATTERN}"/><Policies><!--每天一个文件--><TimeBasedTriggeringPolicy interval="1" modulate="true"/><!--单个文件的大小--><SizeBasedTriggeringPolicy size="100 MB"/></Policies><!--设置保留的文件数据--><DefaultRolloverStrategy max="12"><!--删除的规则--><Delete basePath="${ALL_LOG_FILE_NAME}" maxDepth="2"><!--保存文件名--><IfFileName glob="all-*.log"/><!--保留天数--><IfLastModified age="30d"/></Delete></DefaultRolloverStrategy></RollingFile></Appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效--><loggers><!--过滤掉spring和mybatis的一些无用的DEBUG信息--><logger name="org.springframework" level="warn"/><logger name="org.mybatis" level="warn"/><logger name="org.apache.kafka" level="warn"/><root level="info"><appender-ref ref="Console"/><appender-ref ref="RollingFileAll"/></root></loggers>
</configuration>

3、核心代码

package com.youyou;import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConversionJobWithPriorityUnspecified;
import com.documents4j.api.IConversionJobWithSourceSpecified;
import com.documents4j.api.IConversionJobWithSourceUnspecified;
import com.documents4j.api.IConversionJobWithTargetUnspecified;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import lombok.extern.slf4j.Slf4j;import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;@Slf4j
public class Documents4jUtil {public static void main(String[] args) throws FileNotFoundException {File file = FileUtil.touch("D:\\Desktop\\SIU测试工装使用方法2.pdf");try (InputStream inputStream = IoUtil.toStream(FileUtil.file("D:\\Desktop\\SIU测试工装使用方法.docx"));OutputStream outputStream = new FileOutputStream(file)) {convertWordToPdf(inputStream, outputStream);System.out.println("完成");} catch (IOException e) {e.printStackTrace();}}/*** word转pdf*/public static void convertWordToPdf(InputStream stream, OutputStream sourceOutput) {String os = System.getProperty("os.name").toLowerCase();log.info("convertWordToPdf 当前操作系统:{}", os);if (os.contains("win")) {// Windows操作系统windowsWordToPdf(stream, sourceOutput);} else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {// Unix/Linux/Mac操作系统linuxWordToPdf(stream, sourceOutput);} else {// 未知操作系统throw new RuntimeException("不支持当前操作系统转换文档。");}}/*** 通过documents4j 实现word转pdf -- Windows 环境 需要有 Microsoft Office 服务*/public static void windowsWordToPdf(InputStream stream, OutputStream sourceOutput) {try {IConverter converter = LocalConverter.builder().build();IConversionJobWithSourceUnspecified convert = converter.convert(stream);IConversionJobWithSourceSpecified sourceSpecified = convert.as(DocumentType.DOCX);IConversionJobWithTargetUnspecified to = sourceSpecified.to(sourceOutput);IConversionJobWithPriorityUnspecified priorityUnspecified = to.as(DocumentType.PDF);boolean execute = priorityUnspecified.execute();log.info("转换结果:{}", execute);converter.shutDown();} catch (Exception e) {log.error("winWordToPdf windows环境word转换为pdf时出现异常:", e);}}/*** 通过libreoffice 实现word转pdf -- linux 环境 需要有 libreoffice 服务*/public static void linuxWordToPdf(InputStream stream, OutputStream sourceOutput) {// 创建临时文件File tempFile = createTempFileFromInputStream(stream);// 构建LibreOffice的命令行工具命令String command = "libreoffice6.4 --headless --invisible --convert-to pdf " + tempFile.getAbsolutePath() + " --outdir " + tempFile.getParent();// 执行转换命令try {if (!executeLinuxCmd(command)) {throw new IOException("转换失败");}readPdfFileToByteArrayOutputStream(tempFile, sourceOutput);} catch (Exception e) {log.error("ConvertWordToPdf: Linux环境word转换为pdf时出现异常:" + e + tempFile.getPath());// 清理临时文件tempFile.delete();} finally {File pdfFile = new File(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));//清理转换后的pdf文件pdfFile.delete();// 清理临时文件,无论是否成功转换tempFile.delete();}}/*** 执行命令行** @param cmd 命令行* @return* @throws IOException*/private static boolean executeLinuxCmd(String cmd) throws IOException {Process process = Runtime.getRuntime().exec(cmd);try {process.waitFor();} catch (InterruptedException e) {log.error("executeLinuxCmd 执行Linux命令异常:", e);Thread.currentThread().interrupt();return false;}return true;}/*** 创建临时文件*/private static File createTempFileFromInputStream(InputStream inputStream) {try {File tempFile = File.createTempFile("temp_word", ".docx");Files.copy(inputStream, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);return tempFile;} catch (IOException e) {log.error("创建临时文件失败:", e);throw new RuntimeException("创建临时文件失败", e);}}/*** 读取pdf文件*/private static void readPdfFileToByteArrayOutputStream(File tempFile, OutputStream sourceOutput) {try {Path outputFile = Paths.get(tempFile.getParent(), tempFile.getName().replace(".docx", ".pdf"));Files.copy(outputFile, sourceOutput);} catch (Exception e) {throw new RuntimeException(e);}}
}

同时我也把相关代码上传到了gitee上地址如下:

word转PDF示例: documents4j组件将word文档转成pdf

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com