当前位置:   article > 正文

Java Base64工具类,提供常用(文件、图片、PDF、URL)转换方法,欢迎留言完善...(转载博文)_java.util.base64

java.util.base64

前言
通过本篇的学习,你将学会Base64在实战中的使用,此工具包提供了常用的方法,如下:

text明文【转】Base64字符串;
text的Base64字符串【转】明文;
文件(图片、pdf等)【转】Base64;
Base64【转】文件(图片、pdf等);
将pdf的Base64编码格式【转为】img的Base64编码格式,只限最后一页的Base64编码;
将pdf的Base64编码格式【转为】img的Base64编码格式,并将所有页合成一张图片的Base64编码;
...
有关Base64编码(Encode)与解码(Decode)的基础知识,请请看我另一篇博文:关于Base64编码(Encode)与解码(Decode)的几种方式,这里面有道道

一、所需的包
注意:java.util.Base64是JDK1.8中新增的类,所以它只支持JDK1.8及以后的版本,如果你的JDK版本低于1.8,请使用org.apache.commons.codec.binary.Base64.

下面的包,是用于Base64的pdf转img使用的,如果不需要要,可以不引用,并删掉对应的方法(前言中的5和6)。

 

  1.   <dependency>
  2.         <groupId>org.apache.pdfbox</groupId>
  3.         <artifactId>fontbox</artifactId>
  4.         <version>2.0.1</version>
  5.     </dependency>
  6.     <dependency>
  7.         <groupId>org.apache.pdfbox</groupId>
  8.         <artifactId>pdfbox</artifactId>
  9.         <version>2.0.1</version>
  10.     </dependency>


二、Base64Util
Base64Util类,代码如下(可以直接复制使用,直接运行main方法看效果):

  1. import org.apache.commons.lang3.StringUtils;
  2. import org.apache.pdfbox.pdmodel.PDDocument;
  3. import org.apache.pdfbox.rendering.ImageType;
  4. import org.apache.pdfbox.rendering.PDFRenderer;
  5. import java.awt.image.BufferedImage;
  6. import java.io.*;
  7. import javax.imageio.ImageIO;
  8. import java.util.Base64;
  9.  
  10. public class Base64Utils {
  11.  
  12.     // Base64 编码与解码
  13.     private static final Base64.Decoder DECODER_64 = Base64.getDecoder();
  14.     private static final Base64.Encoder ENCODER_64 = Base64.getEncoder();
  15.  
  16.     // dpi越大转换后的图片越清晰,相对转换速度越慢
  17.     private static final Integer DPI = 200;
  18.  
  19.     // 编码、解码格式
  20.     private static final String CODE_FORMATE = "UTF-8";
  21.  
  22.     /**
  23.      * 1. text明文 转 Base64字符串
  24.      * @param text  明文
  25.      * @return      Base64 字符串
  26.      */
  27.     public static String textToBase64Str(String text) {
  28.         if (StringUtils.isBlank(text)) {
  29.             return text;
  30.         }
  31.         String encodedToStr = null;
  32.         try {
  33.             encodedToStr = ENCODER_64.encodeToString(text.getBytes(CODE_FORMATE));
  34.         } catch (UnsupportedEncodingException e) {
  35.             e.getMessage();
  36.         }
  37.         return encodedToStr;
  38.     }
  39.  
  40.     /**
  41.      * 2. text的Base64字符串 转 明文
  42.      * @param base64Str text的Base64字符串
  43.      * @return          text明文
  44.      */
  45.     public static String base64StrToText(String base64Str) {
  46.         if (StringUtils.isBlank(base64Str)) {
  47.             return base64Str;
  48.         }
  49.         String byteToText = null;
  50.         try {
  51.             byteToText = new String(DECODER_64.decode(base64Str), CODE_FORMATE);
  52.         } catch (UnsupportedEncodingException e) {
  53.             e.getMessage();
  54.         }
  55.         return byteToText;
  56.     }
  57.  
  58.     /**
  59.      * 3. 文件(图片、pdf) 转 Base64字符串
  60.      * @param file  需要转Base64的文件
  61.      * @return      Base64 字符串
  62.      */
  63.     public static String fileToBase64Str(File file) throws IOException {
  64.         String base64Str = null;
  65.         FileInputStream fin = null;
  66.         BufferedInputStream bin = null;
  67.         ByteArrayOutputStream baos = null;
  68.         BufferedOutputStream bout = null;
  69.         try {
  70.             fin = new FileInputStream(file);
  71.             bin = new BufferedInputStream(fin);
  72.             baos = new ByteArrayOutputStream();
  73.             bout = new BufferedOutputStream(baos);
  74.             // io
  75.             byte[] buffer = new byte[1024];
  76.             int len = bin.read(buffer);
  77.             while(len != -1){
  78.                 bout.write(buffer, 0, len);
  79.                 len = bin.read(buffer);
  80.             }
  81.             // 刷新此输出流,强制写出所有缓冲的输出字节
  82.             bout.flush();
  83.             byte[] bytes = baos.toByteArray();
  84.             // Base64字符编码
  85.             base64Str = ENCODER_64.encodeToString(bytes).trim();
  86.         } catch (IOException e) {
  87.             e.getMessage();
  88.         } finally{
  89.             try {
  90.                 fin.close();
  91.                 bin.close();
  92.                 bout.close();
  93.             } catch (IOException e) {
  94.                 e.getMessage();
  95.             }
  96.         }
  97.         return base64Str;
  98.     }
  99.  
  100.     /**
  101.      * 4. Base64字符串 转 文件(图片、pdf) -- 多用于测试
  102.      * @param base64Content Base64 字符串
  103.      * @param filePath      存放路径
  104.      */
  105.     public static void base64ContentToFile(String base64Content, String filePath) throws IOException{
  106.         BufferedInputStream bis = null;
  107.         FileOutputStream fos = null;
  108.         BufferedOutputStream bos = null;
  109.         try {
  110.             // Base64解码到字符数组
  111.             byte[] bytes =  DECODER_64.decode(base64Content);
  112.             ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
  113.             bis = new BufferedInputStream(byteInputStream);
  114.             File file = new File(filePath);
  115.             File path = file.getParentFile();
  116.             if(!path.exists()){
  117.                 path.mkdirs();
  118.             }
  119.             fos = new FileOutputStream(file);
  120.             bos = new BufferedOutputStream(fos);
  121.             // io
  122.             byte[] buffer = new byte[1024];
  123.             int length = bis.read(buffer);
  124.             while(length != -1){
  125.                 bos.write(buffer, 0, length);
  126.                 length = bis.read(buffer);
  127.             }
  128.             // 刷新此输出流,强制写出所有缓冲的输出字节
  129.             bos.flush();
  130.         } catch (IOException e) {
  131.             e.getMessage();
  132.         }finally{
  133.             try {
  134.                 bis.close();
  135.                 fos.close();
  136.                 bos.close();
  137.             } catch (IOException e) {
  138.                 e.getMessage();
  139.             }
  140.         }
  141.     }
  142.  
  143.     /**
  144.      * 5. 将pdf的base64编码格式 转为 img的base64编码格式,只限最后一页
  145.      * @param base64Pdf  pdf的base64编码
  146.      * @return           image的base64编码
  147.      */
  148.     public static String base64PdfToJpgBase64(String base64Pdf){
  149.         if (StringUtils.isBlank(base64Pdf)){
  150.             return base64Pdf;
  151.         }
  152.         String jpg_base64 = null;
  153.         PDDocument doc = null;
  154.         try {
  155.             // Base64解码
  156.             byte[] pdf_bytes = DECODER_64.decode(base64Pdf);
  157.             // 利用PdfBox生成图像
  158.             doc = PDDocument.load(pdf_bytes);
  159.             int size = doc.getNumberOfPages();
  160.             for (int i = 0; i < size; i++) {
  161.                 BufferedImage image = new PDFRenderer(doc).renderImageWithDPI(i, DPI, ImageType.RGB);
  162.                 // io流
  163.                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
  164.                 // 写入流中
  165.                 ImageIO.write(image, "jpg", baos);
  166.                 // 转换成字节
  167.                 byte[] jpg_Bytes = baos.toByteArray();
  168.                 // Base64编码
  169.                 jpg_base64 = ENCODER_64.encodeToString(jpg_Bytes).trim();
  170.                 // 删除 \r\n
  171.                 jpg_base64 = jpg_base64.replaceAll("\n|\n", "");
  172.             }
  173.         } catch (IOException e) {
  174.             e.getMessage();
  175.         } finally {
  176.             if (doc != null) {
  177.                 try {
  178.                     doc.close();
  179.                 } catch (IOException e) {
  180.                     e.getMessage();
  181.                 }
  182.             }
  183.         }
  184.         return jpg_base64;
  185.     }
  186.  
  187.     /**
  188.      * 6. 将pdf的base64编码格式 转为 img的base64编码格式,并将所有页合成一张图片
  189.      * @param pdfBase64Str  pdf的base64编码
  190.      * @return              image的base64编码
  191.      */
  192.     public static String base64PdfToJpgBase64ForOne(String pdfBase64Str){
  193.         if (StringUtils.isBlank(pdfBase64Str)){
  194.             return pdfBase64Str;
  195.         }
  196.         String jpg_base64 = null;
  197.         PDDocument doc = new PDDocument();
  198.         // io
  199.         ByteArrayOutputStream baos = new ByteArrayOutputStream();
  200.         try {
  201.             // Base64解码
  202.             byte[] pdf_bytes = DECODER_64.decode(pdfBase64Str);
  203.             doc = PDDocument.load(pdf_bytes);
  204.             int size = doc.getNumberOfPages();
  205.             /* 图像合并使用的参数 */
  206.             // 定义宽度
  207.             int width = 0;
  208.             // 保存一张图片中的RGB数据
  209.             int[] singleImgRGB;
  210.             // 定义高度,后面用于叠加
  211.             int shiftHeight = 0;
  212.             // 保存每张图片的像素值
  213.             BufferedImage imageResult = null;
  214.             // 利用PdfBox生成图像
  215.             PDDocument pdDocument = doc;
  216.             PDFRenderer renderer = new PDFRenderer(pdDocument);
  217.             /* 根据总页数, 按照50页生成一张长图片的逻辑, 进行拆分 */
  218.             // 每50页转成1张图片,有多少转多少
  219.             int pageLength = size;
  220.             // 总计循环的次数
  221.             int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
  222.             for (int m = 0; m < totalCount; m++) {
  223.                 for (int i = 0; i < pageLength; i++) {
  224.                     int pageIndex = i + (m * pageLength);
  225.                     if (pageIndex == pdDocument.getNumberOfPages()) {
  226.                         System.out.println("循环次数 m = " + m);
  227.                         break;
  228.                     }
  229.                     // dpi越大,则图片越清晰,图片越大,转换耗费的时间也越多
  230.                     BufferedImage image = renderer.renderImageWithDPI(pageIndex, DPI, ImageType.RGB);
  231.                     int imageHeight = image.getHeight();
  232.                     int imageWidth = image.getWidth();
  233.                     if (i == 0) {
  234.                         // 计算高度和偏移量
  235.                         // 使用第一张图片宽度;
  236.                         width = imageWidth;
  237.                         // 保存每页图片的像素值
  238.                         // 加个判断:如果m次循环后所剩的图片总数小于pageLength,则图片高度按剩余的张数绘制,否则会出现长图片下面全是黑色的情况
  239.                         if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
  240.                             imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
  241.                         } else {
  242.                             imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
  243.                         }
  244.                     } else {
  245.                         // 将高度不断累加
  246.                         shiftHeight += imageHeight;
  247.                     }
  248.                     singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
  249.                     imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
  250.                 }
  251.                 // 这个很重要,下面会有说明
  252.                 shiftHeight = 0;
  253.             }
  254.             pdDocument.close();
  255.             // 写入流中
  256.             ImageIO.write(imageResult, "jpg", baos);
  257.             // 转换成字节
  258.             byte[] jpg_Bytes = baos.toByteArray();
  259.             // 转换成base64串
  260.             jpg_base64 = ENCODER_64.encodeToString(jpg_Bytes).trim();
  261.             // 删除 \r\n
  262.             jpg_base64 = jpg_base64.replaceAll("\n|\n", "");
  263.         } catch (IOException e) {
  264.             e.getMessage();
  265.         } finally {
  266.             if (baos != null) {
  267.                 try {
  268.                     baos.close();
  269.                 } catch (IOException e) {
  270.                     e.getMessage();
  271.                 }
  272.             }
  273.             if (doc != null) {
  274.                 try {
  275.                     doc.close();
  276.                 } catch (IOException e) {
  277.                     e.getMessage();
  278.                 }
  279.             }
  280.         }
  281.         return jpg_base64;
  282.     }
  283.  
  284.     // 测试
  285.     public static void main(String args[]){
  286.         // 1.测试:text明文 转 Base64字符串
  287.         String text = "这是一串需要编码的明文,可以是URL、图片、文件或其他。";
  288.         String result_1 = Base64Utils.textToBase64Str(text);
  289.         System.out.println("text明文 转 Base64字符串:" + text + " → 经Base64编码后 → " + result_1);
  290.  
  291.         // 2.测试:text的Base64字符串 转 明文
  292.         String base64Str = "6L+Z5piv5LiA5Liy6ZyA6KaB57yW56CB55qE5piO5paH77yM5Y+v5Lul5pivVVJM44CB5Zu+54mH44CB5paH5Lu25oiW5YW25LuW44CC";
  293.         String result_2 = Base64Utils.base64StrToText(base64Str);
  294.         System.out.println("text的Base64字符串 转 明文:" + base64Str + " → 经Base64解码后 → " + result_2);
  295.  
  296.         // 3.测试:文件 转 Base64
  297.         // 4.测试:Base64 转 文件
  298.         try {
  299.             File filePath = new File("D:\\downloads\\test.pdf");
  300.             String tempBase64Str = Base64Utils.fileToBase64Str(filePath);
  301.             System.out.println("文件 转 Base64,完成,使用方法【4】反转验证。");
  302.             Base64Utils.base64ContentToFile(tempBase64Str, "D:\\downloads\\test_4.pdf");
  303.         } catch (IOException e) {
  304.             e.getMessage();
  305.         }
  306.         System.out.println("文件与Base64互转,完成,方法【4】通常用于测试。");
  307.  
  308.         // 5.测试:将pdf的base64编码格式 转为 img的base64编码格式,只限最后一页
  309.         try {
  310.             File filePath = new File("D:\\downloads\\test.pdf");
  311.             String tempBase64Str_1 = Base64Utils.fileToBase64Str(filePath);
  312.             String tempBase64Str_2 = Base64Utils.base64PdfToJpgBase64(tempBase64Str_1);
  313.             Base64Utils.base64ContentToFile(tempBase64Str_2, "D:\\downloads\\pdf_to_image_5.jpg");
  314.         } catch (IOException e) {
  315.             e.getMessage();
  316.         }
  317.         System.out.println("将pdf的base64编码格式 转为 img的base64编码格式,只限最后一页,完成。");
  318.  
  319.         // 6.测试:将pdf的base64编码格式 转为 img的base64编码格式,并合成一张图片
  320.         try {
  321.             File filePath = new File("D:\\downloads\\test.pdf");
  322.             String tempBase64Str_1 = Base64Utils.fileToBase64Str(filePath);
  323.             String tempBase64Str_2 = Base64Utils.base64PdfToJpgBase64ForOne(tempBase64Str_1);
  324.             Base64Utils.base64ContentToFile(tempBase64Str_2, "D:\\downloads\\pdf_to_image_6.jpg");
  325.         } catch (IOException e) {
  326.             e.getMessage();
  327.         }
  328.         System.out.println("将pdf的base64编码格式 转为 img的base64编码格式,并将所有页合成一张图片,完成。");
  329.     }
  330. }


总结

上述工具类中的方法,都是小编实际生产中遇到的场景,亲改亲测总结下来的;
方法可以直接复制使用,测试类也已调试好;
由于java.util.Base64是JDK1.8中新增的类,所以该类仅支持JDK1.8及以后的版本;
如果JDK版本低于1.8,需要把java.util.Base64换成org.apache.commons.codec.binary.Base64,具体方法可见【本篇“前言”中提示的博文】。
欢迎大家及时补充,把Util类变的更加完善,让更多的程序员能从中受益。

原文地址:Java Base64工具类,提供常用(文件、图片、PDF、URL)转换方法,欢迎留言完善...(原创博文,欢迎转载)_pdf文件base64解码工具_Java Punk的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/202912
推荐阅读
相关标签
  

闽ICP备14008679号