使用Apache pdfbox 工具包对pdf文件进行压缩
思路就是使用工具包将pdf文件拆分为图片,然后对图片进行压缩后再合并为pdf
导包
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
编码
public class PdfBoxUtil {
/**
* pdf文件转图片
*
* @param filePath pdf文件所在路径
* @param targetFolder 生成的图片的文件夹
* @param scale 倍率 1:72DPI 2:142DPI
* @throws IOException
*/
public static void pdfToImage(String filePath, String targetFolder, float scale) throws IOException {
File file = new File(filePath);
try (PDDocument document = PDDocument.load(file)) {
PDFRenderer renderer = new PDFRenderer(document);
int numberOfPages = document.getNumberOfPages();
for (int i = 0; i < numberOfPages; i++) {
BufferedImage image = renderer.renderImage(i, 2f);
ImageIO.write(image, "JPEG", new File(targetFolder + i + ".jpg"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 图片转pdf
*
* @param imageFolder 图片所在文件夹
* @param filePath
*/
public static void imageToPdf(String imageFolder, String filePath) {
File file = new File(imageFolder);
File[] listFiles = file.listFiles();
List<File> imageList = new ArrayList<File>();
for (File imageFile : listFiles) {
imageList.add(imageFile);
}
// 排序
imageList.sort(new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
String name1 = f1.getName();
String[] split1 = name1.split("\\.");
int int1 = Integer.parseInt(split1[0]);
String name2 = f2.getName();
String[] split2 = name2.split("\\.");
int int2 = Integer.parseInt(split2[0]);
return int1 - int2;
}
});
try (PDDocument document = new PDDocument()) {
for (int i = 0; i < imageList.size(); i++) {
File imageFile = imageList.get(i);
BufferedImage bufferedImage = ImageIO.read(new FileInputStream(imageFile));
int height = bufferedImage.getHeight();
int width = bufferedImage.getWidth();
PDPage page = new PDPage();
// 设置宽和高
PDRectangle rectangle = new PDRectangle(width, height);
page.setMediaBox(rectangle);
document.addPage(page);
PDImageXObject pdImage = PDImageXObject.createFromFileByExtension(imageFile, document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
contentStream.drawImage(pdImage, 0, 0);
contentStream.close();
}
document.save(filePath);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
// pdfToImage("C:\\Users\\admin\\Desktop\\系统操作手册.pdf", "C:\\Users\\admin\\Desktop\\temp\\qwe1\\");
imageToPdf("C:\\Users\\admin\\Desktop\\temp\\qwe1\\", "C:\\Users\\admin\\Desktop\\temp\\系统操作手册2.pdf");
}
}