热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java将图片组合成PDF文件的方法

这篇文章主要为大家详细介绍了Java将图片组合成PDF文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java将图片组合成PDF文件的具体代码,供大家参考,具体内容如下

程序界面图:

代码清单:

package 将图片组合成PDF文件;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import java.io.FileOutputStream;
import java.io.IOException;


import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;


import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;



/*
 * 绘制主界面以及处理按钮事件类——Jiemian_main
 * 
 * */
class Jiemian_mian extends JFrame{

private static final long serialVersiOnUID= 1657254256189721759L;


final private String shuoming = "
使用说明: 本程序的主要功能就是将图片组按比例缩放合成于同一PDF文件里。 ——winmin";
private String dir_open = "";
private String dir_save = "";

public JFrame jf = null;
private JPanel jp = null;
private JButton jb_open = null;
private JButton jb_save =null;
private JButton jb_ok = null;
private JTextField jt_dir_open = null;
private JTextField jt_dir_save = null;
private JLabel jl_dir_open = null;
private JLabel jl_dir_save = null;
private JLabel jl_lujing_open = null;
private JLabel jl_lujing_save = null;
private JTextField jtf = null;

public Jiemian_mian(){

jf = new JFrame("将图片组合成PDF文件");
jp = new JPanel();
jp.setLayout(null);

/*标签*/
jl_dir_open = new JLabel("请选择图片组所在的文件夹:");
jl_dir_save = new JLabel("请选择PDF的合成位置:");
jl_lujing_open = new JLabel("路径:");
jl_lujing_save = new JLabel("路径:");
jl_dir_open.setBounds(50, 50, 200, 20);
jl_dir_save.setBounds(420, 50, 200, 20);
jl_lujing_open.setBounds(50, 80, 40, 20);
jl_lujing_save.setBounds(420, 80, 40, 20);
jp.add(jl_dir_open);
jp.add(jl_dir_save);
jp.add(jl_lujing_open);
jp.add(jl_lujing_save);

/*按钮*/
jb_open = new JButton("浏览");
jb_save = new JButton("浏览");
jb_ok = new JButton("开始合成");
jb_open.setBounds(230, 80, 65, 20);
jb_save.setBounds(600, 80, 65, 20);
jb_ok.setBounds(310, 165, 90, 30);
jb_open.addActionListener(new Open());
jb_save.addActionListener(new Save());
jb_ok.addActionListener(new Begin());
jp.add(jb_open);
jp.add(jb_save);
jp.add(jb_ok);

/*单行文本(路径显示)*/
jt_dir_open = new JTextField();
jt_dir_save = new JTextField();
jt_dir_open.setBounds(90, 80, 130, 20);
jt_dir_save.setBounds(460, 80, 130, 20);
jt_dir_open.setEditable(false);
jt_dir_save.setEditable(false);
jp.add(jt_dir_open);
jp.add(jt_dir_save);

/*文本框(使用说明)*/
jtf = new JTextField(shuoming);
jtf.setBounds(50,225, 615, 50);
jtf.setEnabled(false);
jp.add(jtf);

/*主框*/
jf.add(jp);
jf.setSize(715,315);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}


/*获取图片路径的按钮事件处理*/
private class Open implements ActionListener{

public void actionPerformed(ActionEvent e){

Lujing_get lujing_get = new Lujing_get(jf);
//创建Lujing_get对象,获取图片组路径
dir_open = lujing_get.open_get();
jt_dir_open.setText(dir_open);
}
}

/*获取选择保存PDF所生成位置的路径的按钮事件处理*/
private class Save implements ActionListener{

public void actionPerformed(ActionEvent e){

Lujing_get lujing_get = new Lujing_get(jf);
//创建Lujing_get对象,获取选择保存PDF所生成位置的路径
dir_save = lujing_get.save_get();
jt_dir_save.setText(dir_save);
}
}

/*合成PDF的按钮事件处理*/
private class Begin implements ActionListener{

public void actionPerformed(ActionEvent e){

/*准确处理所获取的路径*/
if(dir_save.equals("") || dir_open.equals("")){

JOptionPane.showMessageDialog(jf, "请输入图片组的路径及PDF的保存路径","警告",JOptionPane.WARNING_MESSAGE);

}else{

File_deal fd = new File_deal(dir_open);
//创建File_deal对象,将图片组路径下的所有图片文件准确加载

if(fd.files() != null){

/*准确处理PDF的命名规则(去掉后缀名)*/
if(dir_save.lastIndexOf(".") != (-1))
dir_save = dir_save.substring(0, dir_save.lastIndexOf("."));

WM_CreatPDF pdf_creat = new WM_CreatPDF(fd.files(),dir_save);
//创建WM_CreatPDF对象,生成PDF

try {
pdf_creat.creatPDF();
//合成PDF文件
} catch (DocumentException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}

JOptionPane.showMessageDialog(jf,"已合成PDF文件,所在位置:"+dir_save+".pdf",
"完成",JOptionPane.PLAIN_MESSAGE);

}else 
JOptionPane.showMessageDialog(jf, "该文件夹下没有图片格式文件(.jpg/.png/.bmp/.tif)!",
"警告",JOptionPane.WARNING_MESSAGE);

} 
}
}

}



class Lujing_get {

private JFrame jf = null;

public Lujing_get(JFrame jf){

this.jf = jf;
}

public String open_get(){

String dir = "";

JFileChooser jfc = new JFileChooser();
//创建“选择文件浏览器”对象
jfc.setDialogTitle("请选择图片组所在的文件夹");
jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = jfc.showOpenDialog(jf);
if(JFileChooser.APPROVE_OPTION == returnVal){

dir = jfc.getSelectedFile().toString();

}

return dir; //返回路径
}

public String save_get(){

String dir = "";

JFileChooser jfc = new JFileChooser();
//创建“选择文件浏览器”对象
jfc.setDialogTitle("请选择PDF的合成位置");
FileNameExtensionFilter filter = new FileNameExtensionFilter("pdf","PDF");
jfc.setFileFilter(filter);
int returnVal = jfc.showSaveDialog(jf);
if(JFileChooser.APPROVE_OPTION == returnVal){

dir = jfc.getSelectedFile().toString();
}

return dir; //返回路径
}
}



/*
 *获取图片文件
 * 
 * */
class File_deal{

private String dir_open = "";

public File_deal(String dir_open){

this.dir_open = dir_open;
}

public File[] files(){

File f = new File(dir_open);
File fs[] = f.listFiles(new PhotoFileFilter());

if(fs.length != 0)

return fs;
else
return null;
} 
}



/*
 * 
 * 文件过滤器,将所在目录下的图片格式文件返回
 * */
class PhotoFileFilter implements FileFilter{


@Override
public boolean accept(File file) {
// TODO 自动生成的方法存根

if(file.isDirectory())
return false;
else{

String name = file.getName();
if(name.endsWith(".jpg") || name.endsWith(".png"))
return true;
else
if(name.endsWith(".bmp") || name.endsWith(".tif"))
return true;
else
return false;
}
}
}



/*
 * 生成PDF文件(此类要外部引用“itextpdf.jar”,下载地址为:http://www.java2s.com/Code/Jar/i/itextpdf.htm)
 * 
 * */
class WM_CreatPDF {


final private float A4_weight = 595-60;
//标准A4的宽
final private float A4_height = 842-60;
//标准A4的高
private File[] files = null; 
private String dir_save ="";

public WM_CreatPDF(File[] files,String dir_save){

this.files = files;
this.dir_save = dir_save;
}

public void creatPDF() throws DocumentException, IOException{

Document document = new Document(PageSize.A4,30,30,30,30);
//创建文档容器
PdfWriter.getInstance(document,new FileOutputStream(dir_save+".pdf"));
//创建编写器(PDF类型)
document.open();
//打开容器

float percent=100;
float w,h;
for(int i=0;i A4_weight)&&(h  A4_height))
percent = (A4_height*100)/h;
else
if((w > A4_weight)&&(h > A4_height)){


percent = (A4_weight*100)/w ;
h = (h*percent)/100;
if(h > A4_height)
percent = (A4_height*100)/h;
}

img.scalePercent(percent);
document.add(img);
}

document.close();
//关闭容器
}


public static void main(String[] args) {
// TODO 自动生成的方法存根

new Jiemian_mian();


}


}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • 开发笔记:Docker 上安装启动 MySQL
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker上安装启动MySQL相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
author-avatar
阿爷取的名字-Xx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有