java 后端根据传入参数生成HTML并转换成Base64图片字节码(以及FTP上传常用)

38 篇文章 0 订阅

方案一 将数据拼接成HTML字符串报道到指定地址,读取html转成base64Img数据

 1>将字符串转成HTML并保持

String str="<!DOCTYPE html>\n" +
				"<html>\n" +
				"\n" +
				"<head>\n" +
				"    <meta charset=\"utf-8\" />\n" +
				"    <title>Echarts</title>\n" +
				"</head>\n" +
				"\n" +
				"<body>\n" +
				"    <div style=\"width: 650px\">\n" +
				"        <div style=\"width: 600px;margin: 0 auto;font-size: 10px;\">\n" +
				"            <div style=\"text-align: center;border-bottom: 1px dashed #000;line-height: 30px;font-size: 12px;\">\n" +
				"                临时住宿人员信息表\n" +
				"            </div>\n" +
				"            <p>流水号:<span>NS305152520190201150134</span></p>\n" +
				"            <div style=\"text-align: center\">\n" +
				"                <img src=\"https://ss1.bdstatic.com/5aAHeD3nKgcUp2HgoI7O1ygwehsv/media/ch1000/png/pct1.png\" alt=\"\" style=\"width:580px;height:auto;text-align: center\">\n" +
				"            </div>\n" +
				"            <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
				"            <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">姓名</td>\n" +
				"                    <td style=\"text-align: right\">XXX</td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">身份号码</td>\n" +
				"                    <td style=\"text-align: right\">XXXXX</td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">性别</td>\n" +
				"                    <td style=\"text-align: right\">男</td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">民族</td>\n" +
				"                    <td style=\"text-align: right\">XXX\n" +
				"                        <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXXX\">\n" +
				"                    </td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">联系电话</td>\n" +
				"                    <td style=\"text-align: right\">\n" +
				"                        XXXXXXX\n" +
				"                        <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXXXX">\n" +
				"                    </td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">常住地址</td>\n" +
				"                    <td style=\"text-align: right\">北京市昌平区\n" +
				"                        <img style=\"height:15px;position: relative;top:3px;\" src=\"XXXXXX">\n" +
				"                    </td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">入住酒店</td>\n" +
				"                    <td style=\"text-align: right\">\网证体验中心</td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">入住房号</td>\n" +
				"                    <td style=\"text-align: right\">458</td>\n" +
				"                </tr>\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">入住时间</td>\n" +
				"                    <td style=\"text-align: right\">2019.02.01-2019.02.02</td>\n" +
				"                </tr>\n" +
				"            </table>\n" +
				"            <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
				"            <p>广州市公安局南沙分局</p>\n" +
				"            <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">打印时间<span>2019.02.01 03-01</span></td>\n" +
				"                    <td style=\"text-align: right\">经办:<span>XXX</span></td>\n" +
				"                </tr>\n" +
				"            </table>\n" +
				"            <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
				"            <p>注:</p>\n" +
				"            <p>1、酒店需与派出所核对住宿人员信息;</p>\n" +
				"            <p>2、仅在同一酒店一次性住宿使用(可连续住宿多天,退房/复印无效);</p>\n" +
				"            <p>3、此件由酒店每月初交回派出所,复印订装备份</p>\n" +
				"            <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
				"            <table style=\"width:580px;margin: 0 auto;line-height: 20px;\">\n" +
				"                <tr>\n" +
				"                    <td style=\"text-align: left\">经办人签名:</td>\n" +
				"                    <td style=\"text-align: right\"><image style=\"height:20px;\" src=\"\"></image></td>\n" +
				"                </tr>\n" +
				"            </table>\n" +
				"            <div style=\"height:1px;border-top: 1px dashed #000;\"></div>\n" +
				"        </div>\n" +
				"    </div>\n" +
				"</body>\n" +
				"\n" +
				"</html>";
		  //String path=request.getServletContext().getRealPath("/");
		  File file=new File("./a.html");
		  BufferedWriter bw=null;
		  try {
			  bw=new BufferedWriter(new FileWriter(file,true));
			  bw.write(str);
			  bw.close();
		  } catch (IOException e) {
          // TODO Auto-generated catch block
			  e.printStackTrace();
		  }

2> 读取HTML并转换成Base64

 ImageRenderer render = new ImageRenderer();
		  String url = "file:///C:/Users/Lenovo/Desktop/a.html";
		  File file;
		  InputStream inputStream = null;
		  byte[] data = null;
		  try {
			  //创建一个临时文件
			  file = File.createTempFile("temp", ".png");
			  //将html转为png
			  FileOutputStream out = new FileOutputStream(file);
			  render.renderURL(url, out, ImageRenderer.Type.PNG);
			  //字节流读取png
			  inputStream = new FileInputStream(file);
			  data = new byte[inputStream.available()];
			  inputStream.read(data);
			  out.close();
			  inputStream.close();
			  file.deleteOnExit();
		  } catch (Exception e) {
			  e.printStackTrace();
		  }
		  BASE64Encoder encoder = new BASE64Encoder();
		  //删除所有空格,换行,解决base解码出现中文乱码
		  String dat1a = encoder.encode(data).replaceAll("\n", "").replaceAll("\r", "");
				  log.info(dat1a);

方案二 将数据拼转换成Io流程保存到ftp,读取ftp转成base64Img数据

1>将数据导入模板,上传ftp并解析

(这里模板就用上面的就好)

long data=System.currentTimeMillis();
      //上传到ftp
InputStream inputStream=null;
byte [] io;
try {
   io=str.getBytes();
   inputStream = new ByteArrayInputStream(io);
}catch (Exception e){
   e.printStackTrace();
}
FtpUtil.uploadFile("ip",端口号,"账号","密码","路径",data+"a.html",inputStream);
String base64Img=outImg("https://ns.weijing.gov.cn/DownloadData/data/download?serilId=a.html&fileName="+data+"a.html&path=/Dabby_test/wiicopData");

/**功能描述
    * @Desc
    * @Description 根据访问地址将HTML生成图片
    * @Author chenzhicai
    * @Date Created in 11:18 2019/2/12
    * @Params
    * @return
    * @Version:
    *
    *
    */
    public String outImg(String path){
		//解析html
		  ImageRenderer render = new ImageRenderer();
		  String url = path;
		  File file;
		  InputStream inputStream = null;
		  byte[] data = null;
		  try {
			  //创建一个临时文件
			  file = File.createTempFile("temp", ".png");
			  //将html转为png
			  FileOutputStream out = new FileOutputStream(file);
			  render.renderURL(url, out, ImageRenderer.Type.PNG);
			  //字节流读取png
			  inputStream = new FileInputStream(file);
			  data = new byte[inputStream.available()];
			  inputStream.read(data);
			  out.close();
			  inputStream.close();
			  file.deleteOnExit();
		  } catch (Exception e) {
			  e.printStackTrace();
		  }
		  BASE64Encoder encoder = new BASE64Encoder();
		  //删除所有空格,换行,解决base解码出现中文乱码
		  String dat1a = encoder.encode(data).replaceAll("\n", "").replaceAll("\r", "");
				  log.info(dat1a);
	    return  dat1a;
	}

Ftp工具类

依赖

<!--ftp-->
		<dependency>
			<groupId>commons-net</groupId>
			<artifactId>commons-net</artifactId>
			<version>3.6</version>
		</dependency>

		<!--解析-->
		<dependency>
			<groupId>com.github.xuwei-k</groupId>
			<artifactId>html2image</artifactId>
			<version>0.1.0</version>
		</dependency>
		<dependency>
			<groupId>net.sf.cssbox</groupId>
			<artifactId>cssbox</artifactId>
			<version>4.12</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.6</version>
		</dependency>
package cn.dabby.hotelacc.utils;

import java.io.*;

import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


/**
 * 
 * @author 
 *
 */
public class FtpUtil {

	/**
	   * 下载文件
	   * @param hostname FTP服务器地址
	   * @param port  FTP服务器端口号
	   * @param username  FTP登录帐号
	   * @param password  FTP登录密码
	   * @param pathname  FTP服务器文件目录
	   * @param filename  weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20weixinRefund_2017-06-20
	   * @param localpath 下载后的文件路径
	   * @return
	   */
	  public static boolean downloadFile(String hostname, int port, String username, String password, String pathname, String filename, String localpath){
	    boolean flag = false;
	    FTPClient ftpClient = new FTPClient();
	    //ftp中文编码格式设置
	    String LOCAL_CHARSET="GBK";
	    try {
	    	try {
	    		ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
	  	      //连接FTP服务器
	  	      	ftpClient.connect(hostname, port);
	  	      //登录FTP服务器
	  	      	ftpClient.login(username, password);
	  	      //验证FTP服务器是否登录成功
	  	      	int replyCode = ftpClient.getReplyCode();
	  	      	if(!FTPReply.isPositiveCompletion(replyCode)){
	  	        return flag;
	  	      	}
			} catch (Exception e) {
				throw new Exception("login ftp error!");
			}
	      //设置ftp编码格式
	      ftpClient.setControlEncoding(LOCAL_CHARSET);
	      //切换FTP目录
	      pathname=new String(pathname.getBytes("GBK"),"iso-8859-1");//如果目录名有中文则做编码格式转换
	      if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!  
                  System.out.println("创建文件目录【"+pathname+"】 失败!");  
                  return flag;
          } 
	      FTPFile[] ftpFiles = ftpClient.listFiles();
	      for(FTPFile file : ftpFiles){
	        if(filename.equalsIgnoreCase(file.getName())){
	          file.setName(new String(file.getName().getBytes("GBK"),"iso-8859-1"));//如果文件名名有中文则做编码格式转换
	          File localFile = new File(localpath);
	          OutputStream os = new FileOutputStream(localFile);
	          ftpClient.retrieveFile(file.getName(), os);
	          os.close();
	        }
	      }
	      ftpClient.logout();
	      flag = true;
	    } catch (Exception e) {
	      e.printStackTrace();
	      e.getMessage();
	    } finally{
	      if(ftpClient.isConnected()){
	        try {
	          ftpClient.logout();
	        } catch (IOException e) {
	          
	        }
	      }
	    }
	    return flag;
	  }
	  
	  /**
	   * 上传文件(可供Action/Controller层使用)
	   * @param hostname FTP服务器地址
	   * @param port  FTP服务器端口号
	   * @param username  FTP登录帐号
	   * @param password  FTP登录密码
	   * @param pathname  FTP服务器保存目录
	   * @param fileName  上传到FTP服务器后的文件名称
	   * @param inputStream 输入文件流
	   * @return
	   */
	  public static boolean uploadFile(String hostname, int port, String username, String password, String pathname, String fileName, InputStream inputStream){
	    boolean flag = false;
	    FTPClient ftpClient = new FTPClient();
	    ftpClient.setControlEncoding("UTF-8");
	    try {
	    	try {
	    		ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
	  	      //连接FTP服务器
	  	      	ftpClient.connect(hostname, port);
	  	      //登录FTP服务器
	  	      	ftpClient.login(username, password);
	  	      //验证FTP服务器是否登录成功
	  	      	int replyCode = ftpClient.getReplyCode();
	  	      	if(!FTPReply.isPositiveCompletion(replyCode)){
	  	        return flag;
	  	      	}
			} catch (Exception e) {
				throw new Exception("connect ftp error!");
			}
	      
	      //pathname=new String(pathname.getBytes("UTF-8"),"iso-8859-1");//如果目录名有中文则做编码格式转换
	      ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
	      if (!ftpClient.changeWorkingDirectory(pathname)) {// 如果不能进入dir下,说明此目录不存在!  
              if (!ftpClient.makeDirectory(pathname)) {  
                  System.out.println("创建文件目录【"+pathname+"】 失败!");  
              }  
          }
	      ftpClient.enterLocalPassiveMode();
	      ftpClient.storeFile(fileName, inputStream);
	      inputStream.close();
	      ftpClient.logout();
	      flag = true;
	    } catch (Exception e) {
	      e.printStackTrace();
	    } finally{
	      if(ftpClient.isConnected()){
	        try {
	          ftpClient.disconnect();
	        } catch (IOException e) {
	          e.printStackTrace();
	        }
	      }
	    }
	    return flag;
	  }
	    
	    
	  /**
	   * 上传文件(可对文件进行重命名)
	   * @param hostname FTP服务器地址
	   * @param port  FTP服务器端口号
	   * @param username  FTP登录帐号
	   * @param password  FTP登录密码
	   * @param pathname  FTP服务器保存目录
	   * @param filename  上传到FTP服务器后的文件名称
	   * @param originfilename 待上传文件的名称(绝对地址)
	   * @return
	   */
	  public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String filename, String originfilename){
	    boolean flag = false;
	    try {
	      InputStream inputStream = new FileInputStream(new File(originfilename));
	      flag = uploadFile(hostname, port, username, password, pathname, filename, inputStream);
	      System.out.println(flag);
	    } catch (Exception e) {
	      e.printStackTrace();
	    }
	    return flag;
	  }
	    
	  /**
	   * 上传文件(不可以进行文件的重命名操作)
	   * @param hostname FTP服务器地址
	   * @param port  FTP服务器端口号
	   * @param username  FTP登录帐号
	   * @param password  FTP登录密码
	   * @param pathname  FTP服务器保存目录
	   * @param originfilename 待上传文件的名称(绝对地址)
	   * @return
	   */
	  public static boolean uploadFileFromProduction(String hostname, int port, String username, String password, String pathname, String originfilename){
	    boolean flag = false;
	    try {
	      String fileName = new File(originfilename).getName();
	      InputStream inputStream = new FileInputStream(new File(originfilename));
	      flag = uploadFile(hostname, port, username, password, pathname, fileName, inputStream);
	      System.out.println(flag);
	    } catch (Exception e) {
	      e.printStackTrace();
	    }
	    return flag;
	  }
	    
	    
	  /**
	   * 删除文件
	   * @param hostname FTP服务器地址
	   * @param port  FTP服务器端口号
	   * @param username  FTP登录帐号
	   * @param password  FTP登录密码
	   * @param pathname  FTP服务器保存目录
	   * @param filename  要删除的文件名称
	   * @return
	   */
	  public static boolean deleteFile(String hostname, int port, String username, String password, String pathname, String filename){
	    boolean flag = false;
	    FTPClient ftpClient = new FTPClient();
	    try {
	    	try {
	    		ftpClient.setConnectTimeout(1000);//连接时间超过一秒即为超时
	  	      //连接FTP服务器
	  	      	ftpClient.connect(hostname, port);
	  	      //登录FTP服务器
	  	      	ftpClient.login(username, password);
	  	      //验证FTP服务器是否登录成功
	  	      	int replyCode = ftpClient.getReplyCode();
	  	      	if(!FTPReply.isPositiveCompletion(replyCode)){
	  	        return flag;
	  	      	}
			} catch (Exception e) {
				throw new Exception("login ftp error!");
			}
	      //切换FTP目录
	      ftpClient.changeWorkingDirectory(pathname);
	      ftpClient.dele(filename);
	      ftpClient.logout();
	      flag = true;
	    } catch (Exception e) {
	      e.printStackTrace();
	    } finally{
	      if(ftpClient.isConnected()){
	        try {
	          ftpClient.logout();
	        } catch (IOException e) {
	          
	        }
	      }
	    }
	    return flag;
	  }

	private FTPClient newFtpClient(String host, String user, String pwd) throws Exception {
		FTPClient ftp = new FTPClient();
		//ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
		int reply;
		ftp.connect(host);
		reply = ftp.getReplyCode();
		if (!FTPReply.isPositiveCompletion(reply)) {
			ftp.disconnect();
			throw new Exception("Exception in connecting to FTP Server");
		}
		ftp.login(user, pwd);
		ftp.setFileType(FTP.BINARY_FILE_TYPE);
		ftp.enterLocalPassiveMode();
		return ftp;
	}

	/**
	 * 根据地址直接获取文件内容
	 * @param absp
	 * @return
	 */
	public  byte[] getFile(String absp,String Host,String Username,String Password) {
		byte[] ret = null;
		try {
			FTPClient ftp = newFtpClient(Host, Username, Password);
			InputStream is = ftp.retrieveFileStream(absp);
			if (is != null) {
				ret = IOUtils.toByteArray(is);
				is.close();
			}else{
				System.out.println("找不到当天对账文件");
			}
		} catch (Exception e) {
			ret = null;
		}
		return ret;
	}
	  
    //可以将获取的byte[]  转换城base64字符串
    Base64.getEncoder().encode(ret)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值