某w*s图片转PDF还要收费,简直不讲武德!我啪的一下,很快啊,一段代码搞定!
引入pom依赖
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version>
</dependency>
工具类
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.pdfbox.io.IOUtils;
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;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** 图片转PDF*/
@Slf4j
public class ImageToPdfConverter {public static void main(String[] args) throws IOException {String imgFilePath = "E:\\STUDY\\1111.jpg";String pdfFilePath = "E:\\STUDY\\1111.pdf";downloadPdf(imgFilePath, pdfFilePath);}/*** 下载** @param imgFilePath img文件路径* @param filePath 文件路径* @throws IOException ioexception*/private static void downloadPdf(String imgFilePath, String filePath) {try {// 1.将本地的图片转成流形式File imgFile = new File(imgFilePath);byte[] imageBytes = readBytesFromFile(imgFile);// 2. 生成一页 PDF documentPDDocument document = new PDDocument();PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, "image");// 这里是你生成PDF自适应图片大小,不设置会默认为A4PDRectangle pageSize = new PDRectangle(image.getWidth(), image.getHeight());PDPage page = new PDPage(pageSize);document.addPage(page);// 3.将 图片 添加进PDF documentPDPageContentStream contentStream = new PDPageContentStream(document, page);float pageWidth = pageSize.getWidth();float pageHeight = pageSize.getHeight();float imageWidth = image.getWidth();float imageHeight = image.getHeight();float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);float scaledWidth = imageWidth * scale;float scaledHeight = imageHeight * scale;float x = (pageWidth - scaledWidth) / 2;float y = (pageHeight - scaledHeight) / 2;// 这里是将你的图片填充入pdf页contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);contentStream.close();// 4. 保存PDFFile outputFile = new File(filePath);File parentFolder = outputFile.getParentFile();if (parentFolder != null && !parentFolder.exists()) {parentFolder.mkdirs();}document.save(outputFile);document.close();} catch (Exception e) {log.error("pdf下载失败,imgFilePath:{},filePath:{}", imgFilePath, filePath, e);}}/*** 从文件读取字节** @param file 文件* @return {@link byte[]}* @throws IOException ioexception*/private static byte[] readBytesFromFile(File file) throws IOException {FileInputStream inputStream = new FileInputStream(file);byte[] bytes = IOUtils.toByteArray(inputStream);inputStream.close();return bytes;}private static byte[] downloadImage(String imageUrl) throws IOException {HttpClient httpClient = HttpClientBuilder.create().build();HttpGet httpGet = new HttpGet(imageUrl);HttpResponse response = httpClient.execute(httpGet);HttpEntity entity = response.getEntity();InputStream inputStream = entity.getContent();byte[] imageBytes = IOUtils.toByteArray(inputStream);inputStream.close();return imageBytes;}/*** 得到img字节列表** @param filePath 文件路径* @return {@link List}<{@link byte[]}>*/private static List<byte[]> getImgByteList(String filePath) throws IOException {// 转换List<byte[]> imageBytesList = new ArrayList<>();File folder = new File(filePath);File[] files = folder.listFiles();for (File file : files) {if (file.isFile() && isImage(file)) {byte[] imageBytes = convertImageToBytes(file);imageBytesList.add(imageBytes);}}return imageBytesList;}private static boolean isImage(File file) {String fileName = file.getName().toLowerCase();return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg") ||fileName.endsWith(".png") || fileName.endsWith(".gif") ||fileName.endsWith(".bmp");}private static byte[] convertImageToBytes(File file) throws IOException {BufferedImage image = ImageIO.read(file);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();ImageIO.write(image, "jpg", outputStream);return outputStream.toByteArray();}}