简介

在项目中我们有时候会遇到操作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和图片之间的相互转换相关推荐

  1. java pdf水印排布问题_java 实现 PDF 加水印功能

    使用java代码实现给PDF加水印的功能 首先导入所需要的依赖 com.itextpdf itextpdf 5.5.11 com.itextpdf itext-asian 5.2.0 java 代码实 ...

  2. java ppt 转图片格式_Java PPT(X)转图片、PDF和SVG

    (一)简介: 工作中,PowerPoint文档有时需要被转换为PDF/图像文件来存档.因为PDF或图片的页面布局是固定的,很难被修改且能被大多数设备打开,所以PDF或者图片比起PowerPoint格式 ...

  3. java解析各种文档格式_java读取各类型的文件

    用到的几个包 bcmail-jdk14-132.jar/bcprov-jdk14-132.jar/checkstyle-all-4.2.jar/FontBox-0.1.0-dev.jar/lucene ...

  4. java pdf水印排布问题_Java实现pdf文件添加水印,铺满全页。

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/duan1309/article/details/81232300 因项目需要将word文件(.doc ...

  5. Java 中pdf部分内容加边线_Java 在PDF中添加骑缝章示例解析

    骑缝章是用于往来业务合同,以确保合同真实.有效的印章加盖方法,是一种防范风险的重要方式.在Java程序中,可以通过使用工具来辅助加盖这种骑缝章. 工具:Free Spire.PDF for Java ...

  6. java pdf表单域实现_Java 创建PDF表单域 - 文本框、复选框、列表框、组合框、按钮等...

    表单域包括文本框.复选框.列表框.组合框.按钮和签名域等,主要用于收集用户填写或选择的数据.这篇文章将介绍如何在Java应用程序中给PDF文档添加表单域. 导入jar文件 本文所使用的PDF类库是Fr ...

  7. java 判断是否为cst格式_Java判断文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  8. java中时间输出的格式_Java 打印日期/时间格式

    Java格式 - Java 打印日期/时间格式 Java 打印日期/时间格式处理日期,时间和日期时间值. Java 打印日期/时间格式可以应用于格式值为long,Long,java.util.Cale ...

  9. java中设置表格的宽度_java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    ps:我用的版本是7.0.5 场景: 左侧第一列宽度不够,导致数据换行. Table table = new Table(new float[2]); new 一个Table之后,setWidthPe ...

最新文章

  1. ZedGraph怎样在双击图形后添加箭头标记
  2. HR--上载信息类型的长文本的样例代码
  3. 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
  4. .NET Core 编写 Azure Function 并连接 GitHub 持续部署
  5. python模块之configparser
  6. uos20专业版是linux哪个版本,WPS Office 2019 for Linux 专业版已与统一操作系统 UOS 完成适配...
  7. php调用数据二行一组,PHPCMS v9指定行数从第2条或第N条开始调用数据的方法
  8. 词法分析器c语言带注释,C语言词法分析器内容说明注释完整可运行代码.doc-资源下载在线文库www.lddoc.cn...
  9. Baidu 人脸识别FireFly 与PC连接调试
  10. 多个线程交替打印ABC,打印10次
  11. 关键接口性能测试报告
  12. 学习大数据的最佳年龄,多少岁学大数据合适
  13. 『这辈子就相爱《何苦要等下辈子》 李草青青、肖玄MV』
  14. USB过压过流保护芯片,可调限流4A,6V过压关闭
  15. Pytest操作中间件
  16. 单片机驱动蜂鸣器(有源和无源)
  17. ubuntu显示器分辨率不对_Ubuntu安装事宜之一 — 屏幕分辨率问题
  18. node-inspector调试node程序
  19. 九套精品404源码-12580code
  20. Android 字体库

热门文章

  1. vue项目中引入阿里 iconfont 图标 动态渲染导航菜单图标
  2. 关于IGBT反并联二极管反向恢复
  3. 发布《Win32Asm与RadAsm开发教程》全视频系列的第一阶段。
  4. mysql数据库实验报告jdbc_Jdbc连接数据库实验报告(1)
  5. 【LSSVM回归预测】人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测【含Matlab源码 2213期】
  6. WindowsLonghorn开启jade主题
  7. 国密算法概述(SM1、SM2、SM3、SM4、SM7、SM9、ZUC )
  8. php 漂浮广告代码,JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
  9. php分32位和64位吗,cpu32位和64位之间有什么区别?
  10. 数据库的范式化和反范式化模型