1.pom.xml文件配置
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
2.工具类
import cn.hutool.core.codec.Base64Decoder;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
@Slf4j
public class Base64Utils {
public static boolean base64ToPic(String base64Code, String filePath, String picName) {
if (base64Code == null) {
return false;
}
File existsFilePath = new File(filePath);
if (!existsFilePath.exists()) {
existsFilePath.mkdirs();
}
String handledBase64Code =base64PdfToJpgBase64(base64Code);
String replace = handledBase64Code.replaceAll(" ", "");
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(replace);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] += 256;
}
}
String path = filePath + "/" + picName + ".png";
OutputStream out = new FileOutputStream(path);
out.write(b);
out.flush();
out.close();
return true;
} catch (Exception e) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace();
e.printStackTrace(printWriter);
log.error("base64编码生成图片 error >>> " + stringWriter.toString());
return false;
}
}
public static String base64PdfToJpgBase64(String base64Pdf) {
if (StrUtil.isEmpty(base64Pdf)) {
return null;
}
String jpg_base64 = null;
try {
byte[] pdf_bytes = Base64Decoder.decode(base64Pdf);
PDDocument doc = PDDocument.load(pdf_bytes);
int size = doc.getNumberOfPages();
int width = 0;
int[] singleImgRGB;
int shiftHeight = 0;
BufferedImage imageResult = null;
PDDocument pdDocument = doc;
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pageLength = size;
int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
for (int m = 0; m < totalCount; m++) {
for (int i = 0; i < pageLength; i++) {
int pageIndex = i + (m * pageLength);
if (pageIndex == pdDocument.getNumberOfPages()) {
System.out.println("循环次数 m = " + m);
break;
}
BufferedImage image = renderer.renderImageWithDPI(pageIndex, 150, ImageType.RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
if (i == 0) {
width = imageWidth;
if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
} else {
imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
}
} else {
shiftHeight += imageHeight;
}
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
}
shiftHeight = 0;
}
pdDocument.close();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(imageResult, "jpg", baos);
byte[] jpg_Bytes = baos.toByteArray();
BASE64Encoder encoder = new BASE64Encoder();
jpg_base64 = encoder.encodeBuffer(jpg_Bytes).trim();
jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");
baos.close();
doc.close();
} catch (IOException e) {
e.printStackTrace();
}
return jpg_base64;
}
public static String PicToBase64(String imgPath) {
String result = "";
File imgFile = new File(imgPath);
if (!imgFile.exists()) {
System.out.println("非法路径");
return result;
}
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
public static byte[] base64ToImgByteArray(String base64) throws IOException {
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
base64 = base64.replaceAll("data:image/png;base64,", "");
byte[] bytes = decoder.decodeBuffer(base64);
for (int i = 0; i < bytes.length; ++i) {
if (bytes[i] < 0) {
bytes[i] += 256;
}
}
return bytes;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!