解决的问题

有些时候我们需要在项目中展示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的转换(图片)与展示相关推荐

  1. java 图片合并成pdf_java实现Img与PDF相互转换

    java实现Img与PDF相互转换 http://blog.csdn.net/hubiao_0618/article/details/29226883?utm_source=tuicool&u ...

  2. java 图片合并成pdf_java将多张图片合并转为PDF

    [实例简介] [实例截图] [核心代码] package weaver.gy.util; import java.awt.image.BufferedImage; import java.io.Fil ...

  3. java 多图片压缩成pdf_Java 压缩PDF中的图片

    import com.spire.pdf.*; import com.spire.pdf.exporting.PdfImageInfo; import com.spire.pdf.graphics.P ...

  4. 如何将多个图片合并成一个pdf?

    如何将多个图片合并成一个pdf?我们在办公中会遇到各种各样的问题,遇到问题的时候一定要静下心里好好的想一想方法,所以让我们从一些简单的策略方法开始,让我们的工作效率提升起来.我们在办公中会遇到这种情况 ...

  5. 图片合并成PDF,两个PDF的合并

    需求: 将多张手机照片合并成一个PDF,并于另一个成型PDF合并 过程: 使用全能扫描王处理一遍,拆剪掉多余部分,并提高亮度增加文字对比度 合并: 使用Faststone Capture合并图片即可. ...

  6. jpg怎么合成一份_如何将多张JPG图片合并成一个GIF?

    原标题:如何将多张JPG图片合并成一个GIF? 今天是广东入秋成功的某一天,虽然天气变冷了,但外面的紫外线还是毒辣得很,所以大家还是在室内跟小编一起研究教程方案吧! 今天要给大家介绍的是将多张静图合并 ...

  7. c语言.jpg图片转成数组_多张jpg图片合成pdf文件

    唐县职称公众号 微信视频号 评审条件(小程序) 关于如何将多张jpg图片合成pdf文件 首先再强调一下"扫描",不要用手机拍照.高拍仪代替扫描.否则责任自负. 如何将多张JPG图片 ...

  8. 电脑中PDF如何转换成WPS格式

    说起WPS文件转换成PDF格式的话不少人都会进行操作了,那么在电脑中PDF怎么转换成WPS格式呢?常常从事电脑办公的人都知道,转换格式是我们常常需要进行处理的一件工作,也是让人头大的问题.其实PDF转 ...

  9. 免费PDF批量转换图片工具

    免费PDF批量转换图片工具 免费PDF批量转换图片工具 程序界面 测试效果 程序说明 使用说明 使用注意 开发环境 测试环境 程序版本 源文章出处 下载地址(百度云) 免费PDF批量转换图片工具 一款 ...

最新文章

  1. linux系统yum源,Linux开启安装EPEL YUM源
  2. ONTAK2010 Peaks加强版(离线在线)
  3. 网页设计必备工具 firefox Web Developer插件 CSS工具组教程
  4. bzoj3715 [PA2014]Lustra
  5. lunix mysql 8小时_MySQL 8.0 首个自适应参数横空出世
  6. Visual Studio 2010 旗舰版安装图解
  7. Reuse library debug in Chrome - phase3 exchange drop down list
  8. js编写简易返回顶部按钮
  9. 1014-新浪微博(数据 cell )
  10. java 时间类型添加_java date类型 怎么 插入 时间 到 数据库
  11. 语音识别中的MFCC的提取原理和MATLAB实现
  12. 帆软高级函数应用之时间函数
  13. python 机器翻译免费接口调用
  14. html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
  15. Android M 六大新特性
  16. python中pd series_Python 数据处理(三)——pd.Series
  17. python实现hbase增删改查
  18. jieba分词词性标注含义
  19. 【渝粤题库】国家开放大学2021春1040公司概论题目
  20. Android 电子书功能实现、长按选中、高亮显示。 TXT

热门文章

  1. 基于web新闻发布系统设计与实现
  2. Win7 D盘没了:DiskGen 指派驱动器号时出现错误(00000002)系统找不到指定的文件
  3. catkin_make学习总结
  4. Java构造方法与方法重载
  5. 线性插值(Linear Interpolation):线性插值、双线性插值
  6. vue各组件之间多种通信方式
  7. H264基础知识入门
  8. Rake Tutorial
  9. 最优化方法matlab实现
  10. 如何利用函数指针在c语言中实现面向对象编程