1.需求

将同一文件夹下的图片和PDF,转换合并为同一个PDF,并要求转换中的图片按格式排版好

2.思路

  1. 调整图片,检测图片大小及方向,调整至A4大小(842×595), 寻找最佳缩放比,等比例缩放图片,为避免多次IO操作,返回BufferedImage
  2. 将图片转换为PDF
  3. 将文件夹下的PDF按顺序合并,得到最终的final.pdf

3.所需工具类

前两个为处理PDF的工具类,最后一个为图片处理类

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>1.7.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>

4.图片处理类

package JavaPdf;import net.coobird.thumbnailator.Thumbnails;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;public class ImgUtil {/*** @Author Ragty* @Description 调整图片角度并生成合适大小的图片* @Date 16:37 2019/3/7* @return**/public BufferedImage rotateImage(String imgFile) throws Exception{BufferedImage bufferedImage = null;try {if(imgFile != "" || imgFile != null){File _img_file_ = new File(imgFile);if(_img_file_.exists()){Integer angel = 270;BufferedImage src = ImageIO.read(_img_file_);BigDecimal height = BigDecimal.valueOf(src.getHeight());BigDecimal width = BigDecimal.valueOf(src.getWidth());BigDecimal bd = height.divide(width,4,BigDecimal.ROUND_CEILING);BigDecimal theValue = BigDecimal.valueOf(1.1700);if (bd.compareTo(theValue) == -1 ) {System.out.println("转换中 ...");bufferedImage = Thumbnails.of(src).rotate(angel).scale(1).asBufferedImage();bufferedImage = calcScale(bufferedImage);}else {bufferedImage = calcScale(src);System.out.println("宽高比合适,跳过 ...");}//bufferedImage = getSharperPicture(bufferedImage);}}} catch (IOException e) {e.printStackTrace();}return bufferedImage;}/*** @Author Ragty* @Description  计算最佳放缩比* @Date 9:19 2019/3/11* @return**/public BufferedImage calcScale(BufferedImage bufferedImage) throws IOException{BigDecimal standaraHeight = BigDecimal.valueOf(842);BigDecimal standaraWeight = BigDecimal.valueOf(595);BigDecimal height = BigDecimal.valueOf(bufferedImage.getHeight());BigDecimal width = BigDecimal.valueOf(bufferedImage.getWidth());if (height.compareTo(standaraHeight) == 1 || width.compareTo(standaraWeight) == 1) { //不符合标准,缩放BigDecimal scaleHeight = standaraHeight.divide(height,4,BigDecimal.ROUND_CEILING);BigDecimal scaleWidth = standaraWeight.divide(width,4,BigDecimal.ROUND_CEILING);if (scaleHeight.compareTo(BigDecimal.valueOf(1)) == -1) {bufferedImage = Thumbnails.of(bufferedImage).scale(scaleHeight.floatValue()).outputQuality(1.0f).asBufferedImage();calcScale(bufferedImage);}else if (scaleWidth.compareTo(BigDecimal.valueOf(1)) == -1) {bufferedImage = Thumbnails.of(bufferedImage).scale(scaleWidth.floatValue()).outputQuality(1.0f).asBufferedImage();calcScale(bufferedImage);}}return  bufferedImage;}}

5.PDF处理类

package JavaPdf;import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.pdfbox.util.PDFMergerUtility;import javax.imageio.ImageIO;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;public class PdfUtil {/*** @Author Ragty* @Description 将图片转换为PDF* @Date 15:27 2019/3/4* @return**/public static String Img2PDF(String imagePath,BufferedImage img,String descfolder) throws Exception{String pdfPath = "";try {//图片操作Image image = null;File file = new File(descfolder);if (!file.exists()){file.mkdirs();}pdfPath = descfolder +"/"+System.currentTimeMillis()+".pdf";String type = imagePath.substring(imagePath.lastIndexOf(".")+1);Document doc = new Document(null, 0, 0, 0, 0);//更换图片图层BufferedImage bufferedImage = new BufferedImage(img.getWidth(), img.getHeight(),BufferedImage.TYPE_3BYTE_BGR);bufferedImage.getGraphics().drawImage(img, 0,0, img.getWidth(), img.getHeight(), null);bufferedImage=new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY),null).filter (bufferedImage,null);//图片流处理doc.setPageSize(new Rectangle(bufferedImage.getWidth(), bufferedImage.getHeight()));System.out.println(bufferedImage.getWidth()+"()()()()()"+bufferedImage.getHeight());ByteArrayOutputStream out = new ByteArrayOutputStream();boolean flag = ImageIO.write(bufferedImage, type, out);byte[] b = out.toByteArray();image = Image.getInstance(b);//写入PDFSystem.out.println("写入PDf:" + pdfPath);FileOutputStream fos = new FileOutputStream(pdfPath);PdfWriter.getInstance(doc, fos);doc.open();doc.add(image);doc.close();} catch (IOException e) {e.printStackTrace();} catch (BadElementException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}return pdfPath;}/*** @Author Ragty* @Description 获取文件夹下的PDF* @Date 17:33 2019/3/7* @return**/private static String[] getFiles(String folder) throws IOException {File _folder = new File(folder);String[] filesInFolder;if (_folder.isDirectory()) {filesInFolder = _folder.list();return filesInFolder;} else {throw new IOException("Path is not a directory");}}/*** @Author Ragty* @Description 合成PDF* @Date 17:25 2019/3/7* @return**/public static void mergePDF(String[] files,String desfolder,String mergeFileName ) throws Exception{PDFMergerUtility mergePdf = new PDFMergerUtility();for (String file :files) {if (file.toLowerCase().endsWith("pdf"))mergePdf.addSource(file);}mergePdf.setDestinationFileName(desfolder+"/"+mergeFileName);mergePdf.mergeDocuments();System.out.println("merge over");}public static void main(String[] args) throws Exception{ImgUtil imageUtil = new ImgUtil();String[] files = new String[11];files[0] = "D:/test2/2019021910311346.jpg";files[1] = "D:/test2/2019021816284226.jpg";files[2] = "D:/test2/2019021816284244.png";files[3] = "D:/test2/2019021816284299.jpg";files[4] = "D:/test2/2019021816284346.png";files[5] = "D:/test2/2019021816285533.png";files[6] = "D:/test2/2019021816285546.jpg";files[7] = "D:/test2/2019021816285553.jpg";files[8] = "D:/test2/2019021816285640.png";files[9] = "D:/test2/2019021910305527.pdf";files[10] = "D:/test2/201902191030445.pdf";String folder = "D:/test2";String mergeFileName = "final.pdf";for (int i=0;i<files.length;i++) {String file = files[i];if (file.toLowerCase().endsWith(".png")|| file.toLowerCase().endsWith(".jpg")|| file.toLowerCase().endsWith(".gif")|| file.toLowerCase().endsWith(".jpeg")|| file.toLowerCase().endsWith(".gif")) {BufferedImage bi = imageUtil.rotateImage(file);if (bi==null)continue;String pdffile = Img2PDF(file,bi,folder);files[i] = pdffile;}}mergePDF(files,folder,mergeFileName);}}

7.测试

处理前
处理后的图片

合并后的PDF

Java图片转换为PDF并合成同一PDF相关推荐

  1. Java 图片转换为字符图 CharMaps (整理)

    /** Java 图片转换成字符图 CharMaps (整理) * * 2016-1-2 深圳 南山平山村 曾剑锋 ** @(#)CharMaps.java 2014/1/16 * 1.这个一个Jav ...

  2. 怎么将Word、图片和PDF最后合成一个PDF文档

    有时我们通过不同渠道搜索下载的资料可能会是不同的文档格式,比如常用的Word.图片以及PDF等,但最终都需要整理成一个文档,一般PDF格式最为稳定,那么如何将这些不同的文档格式合并起来呢? 我们都知道 ...

  3. java图片转换为数据流_OpenCV 读取数据流图片

    背景 OpenCV 提供的 API 是直接根据路径读取图片的, 在实际生产环境中,可能大部分情况下都是直接读取网络图片 在内存就完成图片和 opencv 的 Mat 对象的转换 那么该如何读取 byt ...

  4. c语言将图像转换成字符画,25行Java代码将普通图片转换为字符画图片和文本的实现...

    本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用n ...

  5. 图片比对java,Java图片比对

    在自动化测试中,除了普通的值验证,经常还有一些图片验证,比如图片的匹配率,输出图片的差异图片等.本文主要用到了BufferedImage类来操作图片比对和输出差异图片,大体的思路如下: 1. 通过Im ...

  6. java 图片合成pdf_java将多张图片合并转为PDF

    所需jar包:com.lowagie.text package weaver.gy.util; import java.awt.image.BufferedImage; import java.io. ...

  7. java图片转换pdf_Java实现图片转换PDF文件的示例代码

    最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而对于只是转换一张图片的情况下,这些操作显然是非常繁琐的,所以作者就 ...

  8. Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式文件

    这篇文章介绍如何在Java应用程序中将PDF转换为HTML.Word.图片.SVG.XPS.PDF/A等格式. 本文所使用的PDF组件: Free Spire.PDF for Java Free Sp ...

  9. java svg 转pdf_Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式

    这篇文章介绍如何在Java应用程序中将PDF转换为HTML.Word.图片.SVG.XPS.PDF/A等格式. 本文所使用的PDF组件: Free Spire.PDF for Java Free Sp ...

最新文章

  1. .NET Framework 4.0-RequestValidationMode
  2. 基于MFC相机采集的实现与采集回调函数的应用实例
  3. linux C编程之makefile
  4. DFS深度优先搜索算法/BFS广度优先搜索算法(c/c++)
  5. 静态html的ajax如何发请求,静态页面ajax - 冥焱的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 我在项目中用到的vue FullCalendar的内置函数以及配置项
  7. php程序设计经典300例,第16-20例
  8. python如何查看官方文档
  9. 用java数组实现栈
  10. Android学习视频Mars-Android开发视频教程(全集)
  11. Python黑客编程入门教程
  12. 【静态ip保姆级教程他来了】
  13. HarryPotter第二部—Nagini
  14. cocoscreator1.52 删除anysdk
  15. Hydra-口令破解神器
  16. typescript学习之函数
  17. 几款视频剪辑软件,轻松完成视频转换,剪辑
  18. 似然函数的详细分析----似然函数的本质意义
  19. JAVA笔记---------字符串基础与操作
  20. LeetCode 188. Best Time to Buy and Sell Stock IV(股票买卖)

热门文章

  1. detailview的控件基础
  2. 用python生成M序列
  3. MySQL数据库教程天花板,mysql安装到mysql高级,强|硬 宋红康版
  4. html vertical-align:middle垂直居中 的方法
  5. Javaweb学习第三天,CSS(知识点来自广陵散老师总结)
  6. JavaWeb学习笔记(JavaScript)
  7. 一次就让你学懂java运算符
  8. linux命令之ls
  9. iphoneX的safari浏览器操作栏隐藏时兼容底部Home键
  10. busybox的init