由于在工作中使用到了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. OBS输出设置

    参数建议来自虎牙 https://help.huya.com/284 3.输出: 1)编码器中x264相当于虎牙直播中的CPU H.264编码,NVENC H.264相当于虎牙直播中的NVIDIA H ...

  2. redis实现哨兵机制

    将cd /usr/local/redis/sentinel.conf复制到/usr/local/redis/etc/下 cd /usr/local/redis/ cp sentinel.conf /u ...

  3. Go文档:go命令

    目录 go go bug--启动bug报告 go build--编译包及其依赖包 go clean--删除对象文件和缓存文件 go doc--查看包或符号的文档 go env--打印环境变量 go f ...

  4. 设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding

    1 课程讲解 1.1 定义 1.2 优点 1.3 细节描述 2 代码演练 2.0 代码展示优点 2.1 非面向接口编程 2.2 面向接口编程1 传参 2.3 面向接口编程2 构造函数 2.4 面向接口 ...

  5. Win10 在 CUDA 10.1 下跑 TensorFlow 2.x

    深度学习最热的两个框架是 pytorch 和 tensorflow,pytorch 最新版本是 1.3,tensorflow 最新版本为 2.0,在 win10 下 pytorch 1.3 要求的 c ...

  6. Apache Shiro安全(权限框架)学习笔记二

    课程目标 通过学习本课程掌握权限管理的设计思想及方法,使用Shiro框架完成权限管理功能开发. 1.  理解基于资源的权限管理方法. 2.  掌握权限管理的数据模型. 3.  掌握不使用shiro开发 ...

  7. LUA拾翠

    一.函数 1.格式 optional_function_scope function function_name( argument1, argument2, argument3..., argume ...

  8. K8s / Kubernetes 从入门到入门

    Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是k ...

  9. 利用正则表达式判断Java中的秒钟、分钟、小时、日、月是否符合规则

    // 定义校验规则 Pattern patRule = Pattern.compile("判断规则"); // 校验结果 patRule.matcher("判断的对象&q ...

  10. 【原】Web Polygraph 安装

    1.下载 # wget http://www.web-polygraph.org/downloads/srcs/polygraph-4.3.2-src.tgz 2.解压 # tar zxvf poly ...