java可视化tiff转pdf工具
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工具相关推荐
- Java关于word转pdf工具方法的几种解决方案和我遇到一些问题(html中转、jacob、Docx4j)
本文参考文章如下 java转pdf(html转为pdf),解决中文乱码,标签不规范等问题 Java 使用 jacob 将 word 文档转换为 pdf 文件 java实现word生成并转pdf doc ...
- Java操作excel转pdf工具类
工作中遇到excel文件转pdf的需求,总结了一下通过java的实现方法: 一.准备工作: 1.下载aspose-cells的jar包 由于Aspose是不能通过maven远程坐标引入的,因为在阿里云 ...
- Java 将 Excel 转换为 PDF 文件
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情 今天这是篇粗糙的文章,文字也较少,整理了个Java将Excel 转换为 PDF 文件的工具类.(还比较 ...
- Tiff – 值得你体验一下的可视化的字体对比工具
Tiff 是一款字体对比工具,可视化对比两种字体之间的差异.这是一个工具来帮助比较两种字体,同时学习排版.在这一点上,谷歌 Web 字体作为 Tiff 外部字体文件的唯一来源.由于应用程序使用的一些功 ...
- JVM进阶(十二)——JAVA 可视化分析工具
JVM进阶(十二)--JAVA 可视化分析工具 经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番. ...
- java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...
Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...
- Java中导出pdf文件,pdf工具类demo
最近在做导出pdf文件的功能,参考了很多资料和demo,完成了转出pdf的功能,并适合项目的pdf工具类,现贴出具体的工具类和demo,如有不对的地方欢迎指正 1.pdf工具类PdfUtil.java ...
- 可视化反编译APK工具,查看部分JAVA代码与全部资源文件。
###前言 APK是安卓安装包,里面主要就是两大部分 资源文件,主要是图片与布局. dex文件,也就是各种代码转换成的Android可执行文件. 如果直接ZIP打开混淆打包过的APK的话,会出现dex ...
- java pdf 工具_Java_iText_PDF—生成PDF工具
/*** PDF工具*/ public classPdfUtils {/*** 生成 *@paramiouData 借据数据 *@paramplanList 还款计划List *@paramaccou ...
- 9个可视化图表在线制作工具,总有一款适合你
这份清单包含了最受欢迎的大数据可视化分析的工具,无论你是需要对数据进行分析,还是利用可视化图表向你的客户或同事进行展示,该表单中总会有一款工具能够满足你的需求. 数据可视化无处不在,无论是PPT演示还 ...
最新文章
- Learn OpenGL (二):三角形
- 常用的Mybatis-Plus方法,让你的数据库增删改查(CRUD)一键实现
- 一个简单的时间片轮转多道程序内核代码分析
- python基础教程运行程序_Python入门基础教程:WSGI
- Ehcache分布式缓存及测试方法
- path manipulation怎么解决_超详细的toad报错解决--no valid oracle clients found.
- tensorflow学习之常用函数总结:tensorflow.cast()函数
- Intellij IDEA创建maven项目无java文件问题
- asponse.word 设置全局段前段后信息_一步步编写操作系统 12 代码段、数据段、栈和cpu寄存器的关系...
- 论开学第二个月干了点啥
- 线性表的链式存储结构详解
- MybatisPlus多表关联查询
- 变量的作用域与生命周期
- 代做assignment分享高分Essay写作攻略
- vue使用高德地图第一次进去点标记有数据,第二次进去就没有了
- 要么励志故事:要么孤独,要么庸俗
- unity3D修改商店下载路径
- 数据挖掘——数据挖掘的起源
- 解决iphone4无法格式化号码的问题
- python 火车票查询,Python3实现火车票查询工具