一:引入依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.0</version>
</dependency>
二:完整代码实现
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.cos.COSName;
import java.io.File;
import java.io.IOException;
public class TextOptimizedPdfCompressor {
public static void textOptimizedPdfCompressor(String inputPath, String outputPath) {
try (PDDocument document = Loader.loadPDF(new File(inputPath))) {
for (PDPage page : document.getPages()) {
compressContent(page);
compressImages(document, page);
}
document.save(outputPath);
System.out.println("✅ 压缩完成!");
} catch (IOException e) {
System.err.println("错误信息: " + e.getMessage());
}
}
private static void compressContent(PDPage page) {
page.getCOSObject().setItem(COSName.FILTER, COSName.FLATE_DECODE);
page.getCOSObject().setInt(COSName.BITS_PER_COMPONENT, 8);
}
private static void compressImages(PDDocument document, PDPage page) throws IOException {
PDResources resources = page.getResources();
if (resources == null) return;
for (COSName name : resources.getXObjectNames()) {
if (resources.isImageXObject(name)) {
PDImageXObject image = (PDImageXObject) resources.getXObject(name);
if (image.getWidth() * image.getHeight() > 1_000_000) {
PDImageXObject compressedImg = JPEGFactory.createFromImage(
document,
image.getImage(),
0.1f
);
resources.put(name, compressedImg);
}
}
}
}
}