PDF转成二进制流的字符串,及将二进制流反转成PDF

package com.xiangshuai;

//为工程添加 sun.misc.BASE64Encoder和sun.misc.BASE64Decoder包:  
//右键项目》属性》Java Build Path》jre System Library 》access rules 双击 add》resolution选择accessible,下面填上**点击确定即可!  
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;    
import java.io.ByteArrayOutputStream;    
import java.io.File;    
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;    


import sun.misc.BASE64Decoder;    
import sun.misc.BASE64Encoder;    
/***
 * @author lqx
 * 为WEBSERVICE 准备 PDF的二进制流的字符串
 * 文件在 E:\学习文档子目录压缩\工具技术2\PDF转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar
 * 我的网盘\我的笔记\学习文档子目录压缩\工具技术2\PDF转成二进制流的字符串,及将二进制流反转成PDF\PDFBinary.jar
 */
public class PDFBinaryUtil {    
    /*BASE64Encoder和BASE64Decoder这两个方法是sun公司的内部方法,并没有在java api中公开过,所以使用这些方法是不安全的,
     * 将来随时可能会从中去除,所以相应的应该使用替代的对象及方法,建议使用apache公司的API---可引用 import org.apache.commons.codec.binary.Base64;进行替换*/
  static BASE64Encoder encoder = new sun.misc.BASE64Encoder();    
  static BASE64Decoder decoder = new sun.misc.BASE64Decoder();    
      
  public static void main(String[] args) {    
       //将PDF格式文件转成base64编码 
       String base64String = getPDFBinary("C:/Users/Administrator/Desktop/铁路/高院测试库标准成果挂接格式模板/多页-2010-MS2/2019-MMM2-2122-101-001.pdf");
       System.out.println(base64String);
      //将base64的编码转成PDF格式文件,,保存到C:/Users/Administrator/Desktop/昊达临时/test2.pdf
      base64StringToPDF(base64String,"C:/Users/Administrator/Desktop/铁路/test2.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 {
          //建立读取文件的文件输出流
          fin = new FileInputStream(new File(filePath));
          //在文件输出流上安装节点流(更大效率读取)
          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 (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fin.close();
                bin.close();
                //关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException
                //baos.close();
                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;
      try {
           //将base64编码的字符串解码成字节数组
            byte[] bytes = decoder.decodeBuffer(base64sString);
          //apache公司的API
          //byte[] bytes = Base64.decodeBase64(base64sString);
            //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象
            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 {
                bin.close();
                fout.close();
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
  }
}

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值