java 图片合并成pdf_Java中PDF的转换(图片)与展示
解决的问题
有些时候我们需要在项目中展示PDF,但是直接在浏览器中加入PDF展示的插件,存在兼容性问题,某些浏览器显示效果不理想,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好。
那么怎么将PDF转为图片呢?有两种方式:
产品
特点
Apache 的 PDF box
免费;速度稍慢一点,但可以接受
E-iceblue 的 Spire.PDF for Java
转换效果很好;速度快;功能强大,支持转多种格式;收费
Spire.PDF for Java 的转换效果很好,但是如果不购买,转换过后会添加一些水印文字
PDF Box的使用
net.sf.cssbox
pdf2dom
1.7
org.apache.pdfbox
pdfbox
2.0.12
org.apache.pdfbox
pdfbox-tools
2.0.12
多页PDF生成多张图片
新建一个 PdfUtil 工具类
public class PdfUtil {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(PdfUtil.class);
/***
* PDF文件转PNG图片,全部页数
*
* @param pdfFilePath pdf完整路径
* @param dpi dpi越大转换后越清晰,相对转换速度越慢
*/
public static void pdf2Image(String pdfFilePath, int dpi) {
File file = new File(pdfFilePath);
PDDocument pdDocument;
try {
String imgPdfPath = file.getParent();
int dot = file.getName().lastIndexOf('.');
// 获取图片文件名
String imagePdfName = file.getName().substring(0, dot);
pdDocument = PDDocument.load(file);
PDFRenderer renderer = new PDFRenderer(pdDocument);
/* dpi越大转换后越清晰,相对转换速度越慢 */
PdfReader reader = new PdfReader(pdfFilePath);
int pages = reader.getNumberOfPages();
StringBuffer imgFilePath;
for (int i = 0; i < pages; i++) {
String imgFilePathPrefix = imgPdfPath + File.separator + imagePdfName;
imgFilePath = new StringBuffer();
imgFilePath.append(imgFilePathPrefix);
imgFilePath.append("_");
imgFilePath.append((i + 1));
imgFilePath.append(".png");
File dstFile = new File(imgFilePath.toString());
BufferedImage image = renderer.renderImageWithDPI(i, dpi);
ImageIO.write(image, "png", dstFile);
}
log.info("PDF文档转PNG图片成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
多页PDF组合成一张图片
public class PdfUtil {
public static final int DEFAULT_DPI = 150;
/**
* pdf转图片
* 多页PDF会每页转换为一张图片,下面会有多页组合成一页的方法
*
* @param pdfFile pdf文件路径
* @param outPath 图片输出路径
* @param dpi 相当于图片的分辨率,值越大越清晰,但是转换时间变长
*/
public static void pdf2multiImage(String pdfFile, String outPath, int dpi) {
if (ObjectUtil.isEmpty(dpi)) {
// 如果没有设置DPI,默认设置为150
dpi = DEFAULT_DPI;
}
try (PDDocument pdf = PDDocument.load(new FileInputStream(pdfFile))) {
int actSize = pdf.getNumberOfPages();
List picList = Lists.newArrayList();
for (int i = 0; i < actSize; i++) {
BufferedImage image = new PDFRenderer(pdf).renderImageWithDPI(i, dpi, ImageType.RGB);
picList.add(image);
}
// 组合图片
ImageUtil.yPic(picList, outPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
新建 ImageUtil 类
public class ImageUtil {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ImageUtil.class);
/**
* 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
*
* @param picList 文件流数组
* @param outPath 输出路径
*/
public static void yPic(List picList, String outPath) {// 纵向处理图片
if (picList == null || picList.size() <= 0) {
log.info("图片数组为空!");
return;
}
try {
// 总高度
int height = 0,
// 总宽度
width = 0,
// 临时的高度 , 或保存偏移高度
offsetHeight = 0,
// 临时的高度,主要保存每个高度
tmpHeight = 0,
// 图片的数量
picNum = picList.size();
// 保存每个文件的高度
int[] heightArray = new int[picNum];
// 保存图片流
BufferedImage buffer = null;
// 保存所有的图片的RGB
List imgRgb = new ArrayList();
// 保存一张图片中的RGB数据
int[] tmpImgRgb;
for (int i = 0; i < picNum; i++) {
buffer = picList.get(i);
// 图片高度
heightArray[i] = offsetHeight = buffer.getHeight();
if (i == 0) {
// 图片宽度
width = buffer.getWidth();
}
// 获取总高度
height += offsetHeight;
// 从图片中读取RGB
tmpImgRgb = new int[width * offsetHeight];
tmpImgRgb = buffer.getRGB(0, 0, width, offsetHeight, tmpImgRgb, 0, width);
imgRgb.add(tmpImgRgb);
}
// 设置偏移高度为0
offsetHeight = 0;
// 生成新图片
BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < picNum; i++) {
tmpHeight = heightArray[i];
if (i != 0) {
// 计算偏移高度
offsetHeight += tmpHeight;
}
// 写入流中
imageResult.setRGB(0, offsetHeight, width, tmpHeight, imgRgb.get(i), 0, width);
}
File outFile = new File(outPath);
// 写图片
ImageIO.write(imageResult, "png", outFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
java 图片合并成pdf_Java中PDF的转换(图片)与展示相关推荐
- java 图片合并成pdf_java实现Img与PDF相互转换
java实现Img与PDF相互转换 http://blog.csdn.net/hubiao_0618/article/details/29226883?utm_source=tuicool&u ...
- java 图片合并成pdf_java将多张图片合并转为PDF
[实例简介] [实例截图] [核心代码] package weaver.gy.util; import java.awt.image.BufferedImage; import java.io.Fil ...
- java 多图片压缩成pdf_Java 压缩PDF中的图片
import com.spire.pdf.*; import com.spire.pdf.exporting.PdfImageInfo; import com.spire.pdf.graphics.P ...
- 如何将多个图片合并成一个pdf?
如何将多个图片合并成一个pdf?我们在办公中会遇到各种各样的问题,遇到问题的时候一定要静下心里好好的想一想方法,所以让我们从一些简单的策略方法开始,让我们的工作效率提升起来.我们在办公中会遇到这种情况 ...
- 图片合并成PDF,两个PDF的合并
需求: 将多张手机照片合并成一个PDF,并于另一个成型PDF合并 过程: 使用全能扫描王处理一遍,拆剪掉多余部分,并提高亮度增加文字对比度 合并: 使用Faststone Capture合并图片即可. ...
- jpg怎么合成一份_如何将多张JPG图片合并成一个GIF?
原标题:如何将多张JPG图片合并成一个GIF? 今天是广东入秋成功的某一天,虽然天气变冷了,但外面的紫外线还是毒辣得很,所以大家还是在室内跟小编一起研究教程方案吧! 今天要给大家介绍的是将多张静图合并 ...
- c语言.jpg图片转成数组_多张jpg图片合成pdf文件
唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...
- 电脑中PDF如何转换成WPS格式
说起WPS文件转换成PDF格式的话不少人都会进行操作了,那么在电脑中PDF怎么转换成WPS格式呢?常常从事电脑办公的人都知道,转换格式是我们常常需要进行处理的一件工作,也是让人头大的问题.其实PDF转 ...
- 免费PDF批量转换图片工具
免费PDF批量转换图片工具 免费PDF批量转换图片工具 程序界面 测试效果 程序说明 使用说明 使用注意 开发环境 测试环境 程序版本 源文章出处 下载地址(百度云) 免费PDF批量转换图片工具 一款 ...
最新文章
- linux系统yum源,Linux开启安装EPEL YUM源
- ONTAK2010 Peaks加强版(离线在线)
- 网页设计必备工具 firefox Web Developer插件 CSS工具组教程
- bzoj3715 [PA2014]Lustra
- lunix mysql 8小时_MySQL 8.0 首个自适应参数横空出世
- Visual Studio 2010 旗舰版安装图解
- Reuse library debug in Chrome - phase3 exchange drop down list
- js编写简易返回顶部按钮
- 1014-新浪微博(数据 cell )
- java 时间类型添加_java date类型 怎么 插入 时间 到 数据库
- 语音识别中的MFCC的提取原理和MATLAB实现
- 帆软高级函数应用之时间函数
- python 机器翻译免费接口调用
- html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
- Android M 六大新特性
- python中pd series_Python 数据处理(三)——pd.Series
- python实现hbase增删改查
- jieba分词词性标注含义
- 【渝粤题库】国家开放大学2021春1040公司概论题目
- Android 电子书功能实现、长按选中、高亮显示。 TXT