PDF转化为图片

Java 类 PDF2Image 在包 com.oncloudsoft.zbznhc.common.util.pdf 中是用来将 PDF 文件转换为图像的。它使用了 Apache PDFBox 库来处理 PDF 文档并生成图像。下面是类中每个部分的详细解释:

类和方法说明

  • PDF2Image:

    • 使用了 Lombok 库的 @Slf4j 注解,这会为类自动生成一个日志记录器(logger),可以用来记录信息、错误等。
    • 提供了两个重载的 pdf2Image 方法,用于处理 PDF 到图像的转换。
  • 方法 pdf2Image(String file, String targetFolder):

    • 接受 PDF 文件的路径和目标文件夹路径作为参数。
    • 打印日志信息。
    • 调用另一个重载的 pdf2Image 方法来执行转换。
  • 方法 pdf2Image(File file, String targetFolder):

    • 接受 File 对象和目标文件夹路径作为参数。
    • 使用 PDDocument.load 加载 PDF 文件,并设置内存使用设置为仅使用临时文件。
    • 获取 PDF 文档的总页数。
    • 使用 PDFRenderer 类来渲染 PDF 页面为图像。
    • 逐页渲染 PDF,并将渲染后的图像保存为 JPG 格式的文件。
    • 图像的文件名基于原始 PDF 文件名,并附加页码和 .jpg 后缀。
    • 处理完所有页面后,返回包含生成的图像文件路径的列表。
  • 异常处理:

    • 捕获并记录 InvalidPasswordExceptionIOException 异常。
  • 主方法 main(String[] args):

    • 用于测试 pdf2Image 方法。
    • 记录并打印转换过程所需的时间。

功能

该类主要用于将 PDF 文件转换为一系列的 JPG 图像,每页一个图像。这在需要将 PDF 文档的内容以图像形式展示或处理时非常有用,如在网页上显示 PDF 页面的预览图。

使用 Apache PDFBox

Apache PDFBox 是一个开源的 Java 工具,用于处理 PDF 文档。这个类利用 PDFBox 提供的功能来渲染和保存 PDF 页面作为图像。

注意事项

  • 需要确保 Apache PDFBox 库已被添加到项目依赖中。
  • 方法中使用了硬编码的 DPI(每英寸点数)和 JPG 图像质量设置,这可能需要根据实际需求进行调整。
  • 生成的 JPG 文件将保存在指定的目标文件夹中。
bash 复制代码
package com.oncloudsoft.zbznhc.common.util.pdf;

import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


@Slf4j
public class PDF2Image {

	private static final int PAGE_SIZE = 50;

	/**
	 * 提取
	 * @param file			PDF文件
	 * @param targetFolder 	图片存放目录
	 * @return 
	 */
	public static ArrayList<String> pdf2Image(String file, String targetFolder) {
		log.info("PDF2Image中,file为:"+file);
		return pdf2Image(new File(file), targetFolder);
	}

	/**
	 * 由于apache-pdfbox版本升级到2.0.18, 部分api不兼容,覆盖旧版本pdf2Image方法
	 * @param file pdf文件
	 * @param targetFolder  图片保存文件夹路径
	 */
	public static ArrayList<String> pdf2Image(File file, String targetFolder) {

		ArrayList<String> list = new ArrayList<>();

		String prex = file.getName().split("\\.")[0];

		try (
				PDDocument document = PDDocument.load(file, MemoryUsageSetting.setupTempFileOnly());
		) {

			int pages = document.getNumberOfPages();

			PDFRenderer renderer = new PDFRenderer(document);

			int k = 0;

			int count = 1;

			List<BufferedImage> imageList = new ArrayList<>(PAGE_SIZE);

			for (;;) {

				int startPage = k * PAGE_SIZE;

				int endPage = startPage + PAGE_SIZE > pages ? pages : startPage + PAGE_SIZE;

				k++;

				imageList.clear();

				for (int i = startPage; i < endPage; i++) {

					BufferedImage image = renderer.renderImageWithDPI(i, 150);

//					imageList.add(image);

					String imgPath = targetFolder + File.separator + prex + "_" + (count++) + ".jpg";

					ImageIOUtil.writeImage(image, imgPath, 200);

					list.add(imgPath);
				}

				if (endPage == pages) break;
			}

			return list;

		} catch (InvalidPasswordException e) {
			log.error("", e);
		} catch (IOException e) {
			log.error("", e);
		}

		return list;
	}

	public static void main(String[] args) throws IOException {

		long s = System.currentTimeMillis();

		String file = "/home/sunyuhua/test/1+2.pdf";

		String folder = "/home/sunyuhua/test/jpg";

		pdf2Image(file, folder);

		System.out.println("耗时: " + (System.currentTimeMillis() - s));
	}
}
相关推荐
m0_7482412312 小时前
ElasticPDF-新国产 PDF 编辑器开发框架(基于 pdf.js Web PDF批注开发,实现高亮多边形橡皮擦历史记录保存注释文字)
前端·pdf·编辑器
ComPDFKit13 小时前
开源 JS PDF 库比较
pdf
杨浦老苏13 小时前
开源PDF翻译工具PDFMathTranslate
人工智能·docker·ai·pdf·群晖·翻译
LostSpeed18 小时前
在福昕(pdf)阅读器中导航到上次阅读页面的方法
pdf
旭久18 小时前
SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格
pdf·html·springboot
神色自若2 天前
Net9为PDF文字替换,使用Spire.PDF版本10.12.4.1360
pdf
机器懒得学习2 天前
解析交通事故报告:利用 PDF、AI 与数据标准化技术构建智能分析系统
pdf
合合技术团队2 天前
高效准确的PDF解析工具,赋能企业非结构化数据治理
人工智能·科技·pdf·aigc·文档
jingling5552 天前
如何使用免费资源--知网篇
开发语言·经验分享·搜索引擎·pdf·开源
haha_qasim3 天前
怎么将pdf中的某一个提取出来?介绍几种提取PDF中页面的方法
前端·pdf