簡介
在項目中我們有時候會遇到操作PDF文件的需求,如將PDF的每一頁轉換成圖片,今天我們就來實現一下相關功能。
實現
引入依賴
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.21</version>
</dependency>
pdfbox是一個開源的操作PDF的工具包,這里是 官方文檔
將PDF轉換成多張圖片
程序中使用的源PDF下載 阿里巴巴Java開發...1528284352.pdf
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
public class Client {
public static void main(String[] args) throws Exception {
testPdf2images();
}
private static void testPdf2images() throws Exception {
List<byte[]> images = pdf2images(new File("D:/testpdf/阿里巴巴Java開發...1528284352.pdf"));
AtomicInteger fileNameIndex = new AtomicInteger(1);
for (byte[] image : images) {
new ByteArrayInputStream(image).transferTo(
new FileOutputStream("D:/testpdf/" + fileNameIndex.getAndIncrement() + ".png"));
}
}
/**
* 將PDF文件轉換成多張圖片
*
* @param pdfFile PDF源文件
* @return 圖片字節數組列表
*/
private static List<byte[]> pdf2images(File pdfFile) throws Exception {
//加載PDF
PDDocument pdDocument = PDDocument.load(pdfFile);
//創建PDF渲染器
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pages = pdDocument.getNumberOfPages();
List<byte[]> images = new ArrayList<>();
for (int i = 0; i < pages; i++) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
//將PDF的每一頁渲染成一張圖片
BufferedImage image = renderer.renderImage(i);
ImageIO.write(image, "png", output);
images.add(output.toByteArray());
}
pdDocument.close();
return images;
}
}
創建的圖片列表如下
將圖片列表轉換成PDF
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Objects;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class Client2 {
public static void main(String[] args) throws Exception {
testImages2pdf();
}
private static void testImages2pdf() throws Exception {
File file = new File("D:/testpdf");
//過濾所有圖片文件
File[] files = file.listFiles((f, s) -> s.endsWith(".png"));
if (Objects.nonNull(files)) {
//根據名稱排序
Arrays.sort(files, Client2::compareImageFile);
byte[] pdf = images2pdf(files);
new ByteArrayInputStream(pdf).transferTo(
new FileOutputStream("D:/testpdf/阿里巴巴java文檔.pdf"));
}
}
/**
* 根據圖片名稱排序
*/
private static int compareImageFile(File f1, File f2) {
String f1Name = f1.getName();
String f2Name = f2.getName();
return Integer.compare(Integer.parseInt(f1Name.substring(0, f1Name.lastIndexOf("."))),
Integer.parseInt(f2Name.substring(0, f2Name.lastIndexOf("."))));
}
/**
* 根據多張圖片生成PDF文件
*
* @param images 圖片列表
* @return PDF文件
*/
private static byte[] images2pdf(File... images) throws Exception {
//創建空PDF
PDDocument document = new PDDocument();
for (File image : images) {
InputStream input = new FileInputStream(image);
//讀取圖片
BufferedImage bufferedImage = ImageIO.read(input);
float width = bufferedImage.getWidth();
float height = bufferedImage.getHeight();
//創建PDF的一頁
PDPage page = new PDPage(new PDRectangle(width, height));
document.addPage(page);
PDImageXObject pdImageXObject = PDImageXObject.createFromFileByContent(image, document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
//寫入圖片
contentStream.drawImage(pdImageXObject, 0, 0);
contentStream.close();
input.close();
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
document.save(output);
document.close();
return output.toByteArray();
}
}
總結
遇到問題多google
參考
Java PDF轉圖片
Java: Create PDF pages from images using PDFBox library
在線處理PDF工具