<!--PDF转图片--> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.20</version> </dependency>
如果需要改变字体的话,还需要加上这个:
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.9</version> </dependency>
通过Apache的pdfbox实现
/* * PDF转图片 * @attention: 将整个PDF文件转图片(所有页) * @date: 2021-05-12 10:46 * @param: imgPath * 图片全路径 * @param: imgNamePrefix * 图片名称前缀 * @param: pdfBytes * PDF二进制流 * @return: boolean */ public static boolean toImageFromBytes(String imgPath, String imgNamePrefix, byte[] pdfBytes) { return toImageFromBytes(imgPath, imgNamePrefix, pdfBytes, "png", 0, -1); } /* * PDF转图片 * @attention: 支持自主选择起始页和结束页 * @date: 2021-05-12 10:41 * @param: imgPath * 图片全路径 * @param: imgNamePrefix * 图片名称前缀 * @param: pdfBytes * PDF二进制流 * @param: imgType * 图片类型 * @param: pageStartIndex * 开始页:开始转换的页码(第1页,页码为0) * @param: pageEndIndex * 结束页:结束转换的页码(最后1页,页码为-1) * @return: boolean * 只有PDF文件所有页数转换成功才返回true */ public static boolean toImageFromBytes(String imgPath, @NotNull String imgNamePrefix, byte[] pdfBytes, String imgType, int pageStartIndex, int pageEndIndex) { boolean isSuccess = false; // 图片名称处理(注意文件名里不要有点,否则一律视为后缀名被抹掉) if (imgNamePrefix.indexOf(".") > 0) imgNamePrefix = imgNamePrefix.substring(0, imgNamePrefix.indexOf(".") ); // 添加路径分隔符 if (!imgPath.endsWith("/") && !imgPath.endsWith("\\")) imgPath += File.separator; try { // 加载PDF PDDocument doc = PDDocument.load(pdfBytes); PDFRenderer renderer = new PDFRenderer(doc); // pdf总页数 int pageCount = doc.getNumberOfPages(); log.info("该pdf文件共有" + pageCount + "页"); for (int i = 0; i < pageCount; i++) { // dpi越大转换后越清晰,但转换速度越慢 BufferedImage image = renderer.renderImageWithDPI(i, 250); // Windows native DPI // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图 // 生成图片 if (pageCount == 1) ImageIO.write(image, imgType, new File(imgPath + imgNamePrefix + "." + imgType)); else ImageIO.write(image, imgType, new File(imgPath + imgNamePrefix + "_" + (i + 1) + "." + imgType)); log.info("pdf第" + (i + 1) + "页转图片成功"); } isSuccess = true; } catch (IOException e) { e.printStackTrace(); log.error("pdf-->图片失败:" + e.getMessage()); } log.info("pdf-->图片成功"); return isSuccess; }
toImageFromBytes("C:\\Users\\Marydon\\Desktop", "图片", Base64Utils.decodeToBytes(sb.toString()));
注意:
我曾尝试直接将PDF数据强制输出到图片文件中,结果发现这样是行不通的(生成的图片文件无法打开)
这,也就证明了PDF的数据流和图片的数据流,虽然都可以通过java转换成流,但两个本质还是不一样的。
原文:https://www.cnblogs.com/Marydon20170307/p/14759048.html