请务必开启阿里云服务器465 ssl邮件端口
废话不多,我们直接上代码。
maven添加依赖:
java
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.24</version>
</dependency>
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
完整代码:
java
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.junit.jupiter.api.Test;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import com.spire.pdf.*;
import javax.imageio.ImageIO;
/**
* @author hsj
* @description:阿里云企业邮箱发送邮件和附件(请开启阿里云服务器465端口)
* @date 2024-4-25 8:59
*/
@Slf4j
public class Temail {
/**
* @Description:发邮件
* @author HeShengjin 2356899074@qq.com
* @date 2024-4-25 10:11
*/
@Test
public void t() throws IOException {
InputStream inputStream = null;
try {
//公司阿里云企业邮箱
String from = "你的阿里云企业邮箱";
// 加载PDF文档URL
URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
inputStream = conn.getInputStream();
// // 获取字节数组
byte[] bytesPdf = readInputStream(inputStream);
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
MailAccount account = new MailAccount();
account.setHost("smtp.mxhichina.com");
account.setPort(465);
account.setAuth(true);
account.setSslEnable(true);
account.setFrom(from.trim());
account.setUser(from.trim());
account.setPass("你的阿里云企业邮箱密码");
account.setCharset(CharsetUtil.CHARSET_UTF_8);
account.setCustomProperty("mail.smtp.ssl.socketFactory", sf);
MailUtil.send(account,
CollUtil.newArrayList("你的要发送的目标邮箱"),//目标邮箱
"主题名称",//邮件主题
"<p>测试发送邮件,使用阿里云云邮箱(发送中文名字附件)。</p>",
true,//支持HTML内容
FileUtil.writeBytes(bytesPdf,String.format("%s%s",FileUtil.getTmpDirPath(),"中文名字附件.pdf")));
} catch (Exception e){
e.printStackTrace();
log.error(String.format("发送邮件失败,%s",e.getMessage()));
} finally {
if (inputStream != null){
inputStream.close();
}
}
}
/**
* @Description:PDF转HTML
* @author HeShengjin 2356899074@qq.com
* @date 2024-4-25 10:11
*/
@Test
public void t2() throws IOException{
InputStream inputStream = null;
try {
// 加载PDF文档URL
URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
inputStream = conn.getInputStream();
// 获取字节数组
byte[] bytes = readInputStream(inputStream);
//加载PDF文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromBytes(bytes);
//设置useEmbeddedSvg和 useEmbeddedImg布尔值为true
pdf.getConvertOptions().setPdfToHtmlOptions(true,true);
//保存到流
File outFile = new File("PDFtoHTML.html");
OutputStream outputStream = new FileOutputStream(outFile);
pdf.saveToStream(outputStream, FileFormat.HTML);
pdf.close();
System.out.println("PDF转换成HTML完成!");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null){
inputStream.close();
}
}
}
/**
* @Description:PDF转图片base64
* @author HeShengjin 2356899074@qq.com
* @date 2024-4-25 10:12
*/
@Test
public void t3() throws IOException{
InputStream inputStream = null;
ByteArrayOutputStream byteArrayOutputStream = null;
try {
// 加载PDF文档URL
URL url = new URL("https://jixujiaoyu-test.oss-cn-shenzhen.aliyuncs.com/upload/20240425/1954fae396aa5aa1eb3dbad8edc19547.pdf");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
inputStream = conn.getInputStream();
// // 获取字节数组
byte[] bytesPdf = readInputStream(inputStream);
List<BufferedImage> bufferedImages = pdfToImage(bytesPdf);
byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImages.get(0),"jpg",byteArrayOutputStream);//只要PDF第一页的一张图片
// 清流
byteArrayOutputStream.flush();
// 转为byte[]
byte[] byteImage = byteArrayOutputStream.toByteArray();
// 将图片数据转换为Base64字符串
String base64String = Base64.getEncoder().encodeToString(byteImage);
String html = String.format("<img src=\"data:image/jpg;base64,%s\" />",base64String);
//
//保存到流
File outFile = new File("PDFtoIMGBase64.html");
FileUtils.writeByteArrayToFile(outFile,html.getBytes(StandardCharsets.UTF_8));
System.out.println("PDF转换成HTML完成!");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (inputStream != null){
inputStream.close();
}
if (byteArrayOutputStream != null){
// 关流
byteArrayOutputStream.close();
}
}
}
/**
*
* @Description: (InputStream转字节数组)
* @author hsj
* @date 2019年8月8日
*/
public byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
/**
* PDF转图片 (一个PDF很多页,所以很多图片)
* @param bytes:文件输入流
* @return
*/
public List<BufferedImage> pdfToImage(byte[] bytes){
List<BufferedImage> images = new ArrayList<>();
PDDocument document = null;
try {
// 加载PDF文档
document = PDDocument.load(bytes);
// 创建PDFRenderer对象
PDFRenderer renderer = new PDFRenderer(document);
for (int i = 0; i < document.getNumberOfPages(); i++) {
/**
* 《 72 》 此处设置得越大像素越高,生成得时候也会越久
* DPI 的设置一般根据具体的需求和使用场景来决定。DPI 越高,生成的图片分辨率越大,图像质量也越高,
* 但同时文件大小也会变得更大。通常情况下,如果需要对生成的图片进行放大、裁剪等操作,建议将 DPI 设置得较高,
* 以保证图像质量和细节的清晰度;如果只是需要简单地浏览或共享图片,可以适当降低 DPI 以减小文件大小。在实际开发中,
* 可以根据不同的应用场景进行调整。一般来说,72 DPI 是一个比较常见的默认值,可以作为参考。
*/
BufferedImage image = renderer.renderImageWithDPI(i, 72, ImageType.RGB);
images.add(image);
}
return images;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
// 关闭文档
try {
if (document != null) {
document.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}