目 录CONTENT

文章目录

PDF的Base64转换Png/JpgBase64

芈亓
2023-05-31 / 0 评论 / 2 点赞 / 620 阅读 / 533 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-06-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

如题,下面为代码块:

    /**
    * @Param [pdfBase64Str, changeType]
    * @return java.lang.String
    **/
   public static String pdfToPngOrJpg(String pdfBase64Str,String changeType){
       //这个base64是pdf的base64
       //想转jpg就将下面的png改为jpg
       String base64 = pdfBase64Str;
       if (StringUtils.isEmpty(base64)){
           System.out.println("");
       }
       String jpg_base64 = null;
       BASE64Decoder decoder = new BASE64Decoder();
       try {
           // Base64解码
           byte[] pdf_bytes = decoder.decodeBuffer(base64);
           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, 106, 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, changeType, 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();
           return jpg_base64;
       } catch (IOException e) {
           e.printStackTrace();
       }
       return "";
   }
2

评论区