tif转pdf

需求:做一个可视化java工具,选中某个文件,可以遍历文件中的所有tif文件,在有tif文件的文件夹同级创建一个文件夹同名的pdf文件,将文件夹内的tif都添加到pdf

import java.awt.BorderLayout;
import java.awt.DisplayMode;
import java.awt.FlowLayout;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;public class TiffToPdf extends JFrame implements ActionListener {public final static String INDEX_FILEEXT = ".tif.tiff";private JTextField inPath;private JTextField outPath;private JTextField text;private JButton selectInPath;private JButton selectOutPath;private JButton submit;private JLabel lb1;private JLabel lb2;private JLabel lb3;private JFileChooser chooser;private Box baseBox, box1, box2, box3, box4, box5;JProgressBar progressBar;int allCount = 0;// 统计成功转换成双层pdf的个数int successCount = 0;//final static JavaSDK javaSDK = new JavaSDK();public TiffToPdf(String title) {init(title);baseBox = Box.createVerticalBox();box1 = Box.createHorizontalBox();//box2 = Box.createHorizontalBox();box3 = Box.createHorizontalBox();box4 = Box.createHorizontalBox();box5 = Box.createHorizontalBox();box4 = Box.createHorizontalBox();progressBar = new JProgressBar();box5.add(progressBar);progressBar.setStringPainted(true);lb1 = new JLabel("输入源:");//lb2 = new JLabel("输出源:");// lb3=new JLabel("文件转换结果:");// lb3.setVisible(false);inPath = new JTextField(30);inPath.setEditable(true);//outPath = new JTextField(30);//outPath.setEditable(false);text = new JTextField(30);text.setEditable(false);text.setVisible(false);submit = new JButton("确定");selectInPath = new JButton("浏览");//selectOutPath = new JButton("浏览");box1.add(lb1);box1.add(inPath);box1.add(selectInPath);//box2.add(lb2);//box2.add(outPath);//box2.add(selectOutPath);// box3.add(lb3);box3.add(text);box4.add(submit);baseBox.add(Box.createVerticalStrut(25));baseBox.add(box1);//baseBox.add(Box.createVerticalStrut(10));//baseBox.add(box2);baseBox.add(Box.createVerticalStrut(10));baseBox.add(box3);baseBox.add(Box.createVerticalStrut(10));baseBox.add(box4);baseBox.add(Box.createVerticalStrut(10));baseBox.add(box5);add(baseBox);selectInPath.addActionListener(this);//selectOutPath.addActionListener(this);submit.addActionListener(this);setVisible(true);}public void init(String title) {setLayout(new FlowLayout());/* 获取屏幕尺寸,使界面居中显示 */GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();DisplayMode displayMode = graphicsDevice.getDisplayMode();int wWidth = displayMode.getWidth();int wheight = displayMode.getHeight();int width = 500;int height = 300;setTitle(title);setBounds((wWidth - width) / 2, (wheight - height) / 2, 500, 300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (e.getSource() == submit) {//点击确定按钮File inFile = new File(inPath.getText());//File outFile = new File(outPath.getText());if(inPath.getText()!=null && !("").equals(inPath.getText())){if(inPath.getText().endsWith(":\\")) {JOptionPane.showMessageDialog(null, "不要把根目录作为输入源", "警告对话框",JOptionPane.WARNING_MESSAGE);return;}}if (!inFile.isDirectory()) {JOptionPane.showMessageDialog(null, "输入源路径不存在,请重新输入:\\", "警告对话框",JOptionPane.WARNING_MESSAGE);return;}submit.setEnabled(false);selectInPath.setEnabled(false);allCount = 0;successCount = 0;List<String> srcList = new ArrayList<String>();//含有tif的所有文件夹//获取指定的所有文件夹List<File> files =searchFiles(new File(inPath.getText()));getDirPath(files,  srcList);allCount=srcList.size();final int size = srcList.size();final List<String> srcList_ = srcList;final List<File> files_ =files;this.text.setText(inPath.getText()+"目录下需转" + allCount + "个pdf文件");this.text.setVisible(true);this.setVisible(true);/*由于事件响应没有结束,java图形界面的进度条不会变化,所以调用ocr另起一个线程*/new Thread(new Runnable() {public void run() {if (srcList_ != null ) {for (int i = 0; i < srcList_.size(); i++) {//循环每个tif文件夹List<String> tifPath= getTifPathOfDir(files_, srcList_.get(i));//文件夹下的tif路径if (toPdfByItext( tifPath,srcList_.get(i))) {successCount++;}//TODO 转换progressBar.setValue((int) ((i + 1) * 100 / size));//设置进度}}text.setText(inPath.getText()+"目录下要转成" + allCount + "个pdf,成功转换" + successCount+ "个");text.setVisible(true);submit.setEnabled(true);selectInPath.setEnabled(true);setVisible(true);}}).start();} else if (e.getSource() == selectInPath) {//点击浏览int mode = 0;chooser = new JFileChooser();chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//只能选择目录mode = chooser.showOpenDialog(this);if (mode == JFileChooser.APPROVE_OPTION) {File selectedFile = chooser.getSelectedFile();inPath.setText(selectedFile.getAbsolutePath());}}}public boolean toPdfByItext(List<String> tifPath, String src) {//要生成的pdf文件路径和文件名String destFile = src+ ".pdf";//创建一份空PDF文档Document document = new Document(PageSize.A4);int comps = 0;try{PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(destFile));document.open();for (int i = 0; i < tifPath.size(); i++) {PdfContentByte cb = writer.getDirectContent();RandomAccessFileOrArray ra = null;//创建TIF文件,根据srcPathra = new RandomAccessFileOrArray(tifPath.get(i));comps = TiffImage.getNumberOfPages(ra);//读取TIF图片,并写入PDF文档for (int c = 1; c <= comps; c++) {Image img = null;try{img = TiffImage.getTiffImage(ra, c);}catch(Exception e){System.out.println("出错");}if (img != null) {resizeImage(img, document);if (i==0) {document.open();//open放太前面,第一页无法根据指定的纸张横纵向设置cb = writer.getDirectContent();} else {document.newPage();}cb.addImage(img);}}ra.close();}document.close();}catch(IOException ex){System.out.println("错误:"+ex.getMessage());ex.printStackTrace();return false;//throw new OriginalInfoException("文档转换过程IO错误!");} catch (DocumentException e) {System.out.println("错误:"+e.getMessage());e.printStackTrace();return false;//throw new OriginalInfoException("创建文档实例出错!");}return true;}private void resizeImage(Image img, Document document){img.setAbsolutePosition(0, 0); // A4的最大宽度float intWidth = img.getWidth();float intHeight = img.getHeight();       float intMaxWidth = PageSize.A4.getWidth();  //缩小一些尺寸,这样按比例缩小时,不至于太紧张float intMaxHeight = PageSize.A4.getHeight();if (img.getWidth() > img.getHeight()) { // 判断图片宽是否大于高// 图片横向document.setPageSize(PageSize.A4.rotate());if (intWidth > intMaxWidth || intHeight > intMaxHeight) {//判断有图的部分接近方图还是宽图float standardScale = intMaxWidth / intMaxHeight;float imgScale = intHeight / intWidth ;if(standardScale > imgScale){intHeight = (float) (intHeight * intMaxHeight / intWidth);       //A4已缩小一些尺寸,这样按比例缩小时,高度不至于太紧张     intWidth = intMaxHeight;}else{ //接近方图,高度就要固定intWidth = (float) (intWidth * intMaxWidth / intHeight);       //这种也行,和上面算法差不多,宽度有时会太紧张intHeight = intMaxWidth;}}} else {// 图片纵向document.setPageSize(PageSize.A4);if (intWidth > intMaxWidth || intHeight > intMaxHeight) {//判断有图的部分接近方图还是宽图float standardScale = intMaxWidth / intMaxHeight;float imgScale = intWidth / intHeight ;if(standardScale > imgScale){intWidth = (float) (intWidth * intMaxHeight / intHeight);intHeight = intMaxHeight;}else{  //接近方图,宽度就要固定intHeight = (float) (intHeight * intMaxWidth / intWidth);intWidth = intMaxWidth;}}}img.scaleAbsolute(intWidth, intHeight);img.setAlignment(Image.MIDDLE);}/*** * @param folder 文件夹* @return 所有tif/tiff文件*/public static List<File> searchFiles(File folder) {List<File> result = new ArrayList<File>();if (folder.isFile())result.add(folder);File[] subFolders = folder.listFiles(new FileFilter() {public boolean accept(File file) {if (file.isDirectory()) {return true;}if (file.getName().toLowerCase().endsWith(".tif")||file.getName().toLowerCase().endsWith(".tiff")) {return true;}return false;}});if (subFolders != null) {for (File file : subFolders) {if (file.isFile()) {// 如果是文件则将文件添加到结果列表中result.add(file);} else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中result.addAll(searchFiles(file));}}}return result;}/*** * @param files 所有tif文件的list* @param srcList 用来存放含有tif文件夹路径的list*/public  void getDirPath(List<File> files,List<String> srcList) {//ArrayList newList = new ArrayList();String dirString;for (File file : files) {dirString=file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("\\"));if (!srcList.contains(dirString)) {srcList.add(dirString);}//System.out.println(file.getAbsolutePath());}//System.out.println("一共有:"+srcList.size());}//某个文件夹下的tif文件路径/*** * @param files 所有tif文件的list* @param dirPath 含有tif的文件夹路径* @return*/public List<String> getTifPathOfDir(List<File> files,String dirPath) {List<String> tifList = new ArrayList<String>();//一个文件夹下的tif文件路径String tifString;for (File file : files) {tifString=file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("\\"));if (dirPath.equals(tifString)) {tifList.add(file.getAbsolutePath());}}return tifList;}}

测试

public static void main(String[] args) {TiffToPdf tiffToPdf = new TiffToPdf("tif转pdf");}

效果

java可视化tiff转pdf工具相关推荐

  1. Java关于word转pdf工具方法的几种解决方案和我遇到一些问题(html中转、jacob、Docx4j)

    本文参考文章如下 java转pdf(html转为pdf),解决中文乱码,标签不规范等问题 Java 使用 jacob 将 word 文档转换为 pdf 文件 java实现word生成并转pdf doc ...

  2. Java操作excel转pdf工具类

    工作中遇到excel文件转pdf的需求,总结了一下通过java的实现方法: 一.准备工作: 1.下载aspose-cells的jar包 由于Aspose是不能通过maven远程坐标引入的,因为在阿里云 ...

  3. Java 将 Excel 转换为 PDF 文件

    持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情 今天这是篇粗糙的文章,文字也较少,整理了个Java将Excel 转换为 PDF 文件的工具类.(还比较 ...

  4. Tiff – 值得你体验一下的可视化的字体对比工具

    Tiff 是一款字体对比工具,可视化对比两种字体之间的差异.这是一个工具来帮助比较两种字体,同时学习排版.在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源.由于应用程序使用的一些功 ...

  5. JVM进阶(十二)——JAVA 可视化分析工具

    JVM进阶(十二)--JAVA 可视化分析工具   经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番. ...

  6. java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...

    Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...

  7. Java中导出pdf文件,pdf工具类demo

    最近在做导出pdf文件的功能,参考了很多资料和demo,完成了转出pdf的功能,并适合项目的pdf工具类,现贴出具体的工具类和demo,如有不对的地方欢迎指正 1.pdf工具类PdfUtil.java ...

  8. 可视化反编译APK工具,查看部分JAVA代码与全部资源文件。

    ###前言 APK是安卓安装包,里面主要就是两大部分 资源文件,主要是图片与布局. dex文件,也就是各种代码转换成的Android可执行文件. 如果直接ZIP打开混淆打包过的APK的话,会出现dex ...

  9. java pdf 工具_Java_iText_PDF—生成PDF工具

    /*** PDF工具*/ public classPdfUtils {/*** 生成 *@paramiouData 借据数据 *@paramplanList 还款计划List *@paramaccou ...

  10. 9个可视化图表在线制作工具,总有一款适合你

    这份清单包含了最受欢迎的大数据可视化分析的工具,无论你是需要对数据进行分析,还是利用可视化图表向你的客户或同事进行展示,该表单中总会有一款工具能够满足你的需求. 数据可视化无处不在,无论是PPT演示还 ...

最新文章

  1. Learn OpenGL (二):三角形
  2. 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
  3. 一个简单的时间片轮转多道程序内核代码分析
  4. python基础教程运行程序_Python入门基础教程:WSGI
  5. Ehcache分布式缓存及测试方法
  6. path manipulation怎么解决_超详细的toad报错解决--no valid oracle clients found.
  7. tensorflow学习之常用函数总结:tensorflow.cast()函数
  8. Intellij IDEA创建maven项目无java文件问题
  9. asponse.word 设置全局段前段后信息_一步步编写操作系统 12 代码段、数据段、栈和cpu寄存器的关系...
  10. 论开学第二个月干了点啥
  11. 线性表的链式存储结构详解
  12. MybatisPlus多表关联查询
  13. 变量的作用域与生命周期
  14. 代做assignment分享高分Essay写作攻略
  15. vue使用高德地图第一次进去点标记有数据,第二次进去就没有了
  16. 要么励志故事:要么孤独,要么庸俗
  17. unity3D修改商店下载路径
  18. 数据挖掘——数据挖掘的起源
  19. 解决iphone4无法格式化号码的问题
  20. python 火车票查询,Python3实现火车票查询工具

热门文章

  1. 网络电视机顶盒测试软件,网络机顶盒最值得安装的软件,可免费收看全网vip独播剧!...
  2. linux下低格u盘,拯救U盘,一个靠谱的强制低格的工具
  3. Matlab如何下载安装科研绘图工具Gramm并绘图
  4. 人工智能是一个骗局?
  5. Web聊天室历史记录解决方案(轻喷。。)
  6. 【无人驾驶入门】一、概述
  7. \t\t产后饮食标准 饮食原则 最适合新妈妈吃的菜 饮食秘诀 禁忌
  8. Ubuntu系统安装ghostscript seq2logo
  9. 限流算法: 漏桶算法和令牌桶算法
  10. 四川大学本科教务系统 - 一键评教