由于在工作中使用到了PDF->TIFF的技术,所以稍微研究了一下实现方式,通过资料查阅,暂时发现了2种方式,2种方式有所区别:第一种方式转化后的tiff文件是黑白的,第二种方式转化后的tiff文件是有色彩的(跟PDF文件相同),如果不对色彩要求严格的话,建议使用第一种方式,因为转化的文件较小。

第一种PDF转化TIFF的方式(黑白):

注意主要依赖pdfbox的版本是1.8.9,而新版本的依赖不适用,例如2.0.0-RC2。

<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.8.9</version>
<scope>compile</scope>
</dependency>
    /**
* 把PDF读入输入流,转化每一页为TIF
* @param inputStream PDF输入流
* @param dir 存放的路径
* @param dpi dpi
* @return 转化后的tif文件列表
*/
public List<File> pdf2tif(InputStream inputStream, File dir, int dpi) {
try (PDDocument pdf = PDDocument.load(inputStream)) {
BufferedImage[] images = new BufferedImage[pdf.getNumberOfPages()];
TiffPainter painter = new TiffPainter();
List<File> files = new ArrayList<>();
long suffix = System.currentTimeMillis();
for (int i = 0; i < images.length; i++) {
PDPage page = (PDPage) pdf.getDocumentCatalog().getAllPages().get(i);
BufferedImage image;
image = page.convertToImage(BufferedImage.TYPE_BYTE_BINARY, dpi);
images[i] = image;
File file = new File(dir.getAbsolutePath() + File.separator + suffix + "-" + (i + 1) + ".tiff");
painter.write(image, file);
files.add(file);
System.out.println(file.getAbsolutePath());
}
return files;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

第二种PDF转化TIFF文件的方式(有色彩):

注意主要的依赖:(maven可能拉不下来,建议去网上下载)

<dependency>
<groupId>com.sun.media</groupId>
<artifactId>jai_codec</artifactId>
<version>1.1-mr</version>
</dependency>
<dependency>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
<version>1.1-mr</version>
</dependency>
<dependency>
<groupId>com.sun.medialib</groupId>
<artifactId>mlibwrapper_jar</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.0-RC2</version>
</dependency>
/**
* 从输入流读取pdf,转化为tiff后写入输出流.<br/>
* @param is 输入流,提供pfg内容.
* @param outPath 输出目录.
*/
public static List<File> pdf2Tiff(InputStream is, String outPath) {
PDDocument doc = null;
FileOutputStream fos = null;
List<File> files = new ArrayList<>();
try {
doc = PDDocument.load(is);
int pageCount = doc.getNumberOfPages();
PDFRenderer renderer = new PDFRenderer(doc); // 根据PDDocument对象创建pdf渲染器
List<PlanarImage> piList = new ArrayList<PlanarImage>(pageCount - 1);
TIFFEncodeParam param = new TIFFEncodeParam();// 创建tiff编码参数类
param.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);// 压缩参数
param.setExtraImages(piList.iterator());// 设置图片的迭代器
for (int i = 0; i < pageCount; i++) {
BufferedImage fimg = renderer.renderImageWithDPI(i, DPI, ImageType.RGB);
PlanarImage fpi = JAI.create("mosaic", fimg); // 通过JAI的create()方法实例化jai的图片对象
File file = new File(outPath + (i + 1) + ".tiff");
fos = new FileOutputStream(file);
ImageEncoder enc = ImageCodec.createImageEncoder("tiff", fos, param);
enc.encode(fpi);// 指定第一个进行编码的jai图片对象,并将输出写入到与此
files.add(file);
if (fos !=null) {
fos.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (doc != null)
doc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return files;
}

注意:第二种方式可能会报错(有关JAI的错误),但是不影响程序正常运行,也不影响结果。可通过配置VM options参数来解决:-Dcom.sun.media.jai.disableMediaLib=true。

如果开发工具是IDEA可在Configuration中的VM options栏添加:-Dcom.sun.media.jai.disableMediaLib=true。如图:

JAVA中 PDF文件转成TIFF文件的2种方式的更多相关文章

  1. 如何将class文件打包成jar 这里提供两种方式!

    原地址:http://blog.163.com/09zzy@126/blog/static/711976652011101001530/ 如何将class文件打包成jar文件,这是一个很严肃的问题,当 ...

  2. java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法

    我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1.通过System.loadLibrary("dll名称,不 ...

  3. Java基础-Java中transient有什么用-序列化有那几种方式

    此文转载于知乎的一篇文章,看着写的非常全面,分享给大家. 先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化 ...

  4. 在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性

    在JAVA中将class文件编译成jar文件包,运行提示没有主清单属性 Maven 项目生成jar运行时提示“没有主清单属性” 新建了一个Maven的项目,mvn compile和mvn packag ...

  5. java中如何创建带路径的文件

    请教各位大侠了,java中如何创建带路径的文件,说明下 这个路径不存在 ------回答--------- ------其他回答(2分)--------- Java code File f = new ...

  6. java中File的delete()方法删除文件失败的原因

    java中File的delete()方法删除文件失败的原因 学习了:http://hujinfan.iteye.com/blog/1266387 的确是忘记关闭了: 引用原文膜拜一下: 一般来说 ja ...

  7. [python]自动化将markdown文件转成html文件

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  8. 使用宏批量将多个csv文件转成excel文件

    在一个压缩文件中有100多个csv文件,要求要将此100多个csv文件转成excel文件,名字命名不变,有三种方式: 1. 傻不拉几的复制粘贴法 2. 一个一个打开csv文件,另存为xls文件,工作量 ...

  9. [转载]webarchive文件转换成htm文件

    原文地址:webarchive文件转换成htm文件作者:xhbaxf Mac OS X系统带有文件转换功能,可以把webarchive文件变成html文件.方法是:   Step 1: 建立一个文件夹 ...

随机推荐

  1. mysqld: Can't change dir to 'D:\TONG\mysql-5.7.19-winx64\data\' (Errcode: 2 - No such file or directory)

    mysqld: Can't change dir to 'D:\TONG\mysql-5.7.19-winx64\data\' (Errcode: 2 - No such file or direct ...

  2. LinkList(链表)

    code: #include <stdio.h> #include <time.h> #include <conio.h> #include <stdlib. ...

  3. locust --hellp

    1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 官网:https://loc ...

  4. python requirements.txt批量下载安装离线

    有些情况下我们需要下载N个第三方包,或者下载的包依赖其它包,一个个下载非常浪费时间.这时我们可以通过如下两种方式的命令批量下载. 方式1 pip download -d /tmp/packagesdi ...

  5. liux 防火墙以及开关

    一.service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防火墙: [root@centos6 ...

  6. solve License Key is legacy format when use ACTIVATION_CODE activate jetbrains-product 2019.3.1

    1.the java-agent and ACTIVATION_CODE can get from this site:https://zhile.io/2018/08/25/jetbrains-li ...

  7. December 21st, Week 51st Saturday, 2019

    May the odds be ever in your favor. 愿好运永远眷顾你. From The Hunger Games. May we all have good luck, and ...

  8. 【剑指Offer面试编程题】 题目1350:二叉树的深度--九度OJ

    题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 输入: 第一行输入有n,n表示结点数,结点号从1到n.根结点为1. ...

  9. pwn之ret2libc

    0×01 利用思路 ret2libc 这种攻击方式主要是针对 动态链接(Dynamic linking) 编译的程序,因为正常情况下是无法在程序中找到像 system() .execve() 这种系统 ...

  10. StringUtils工具类中的isBlank()方法和isEmpty()方法的区别

    1.isBlank()方法 1 public static boolean isBlank(String str) { 2 int strLen; 3 if (str == null || (strL ...