需要的maven依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.2.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.2.1</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.2.1</version>
</dependency>
或者直接导入核心包
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.1</version>
<type>pom</type>
</dependency>
导入的包
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import com.itextpdf.layout.element.Image;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URISyntaxException;
/**
* @param srcDir 源 文件/文件夹
* @param targetDir 目标文件夹
* @param factor 压缩因子 取值0-1
* @throws IOException
*/
protected static void compress(String srcDir, String targetDir, float factor) throws IOException {
System.out.println("处理进度: ");
PdfCompress pdfCompress = new PdfCompress();
File file = new File(srcDir);
if (file.isFile()) {
file.createNewFile();
System.out.println("----------");
System.out.println("源文件地址:" + file.getPath());
pdfCompress.manipulatePdf(targetDir, srcDir, factor);
} else {
file.mkdirs();
System.out.println("源文件夹地址:" + file.getPath());
File[] files = file.listFiles(new FileNameFilter());
int total = files.length;
for (int i = 0; i < files.length; i++) {
System.out.println("----------");
System.out.println(file.getPath());
pdfCompress.manipulatePdf(targetDir, files[i].getPath(), factor);
}
}
}
文件名规则
private String createSrcFileName(String target, String src) {
return target + File.separator + new File(src).getName();
}
压缩
protected void manipulatePdf(String target, String src, float factor) throws IOException {
String targetUrl = this.createSrcFileName(target, src);
PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(targetUrl));
int pages = pdfDoc.getNumberOfPages();
System.out.println("共计" + pages + "页");
for (int i = 0; i < pages; i++) {
PdfPage page = pdfDoc.getPage(i + 1);
PdfDictionary pageDict = page.getPdfObject();
PdfDictionary resources = pageDict.getAsDictionary(PdfName.Resources);
PdfDictionary xObjects = resources.getAsDictionary(PdfName.XObject);
PdfName imgRef = xObjects.keySet().iterator().next();
PdfStream stream = xObjects.getAsStream(imgRef);
Image img = convertToBlackAndWhite(new PdfImageXObject(stream), factor);
xObjects.put(imgRef, img.getXObject().getPdfObject());
System.out.println("第" + (i + 1) + "页完成******");
}
pdfDoc.close();
}
图片压缩处理
private static Image convertToBlackAndWhite(PdfImageXObject image, float factor) throws IOException {
BufferedImage bi = image.getBufferedImage();
int width = (int) (bi.getWidth() * factor);
int height = (int) (bi.getHeight() * factor);
BufferedImage newBi = new BufferedImage(width, height, image.getBufferedImage().getType());
AffineTransform at = AffineTransform.getScaleInstance(factor, factor);
Graphics2D g = newBi.createGraphics();
g.drawRenderedImage(bi, at);
ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newBi, image.identifyImageType().name(), baos);
return new Image(ImageDataFactory.create(baos.toByteArray()));
}