1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Java生成pdf长图(多图片转长图 铺满宽度 可实现图片缩放)

Java生成pdf长图(多图片转长图 铺满宽度 可实现图片缩放)

时间:2021-04-18 03:21:49

相关推荐

Java生成pdf长图(多图片转长图 铺满宽度 可实现图片缩放)

今天搞了个Java多个图片合并生成pdf长图,感觉还不错,分享给大家

注意,图片的像素要保持一致,ImageIO在合并图片时会以最大的图片宽度为基准,其他的图片小于这个宽度就会填充黑框。我提供了图片缩放的方法可以进行缩放图片保证图片宽高一致,尤其是宽度,高度一致不一致无所谓,宽度必须一致,正常填充pdf即可,会整个铺满。

研究不易,如果帮助到你请三连。谢谢!

import com.itextpdf.text.Document;import com.itextpdf.text.Image;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.PdfContentByte;import com.itextpdf.text.pdf.PdfWriter;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;public class CreateImagePdf {public static void main(String[] args) {try {/*** 缩放图片*/scaleImages();// 需要合并的图片文件列表(缩放后的图片)List<String> imageFiles = new ArrayList<>();imageFiles.add("E:\\newYsj1\\1.jpg");imageFiles.add("E:\\newYsj1\\2.jpg");imageFiles.add("E:\\newYsj1\\3.jpg");imageFiles.add("E:\\newYsj1\\4.jpg");imageFiles.add("E:\\newYsj1\\5.jpg");imageFiles.add("E:\\newYsj1\\6.jpg");imageFiles.add("E:\\newYsj1\\7.jpg");imageFiles.add("E:\\newYsj1\\8.jpg");imageFiles.add("E:\\newYsj1\\9.jpg");imageFiles.add("E:\\newYsj1\\10.jpg");imageFiles.add("E:\\newYsj1\\11.jpg");imageFiles.add("E:\\newYsj1\\12.jpg");// 合并后的长图文件String mergedImageFile = "E:\\mergedImage.jpg";//生成一张长图mergeImages(imageFiles, mergedImageFile);// 生成PDF文件String pdfFile = "E:\\mergedImage.pdf";createPDF(mergedImageFile, pdfFile);} catch (Exception e) {e.printStackTrace();}}/*** 将多个图片文件合并成一张长图** @param imageFiles图片文件列表* @param mergedImageFile 合并后的长图文件* @throws Exception*/public static void mergeImages(List<String> imageFiles, String mergedImageFile) throws Exception {BufferedImage mergedImage = null;int heightTotal = 0;int maxWidth = 0;for (String imageFile : imageFiles) {BufferedImage image = ImageIO.read(new File(imageFile));//图片大小不保持一致需要把这个判断注释掉,不然会出现黑框// if (image.getWidth() > maxWidth) {maxWidth = image.getWidth();// }heightTotal += image.getHeight();}mergedImage = new BufferedImage(maxWidth, heightTotal, BufferedImage.TYPE_INT_RGB);int offsetY = 0;for (String imageFile : imageFiles) {BufferedImage image = ImageIO.read(new File(imageFile));mergedImage.getGraphics().drawImage(image, 0, offsetY, null);offsetY += image.getHeight();}ImageIO.write(mergedImage, "jpg", new File(mergedImageFile));}/*** 将长图文件转换为PDF文件** @param mergedImageFile 长图文件* @param pdfFile PDF文件* @throws Exception*/public static void createPDF(String mergedImageFile, String pdfFile) throws Exception {//获取下图片的大小,图片的大小就是document的大小(建议图片就是A4纸的大小就行)Image image = Image.getInstance(mergedImageFile);com.itextpdf.text.Rectangle rectangle = new Rectangle(image.getWidth(), image.getHeight());Document document = new Document(rectangle, 0, 0, 0, 0);// 创建PdfWriter对象PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));// 打开文档document.open();// 获取PdfContentByte对象PdfContentByte cb = writer.getDirectContent();image.scaleToFit(document.getPageSize().getWidth(), document.getPageSize().getHeight());// 设置图片位置image.setAbsolutePosition(0, 0);// 添加图片到PdfContentByte对象cb.addImage(image);// 关闭文档document.close();}//缩放图片方法private static void scaleImages() throws Exception {// 需要合并的图片文件列表List<String> imageFiles = new ArrayList<>();File file = new File("E:\\ysj1");File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {imageFiles.add(files[i].getName());System.err.println(files[i].getName());}for (String imageFile : imageFiles) {//加载图片File f = new File("E:\\ysj1\\" + imageFile);BufferedImage image = ImageIO.read(f);BufferedImage imag = scaleImage(image, 595, 842);String[] split = imageFile.split("\\.");//保存图片File targetFile = new File("E:\\newYsj1\\" + split[0] + ".jpg");ImageIO.write(imag, "jpg", targetFile);}}// 等比例缩放图片private static BufferedImage scaleImage(BufferedImage img, int maxWidth, int maxHeight) {int width = img.getWidth();int height = img.getHeight();// 计算缩放比例double scale = Math.min((double) maxWidth / width, (double) maxHeight / height);// 缩放后的图片宽度和高度int newWidth = (int) (width * scale);int newHeight = (int) (height * scale);// 创建缩放后的图片BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = scaledImage.createGraphics();g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);g2d.drawImage(img, 0, 0, newWidth, newHeight, null);g2d.dispose();return scaledImage;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。