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));
	}
}
相关推荐
墨染辉7 小时前
10.2 如何解决从复杂 PDF 文件中提取数据的问题?
pdf
shandianchengzi11 小时前
【记录】Excel|Excel 打印成 PDF 页数太多怎么办
pdf·excel
bianshaopeng20 小时前
android 原生加载pdf
android·pdf
卢卡斯23320 小时前
在线PDF怎么转换成JPG图片?分享14种转换操作!
pdf
J不A秃V头A1 天前
iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
java·pdf
嘻嘻仙人2 天前
【杂谈一之概率论】CDF、PDF、PMF和PPF概念解释与分析
pdf·概率论·pmf·cdf
资深前端之路2 天前
vue2 将页面生成pdf下载
前端·vue.js·pdf
Eiceblue2 天前
Python 复制PDF中的页面
vscode·python·pdf
J不A秃V头A3 天前
使用iTextPDF库设置文字为英文样式
java·pdf
Odoo穆尘3 天前
【零散技术】Odoo PDF 打印问题问题合集
pdf·odoo