1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java实现图片的base64编码转换成pdf的base64位编码

java实现图片的base64编码转换成pdf的base64位编码

时间:2020-11-21 17:01:55

相关推荐

java实现图片的base64编码转换成pdf的base64位编码

实现思路:1.图片base64编码转成图片文件,

2.图片文件转成pdf文件

3.pdf文件转成pdf的base64编码

注意点:在获取图片时, Image.getInstance(source)方法只能获取到文件格式为:gif,jpeg,png,bmp,wmf等格式的图片。

参考的是这几位大佬的文章

主要参考文章:(经过查找把其中的坑填上了)

JAVA将图片的base64转成PDF的base64字符串_张丽峰的博客-CSDN博客_base64转成pdf java

图片转base64位编码

image与base64相互转换_blue5299的博客-CSDN博客_image转base64

图片转pdf

图片转为PDF的bug解决之旅_WoHuaKaiHou的博客-CSDN博客_itextpdf 图片转pdf

需要引入的依赖:

<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency>

具体实现的工具类

package com.insigma.ywxt.util;import com.itextpdf.text.BadElementException;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Image;import com.itextpdf.text.pdf.PdfWriter;import sun.misc.BASE64Encoder;import java.io.*;import java.text.SimpleDateFormat;import java.util.Base64;import java.util.Date;public class ImageToPdfUtil2 {/*** Description: 将图片的base64转成PDF的base64编码* @param bas64ImageStr 二维码图片base64*/public String imageBase64ToPdfBase64(String bas64ImageStr){String pdfBase64 = "";//PDF的base64编码try{Date date = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");String time=sdf.format(date);//临时pdf文件路径 D:\app//图片名称流水号String custOrderNbr = time;//1.根据微厅返回的请求参数生成二维码 base64 编码bas64ImageStr = bas64ImageStr.replaceAll("\r|\n", "");//2.获取要存储文件的路径,即获取src资源文件编译后的路径(即classes路径)String url = this.getClass().getClassLoader().getResource("").getPath();//对路劲进行拼接添加String serviceImgPath = url + "serviceImg/";//服务器上存放二维码图片的路径String servicePdfPath = url + "servicePdf/";//服务器上存放二维码PDF的路径//3.判断服务器是否存在此文件夹,不存在则新建File file1 =new File(serviceImgPath);File file2 =new File(servicePdfPath);if(!file1.exists() && !file1.isDirectory()) {file1.mkdir();}if(!file2.exists() && !file2.isDirectory()) {file2.mkdir();}//4.二维码图片的文件名字和最终保存的二维码文件路径String fileImageName = custOrderNbr+"_phone.png";//二维码图片路径名字String filePdfName = custOrderNbr+"_phone.pdf";//PDF图片路径名字String lastImagePath = serviceImgPath+fileImageName;//最终二维码图片存放的路径String lastPdfPath = servicePdfPath+filePdfName;//最终二维码PDF存放的路径//5.首先保存二维码图片Base64ToImage(bas64ImageStr,lastImagePath);//6.然后把二维码图片转成PDF二维码文件进行储存ImgChangePDF(lastImagePath,lastPdfPath);//7.最后将PDF转成base64,PDF的base64才是最终能推送到签字版的File file3 =new File(lastPdfPath);pdfBase64 = PDFToBase64(file3);pdfBase64 = pdfBase64.replaceAll("\r|\n", "");//8.需要删除创建的临时文件File imagefile = new File(lastImagePath);if(imagefile.exists()){imagefile.delete();}File pdffile = new File(lastPdfPath);if(pdffile.exists()){pdffile.delete();}}catch (Exception e){e.printStackTrace();}return pdfBase64;}/*** pdf 转64位编码* @param file* @return*/public static String PDFToBase64(File file) {BASE64Encoder encoder = new BASE64Encoder();FileInputStream fin =null;BufferedInputStream bin =null;ByteArrayOutputStream baos = null;BufferedOutputStream bout =null;try {fin = new FileInputStream(file);bin = new BufferedInputStream(fin);baos = new ByteArrayOutputStream();bout = new BufferedOutputStream(baos);byte[] buffer = new byte[1024];int len = bin.read(buffer);while(len != -1){bout.write(buffer, 0, len);len = bin.read(buffer);}//刷新此输出流并强制写出所有缓冲的输出字节bout.flush();byte[] bytes = baos.toByteArray();return encoder.encodeBuffer(bytes).trim();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {fin.close();bin.close();bout.close();} catch (IOException e) {e.printStackTrace();}}return null;}/*** base64转image* @param imgStr* @param imgFilePath* @return*///base64 转成图片public static boolean Base64ToImage(String imgStr, String imgFilePath) {// 对字节数组字符串进行Base64解码并生成图片if (imgStr == null) // 图像数据为空return false;// 解密try {// 解密Base64.Decoder decoder = Base64.getDecoder();// 去掉base64前缀 data:image/png;base64,imgStr = imgStr.substring(imgStr.indexOf(",", 1) + 1, imgStr.length());byte[] b = decoder.decode(imgStr);// 处理数据for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {b[i] += 256;}}// 保存图片OutputStream out = new FileOutputStream(imgFilePath);out.write(b);out.flush();out.close();// 返回图片的相对路径 = 图片分类路径+图片名+图片后缀return true;} catch (IOException e) {e.printStackTrace();return false;}}/*** 将图片转换成PDF* @param imageUrl 二维码图片路径 可以调用 FileUtil.getFileList() 方法* @param target PDF的名字和位置*/public static void ImgChangePDF(String imageUrl, String target) {//创建一个文档对象Document doc = new Document();try {//定义输出文件的位置PdfWriter.getInstance(doc, new FileOutputStream(target));//开启文档doc.open();//路径Image img = Image.getInstance(imageUrl);//获得宽高Float h = img.getHeight();Float w = img.getWidth();//统一压缩Integer percent = getPercent(h, w);//图片居中img.setAlignment(Image.MIDDLE);//百分比显示图img.scalePercent(percent);//设置高和宽的比例doc.add(img);// 关闭文档if(doc != null){doc.close();}} catch (IOException e) {e.printStackTrace();} catch (BadElementException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();}}/*** 压缩* @param*/public static Integer getPercent(Float h,Float w){Integer g=0;Float g2=0.0f;g2=480/w*100;g=Math.round(g2);return g;}}

测试类

package insigma;import com.insigma.ywxt.util.ImageToPdfUtil;import com.insigma.ywxt.util.ImageToPdfUtil2;import lombok.extern.slf4j.Slf4j;import org.junit.Ignore;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;@Slf4j@RunWith(SpringRunner.class)@SpringBootTest(classes = SpringAmqpTest.class)public class SpringAmqpTest {private ImageToPdfUtil2 imageToPdfUtil2;//具体的图片base64编码 太长了我就不放了@Value("${pdf.image64}")private String image64;@Testpublic void imageToPdf(){imageToPdfUtil2 = new ImageToPdfUtil2();String pdf642 = imageToPdfUtil2.imageBase64ToPdfBase64(image64);String aa = pdf642;}}

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