java pdf转为多张图片格式_java进行PDF和图片之间的相互转换
简介
在项目中我们有时候会遇到操作PDF文件的需求,如将PDF的每一页转换成图片,今天我们就来实现一下相关功能。
实现
引入依赖
org.apache.pdfbox
pdfbox
2.0.21
pdfbox是一个开源的操作PDF的工具包,这里是 官方文档
将PDF转换成多张图片
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
public class Client {
public static void main(String[] args) throws Exception {
testPdf2images();
}
private static void testPdf2images() throws Exception {
List images = pdf2images(new File("D:/testpdf/阿里巴巴Java开发...1528284352.pdf"));
AtomicInteger fileNameIndex = new AtomicInteger(1);
for (byte[] image : images) {
new ByteArrayInputStream(image).transferTo(
new FileOutputStream("D:/testpdf/" + fileNameIndex.getAndIncrement() + ".png"));
}
}
/**
* 将PDF文件转换成多张图片
*
* @param pdfFile PDF源文件
* @return 图片字节数组列表
*/
private static List pdf2images(File pdfFile) throws Exception {
//加载PDF
PDDocument pdDocument = PDDocument.load(pdfFile);
//创建PDF渲染器
PDFRenderer renderer = new PDFRenderer(pdDocument);
int pages = pdDocument.getNumberOfPages();
List images = new ArrayList<>();
for (int i = 0; i < pages; i++) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
//将PDF的每一页渲染成一张图片
BufferedImage image = renderer.renderImage(i);
ImageIO.write(image, "png", output);
images.add(output.toByteArray());
}
pdDocument.close();
return images;
}
}
创建的图片列表如下
将图片列表转换成PDF
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Objects;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
public class Client2 {
public static void main(String[] args) throws Exception {
testImages2pdf();
}
private static void testImages2pdf() throws Exception {
File file = new File("D:/testpdf");
//过滤所有图片文件
File[] files = file.listFiles((f, s) -> s.endsWith(".png"));
if (Objects.nonNull(files)) {
//根据名称排序
Arrays.sort(files, Client2::compareImageFile);
byte[] pdf = images2pdf(files);
new ByteArrayInputStream(pdf).transferTo(
new FileOutputStream("D:/testpdf/阿里巴巴java文档.pdf"));
}
}
/**
* 根据图片名称排序
*/
private static int compareImageFile(File f1, File f2) {
String f1Name = f1.getName();
String f2Name = f2.getName();
return Integer.compare(Integer.parseInt(f1Name.substring(0, f1Name.lastIndexOf("."))),
Integer.parseInt(f2Name.substring(0, f2Name.lastIndexOf("."))));
}
/**
* 根据多张图片生成PDF文件
*
* @param images 图片列表
* @return PDF文件
*/
private static byte[] images2pdf(File... images) throws Exception {
//创建空PDF
PDDocument document = new PDDocument();
for (File image : images) {
InputStream input = new FileInputStream(image);
//读取图片
BufferedImage bufferedImage = ImageIO.read(input);
float width = bufferedImage.getWidth();
float height = bufferedImage.getHeight();
//创建PDF的一页
PDPage page = new PDPage(new PDRectangle(width, height));
document.addPage(page);
PDImageXObject pdImageXObject = PDImageXObject.createFromFileByContent(image, document);
PDPageContentStream contentStream = new PDPageContentStream(document, page);
//写入图片
contentStream.drawImage(pdImageXObject, 0, 0);
contentStream.close();
input.close();
}
ByteArrayOutputStream output = new ByteArrayOutputStream();
document.save(output);
document.close();
return output.toByteArray();
}
}
总结
遇到问题多google
参考
java pdf转为多张图片格式_java进行PDF和图片之间的相互转换相关推荐
- java pdf水印排布问题_java 实现 PDF 加水印功能
使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 com.itextpdf itextpdf 5.5.11 com.itextpdf itext-asian 5.2.0 java 代码实 ...
- java ppt 转图片格式_Java PPT(X)转图片、PDF和SVG
(一)简介: 工作中,PowerPoint文档有时需要被转换为PDF/图像文件来存档.因为PDF或图片的页面布局是固定的,很难被修改且能被大多数设备打开,所以PDF或者图片比起PowerPoint格式 ...
- java解析各种文档格式_java读取各类型的文件
用到的几个包 bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene ...
- java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...
- Java 中pdf部分内容加边线_Java 在PDF中添加骑缝章示例解析
骑缝章是用于往来业务合同,以确保合同真实.有效的印章加盖方法,是一种防范风险的重要方式.在Java程序中,可以通过使用工具来辅助加盖这种骑缝章. 工具:Free Spire.PDF for Java ...
- java pdf表单域实现_Java 创建PDF表单域 - 文本框、复选框、列表框、组合框、按钮等...
表单域包括文本框.复选框.列表框.组合框.按钮和签名域等,主要用于收集用户填写或选择的数据.这篇文章将介绍如何在Java应用程序中给PDF文档添加表单域. 导入jar文件 本文所使用的PDF类库是Fr ...
- java 判断是否为cst格式_Java判断文件编码格式
1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...
- java中时间输出的格式_Java 打印日期/时间格式
Java格式 - Java 打印日期/时间格式 Java 打印日期/时间格式处理日期,时间和日期时间值. Java 打印日期/时间格式可以应用于格式值为long,Long,java.util.Cale ...
- java中设置表格的宽度_java 画pdf用itext调整表格宽度、自定义各个列宽的方法
ps:我用的版本是7.0.5 场景: 左侧第一列宽度不够,导致数据换行. Table table = new Table(new float[2]); new 一个Table之后,setWidthPe ...
最新文章
- ZedGraph怎样在双击图形后添加箭头标记
- HR--上载信息类型的长文本的样例代码
- 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
- .NET Core 编写 Azure Function 并连接 GitHub 持续部署
- python模块之configparser
- uos20专业版是linux哪个版本,WPS Office 2019 for Linux 专业版已与统一操作系统 UOS 完成适配...
- php调用数据二行一组,PHPCMS v9指定行数从第2条或第N条开始调用数据的方法
- 词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...
- Baidu 人脸识别FireFly 与PC连接调试
- 多个线程交替打印ABC,打印10次
- 关键接口性能测试报告
- 学习大数据的最佳年龄,多少岁学大数据合适
- 『这辈子就相爱《何苦要等下辈子》 李草青青、肖玄MV』
- USB过压过流保护芯片,可调限流4A,6V过压关闭
- Pytest操作中间件
- 单片机驱动蜂鸣器(有源和无源)
- ubuntu显示器分辨率不对_Ubuntu安装事宜之一 — 屏幕分辨率问题
- node-inspector调试node程序
- 九套精品404源码-12580code
- Android 字体库
热门文章
- vue项目中引入阿里 iconfont 图标 动态渲染导航菜单图标
- 关于IGBT反并联二极管反向恢复
- 发布《Win32Asm与RadAsm开发教程》全视频系列的第一阶段。
- mysql数据库实验报告jdbc_Jdbc连接数据库实验报告(1)
- 【LSSVM回归预测】人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】
- WindowsLonghorn开启jade主题
- 国密算法概述(SM1、SM2、SM3、SM4、SM7、SM9、ZUC )
- php 漂浮广告代码,JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
- php分32位和64位吗,cpu32位和64位之间有什么区别?
- 数据库的范式化和反范式化模型