Java教程

Java PDF转图片

本文主要是介绍Java PDF转图片,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.pom.xml文件配置

org.apache.pdfbox fontbox 2.0.1 org.apache.pdfbox pdfbox 2.0.1

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.*;

/**

  • TODO

  • @Author: DYS

  • @date 2021/8/4 18:02

  • @描述:
    */
    @Slf4j
    public class Base64Utils {

    /**

    • @描述: 根据base64编码生成图片,保存在Path中
    • @Date: 2021/8/5 13:08
    • @param base64Code:
    • @param filePath:
    • @param picName:
    • @return boolean
    • @Description: //TODO PC002
    • @Author: DYS
      **/
      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 = "data:image/png;base64," + base64PdfToJpgBase64(base64Code);
      String handledBase64Code =base64PdfToJpgBase64(base64Code);
      // Base64解码
      // 替换掉多余的空格
      String replace = handledBase64Code.replaceAll(" ", "");
      BASE64Decoder decoder = new BASE64Decoder();
      try {
      //Base64解码
      byte[] b = decoder.decodeBuffer(replace);
      for (int i = 0; i < b.length; ++i) {
      if (b[i] < 0) {//调整异常数据
      b[i] += 256;
      }
      }
      //生成jpeg图片
      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;
      }
      }

    // 将pdf的base64编码格式转为img的base64编码格式并合成一张图片:
    public static String base64PdfToJpgBase64(String base64Pdf) {
    if (StrUtil.isEmpty(base64Pdf)) {
    return null;
    }
    String jpg_base64 = null;
    // Base64Decoder decoder = new Base64Decoder();
    try {
    // Base64解码
    byte[] pdf_bytes = Base64Decoder.decode(base64Pdf);
    PDDocument doc = PDDocument.load(pdf_bytes);
    int size = doc.getNumberOfPages();
    /图像合并使用的参数/
    //定义宽度
    int width = 0;
    // 保存一张图片中的RGB数据
    int[] singleImgRGB;
    // 定义高度,后面用于叠加
    int shiftHeight = 0;
    //保存每张图片的像素值
    BufferedImage imageResult = null;
    // 利用PdfBox生成图像
    PDDocument pdDocument = doc;
    PDFRenderer renderer = new PDFRenderer(pdDocument);
    /根据总页数, 按照50页生成一张长图片的逻辑, 进行拆分/
    // 每50页转成1张图片
    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;
    }
    // 96为图片的dpi,dpi越大,则图片越清晰,图片越大,转换耗费的时间也越多
    BufferedImage image = renderer.renderImageWithDPI(pageIndex, 150, ImageType.RGB);
    int imageHeight = image.getHeight();
    int imageWidth = image.getWidth();
    if (i == 0) {
    //计算高度和偏移量
    //使用第一张图片宽度;
    width = imageWidth;
    // 保存每页图片的像素值
    // 加个判断:如果m次循环后所剩的图片总数小于pageLength,则图片高度按剩余的张数绘制,否则会出现长图片下面全是黑色的情况
    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();//io流
    ImageIO.write(imageResult, "jpg", baos);//写入流中
    byte[] jpg_Bytes = baos.toByteArray();//转换成字节
    BASE64Encoder encoder = new BASE64Encoder();
    jpg_base64 = encoder.encodeBuffer(jpg_Bytes).trim();//转换成base64串
    jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
    baos.close();
    doc.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return jpg_base64;
    }

    /**

    • 图片生成base64编码
    • @param imgPath
    • @return
      */
      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();
      }
      //对字节数组Base64编码
      BASE64Encoder encoder = new BASE64Encoder();
      return encoder.encode(data);//返回Base64编码过的字节数组字符串
      }

    public static byte[] base64ToImgByteArray(String base64) throws IOException {
    sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
    //因为参数base64来源不一样,需要将附件数据替换清空掉。如果此入参来自canvas.toDataURL("image/png");
    base64 = base64.replaceAll("data:image/png;base64,", "");
    //base64解码并转为二进制数组
    byte[] bytes = decoder.decodeBuffer(base64);
    for (int i = 0; i < bytes.length; ++i) {
    if (bytes[i] < 0) {// 调整异常数据
    bytes[i] += 256;
    }
    }
    return bytes;
    }

}

这篇关于Java PDF转图片的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!