package com.ltkj.web.config.pdfutils; /** * @Author: 西安路泰科技有限公司/lige * @Date: 2022/12/9 18:24 */ import org.apache.commons.codec.binary.Base64; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; /*** * 为WEBSERVICE 准备 PDF的二进制流的字符串 * 文件在 XXX转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar * xxx转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar */ public class PDFBinaryUtil { /*BASE64Encoder和BASE64Decoder这两个方法是sun公司的内部方法,并没有在java api中公开过,所以使用这些方法是不安全的, * 将来随时可能会从中去除,所以相应的应该使用替代的对象及方法,建议使用apache公司的API---可引用 import org.apache.commons.codec.binary.Base64;进行替换*/ static BASE64Encoder encoder = new BASE64Encoder(); static BASE64Decoder decoder = new BASE64Decoder(); public static void main(String[] args) { //将PDF格式文件转成base64编码 String base64String = getPDFBinary("d:\\Users\\w\\Desktop\\pdf\\22212087152体检报告.pdf"); System.out.println(base64String); //将base64的编码转成PDF格式文件,,保存到XXX base64StringToPDF(base64String, "d:\\Users\\w\\Desktop\\pdf\\22212087152体检报告1111111.pdf"); } /** * 将PDF转换成base64编码 * 1.使用BufferedInputStream和FileInputStream从File指定的文件中读取内容; * 2.然后建立写入到ByteArrayOutputStream底层输出流对象的缓冲输出流BufferedOutputStream * 3.底层输出流转换成字节数组,然后由BASE64Encoder的对象对流进行编码 */ public static String getPDFBinary(String filePath) { FileInputStream fin = null; BufferedInputStream bin = null; ByteArrayOutputStream baos = null; BufferedOutputStream bout = null; try { File file = new File(filePath); //建立读取文件的文件输出流 fin = new FileInputStream(file); //在文件输出流上安装节点流(更大效率读取) bin = new BufferedInputStream(fin); // 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量 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(); //sun公司的API //return encoder.encodeBuffer(bytes).trim(); //apache公司的API return Base64.encodeBase64String(bytes); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fin != null) fin.close(); if (bin != null) bin.close(); //关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException if (baos != null) baos.close(); if (bout != null) bout.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } /** * 将base64编码转换成PDF,保存到 * * @param base64sString 1.使用BASE64Decoder对编码的字符串解码成字节数组 * 2.使用底层输入流ByteArrayInputStream对象从字节数组中获取数据; * 3.建立从底层输入流中读取数据的BufferedInputStream缓冲输出流对象; * 4.使用BufferedOutputStream和FileOutputSteam输出数据到指定的文件中 */ public static void base64StringToPDF(String base64sString, String filePath) { BufferedInputStream bin = null; FileOutputStream fout = null; BufferedOutputStream bout = null; ByteArrayInputStream bais = null; try { //将base64编码的字符串解码成字节数组 byte[] bytes = decoder.decodeBuffer(base64sString); //apache公司的API //byte[] bytes = Base64.decodeBase64(base64sString); //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象 bais = new ByteArrayInputStream(bytes); //创建从底层输入流中读取数据的缓冲输入流对象 bin = new BufferedInputStream(bais); //指定输出的文件 File file = new File(filePath); //创建到指定文件的输出流 fout = new FileOutputStream(file); //为文件输出流对接缓冲输出流对象 bout = new BufferedOutputStream(fout); byte[] buffers = new byte[1024]; int len = bin.read(buffers); while (len != -1) { bout.write(buffers, 0, len); len = bin.read(buffers); } //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题 bout.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { /* if (bin!=null) bin.close(); if (fout!=null) fout.close(); if (bout!=null) bout.close();*/ if (bout != null) bout.close(); if (fout != null) fout.close(); if (bin != null) bin.close(); if (bais != null) { bais.close(); } } catch (IOException e) { e.printStackTrace(); } } } }