如果喜欢,欢迎关注WX:攻城狮重楼
在 Windows Server 环境下,将 PPTX 文件另存为 PDF 时,遇到的一个问题是PDF中的图片部分缺失,且这些缺失的图片实际为WebP格式。本文将介绍这一问题的原因及两种解决方案。
问题原因
在Windows Server环境下,将PPTX文件另存为PDF时,若PDF中的图片部分缺失,且这些缺失的图片为WebP格式,通常是由于Windows的图片解码器不支持WebP格式导致的。这使得在转换过程中,WebP格式的图片无法正确显示在PDF文件中。
解决方案:
方案一: 安装 WebP 解码器
Microsoft Office 使用 Windows Imaging Component (WIC) 来处理图片。如果系统缺少 WebP 解码支持,可以通过安装 WebP 的 WIC 插件解决:
● 下载并安装 WebP Codec for Windows:WebP Codec下载链接
● 安装完成后,重启服务器,重新尝试将 PPTX 文件导出为 PDF。
我用夸克网盘分享了「WebpCodecSetup.exe」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/34fbb503790f
提取码:5CTQ
方案二:将 pptx 中图片转换成 jpg
如果无法直接在系统中增加 WebP 支持,可以考虑将 PPTX 文件中使用的 WebP 图片转换为其他通用格式(如 PNG 或 JPEG):
- 批量提取 WebP 图片:
1.1. 打开 PPTX 文件(实际上是一个 ZIP 压缩包)。
1.2. 将.pptx
后缀改为.zip
,解压后找到ppt/media
文件夹,其中存放了所有图片。 - 批量转换为 PNG/JPEG 格式:
2.1. 添加依赖
首先,在项目中添加WebP格式支持的依赖。在Maven项目中,可以添加以下依赖:
xml
<dependency>
<groupId>org.sejda.imageio</groupId>
<artifactId>webp-imageio</artifactId>
<version>0.1.6</version> <!-- 请检查是否有更新的版本 -->
</dependency>
2.2. 编写Java代码
接着,编写Java代码实现WebP格式图片到JPG格式的转换。以下是一个简单的示例:
java
public class LoadPicUtil {
public static void main(String[] args) {
String filePath = "C:\\Users\\admin\\Desktop\\image.jpg"; // 替换为你的文件路径
//String filePath = "C:\\Users\\admin\\Desktop\\wallhaven-zxrrqj.webp"; // 替换为你的文件路径
//String filePath = "C:\\Users\\admin\\Desktop\\wallhaven-zxrrqj.jpg"; // 替换为你的文件路径
String jpgFilePath = "C:\\Users\\admin\\Desktop\\image2.jpg"; // 替换为你的文件路径
try {
boolean isWebP = isWebPFormat(filePath);
System.out.println("Is the file a WebP format? " + isWebP);
if (isWebP) {
convertWebPToJpg(filePath, jpgFilePath);
System.out.println("Conversion successful!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void convertWebPToJpg(String webPFilePath, String jpgFilePath) throws IOException {
// 读取WebP文件
File webPFile = new File(webPFilePath);
BufferedImage webPImage = ImageIO.read(webPFile);
// 检查是否成功读取图像
if (webPImage == null) {
throw new IOException("Unable to read the WebP image.");
}
// 将图像转换为JPEG格式并保存
File jpgFile = new File(jpgFilePath);
boolean success = ImageIO.write(webPImage, "jpg", jpgFile);
if (!success) {
throw new IOException("Unable to write the JPEG image.");
}
}
private static final byte[] RIFF_HEADER = {'R', 'I', 'F', 'F'};
private static final byte[] WEBP_HEADER = {'W', 'E', 'B', 'P'};
public static boolean isWebPFormat(String filePath) throws IOException {
try (InputStream inputStream = new FileInputStream(filePath)) {
byte[] buffer = new byte[12]; // WebP 文件头至少有 12 字节
int bytesRead = inputStream.read(buffer, 0, buffer.length);
if (bytesRead < buffer.length) {
return false; // 文件太短,不可能是 WebP
}
// 检查 "RIFF"
for (int i = 0; i < RIFF_HEADER.length; i++) {
if (buffer[i] != RIFF_HEADER[i]) {
return false;
}
}
// 检查 "WEBP"
for (int i = 8; i < 8 + WEBP_HEADER.length; i++) {
if (buffer[i] != WEBP_HEADER[i - 8]) {
return false;
}
}
return true; // 匹配成功,是 WebP 格式
}
}
private static boolean isWebPImage(File file) throws IOException {
String contentType = Files.probeContentType(file.toPath());
return contentType != null && contentType.equals("image/webp");
}
private static Path convertWebPToJpg(Path webPFilePath) throws IOException {
BufferedImage webPImage = ImageIO.read(webPFilePath.toFile());
Path jpgFilePath = webPFilePath.resolveSibling(webPFilePath.getFileName() + ".jpg");
ImageIO.write(webPImage, "jpg", jpgFilePath.toFile());
return jpgFilePath;
}
}
- 替换 PPTX 文件中的 WebP 图片:
将转换后的图片重新放回原位置,并重新压缩为.pptx
文件。