java实现Img与PDF相互转换

2024-08-21 09:18
文章标签 java 实现 转换 pdf img 相互

本文主要是介绍java实现Img与PDF相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不善于表达,就直接贴出代码吧。请大牛忽视我.................
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;import com.Utils.ImgFileTool;
import com.lowagie.text.Document;
import com.lowagie.text.Image;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;/*** * @author hubiao* @dateTime 2014-06-07*		本工具对实现对IMG与PDF相互转换。*		运行测试需要导入以下2个jar包*			itext-2.0.2.jar		*			PDFRenderer.jar**/
@SuppressWarnings("unused")
public class ImgPdfUtils {public static void main(String[] args) throws Exception {//PDF包提取 pdf//pdfExtraction();//pdf转jpg//pdfToJpg("E:\\java\\资料pdf\\1.pdf","E:\\java\\资料pdf\\1.jpg",1);//将多个jpg直接合并成pdf包//extractionPdf("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img","F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img.pdf");//jpg转pdf//jpgToPdf();//文件排序//listOrder();ImgFileTool.imgMerageToPdf(new File("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img").listFiles(),new File("F:\\temp\\Project\\数据\\dfdsfds\\","巴黎公社活动家传略.pdf"));}private static void listOrder() {File[] listFiles = new File("F:\\temp\\Project\\数据\\dfdsfds\\巴黎公社活动家传略_img").listFiles();TreeMap<Integer, File> tree = new TreeMap<Integer, File>();for(File f : listFiles){tree.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f);}for(Entry<Integer, File> eif : tree.entrySet()){System.out.println(eif.getKey()+"="+eif.getValue().toString());}}/**	* @param list	图片集合* @param file 保存路径* @return	true,合并完成* 		如果文件名不是1.jpg,2.jpg,3.jpg,4.jpg这样的。则需要自己重写TreeMap的排序方式!*/public static boolean imgMerageToPdf(File[] list, File file)throws Exception {//1:对图片文件通过TreeMap以名称进行自然排序Map<Integer,File> mif = new TreeMap<Integer,File>();for(File f : list)mif.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f);//2:获取第一个Img的宽、高做为PDF文档标准ByteArrayOutputStream baos = new ByteArrayOutputStream(2048*3);InputStream is = new FileInputStream(mif.get(1));for(int len;(len=is.read())!=-1;)baos.write(len);baos.flush();Image image = Image.getInstance(baos.toByteArray());float width = image.width();float height = image.height();baos.close();//3:通过宽高 ,实例化PDF文档对象。Document document = new Document(new Rectangle(width,height));PdfWriter pdfWr = PdfWriter.getInstance(document, new FileOutputStream(file));document.open();//4:获取每一个图片文件,转为IMG对象。装载到Document对象中for(Entry<Integer,File> eif : mif.entrySet()){//4.1:读取到内存中baos = new ByteArrayOutputStream(2048*3);is = new FileInputStream(eif.getValue());for(int len;(len=is.read())!=-1;)baos.write(len);baos.flush();//4.2通过byte字节生成IMG对象image = Image.getInstance(baos.toByteArray());Image.getInstance(baos.toByteArray());image.setAbsolutePosition(0.0f, 0.0f);//4.3:添加到document中document.add(image);document.newPage();baos.close();}//5:释放资源document.close();pdfWr.close();return true;}/*** * @param source 源文件* @param target 目标文件* @param x	读取源文件中的第几页*/private static void pdfToJpg(String source,String target,int x) throws Exception {//创建从中读取和向其中写入(可选)的随机访问文件流,R表示对其只是访问模式RandomAccessFile rea = new RandomAccessFile(new File(source), "r");//将流读取到内存中,然后还映射一个PDF对象FileChannel channel = rea.getChannel();ByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY,0, channel.size());PDFFile pdfFile = new PDFFile(buf);PDFPage page = pdfFile.getPage(x);  // get the width and height for the doc at the default zoom  java.awt.Rectangle rect = new java.awt.Rectangle(0, 0, (int) page.getBBox()  .getWidth(), (int) page.getBBox().getHeight());  // generate the image  java.awt.Image img = page.getImage(rect.width, rect.height, // width &rect, // clip rectnull, // null for the ImageObservertrue, // fill background with whitetrue // block until drawing is done);  BufferedImage tag = new BufferedImage(rect.width, rect.height,  BufferedImage.TYPE_INT_RGB);  tag.getGraphics().drawImage(img, 0, 0, rect.width, rect.height,  null);  FileOutputStream out = new FileOutputStream(target); // 输出到文件流  JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  encoder.encode(tag); // JPEG编码  out.close();  		}/*** @param source  源PDF文件路径* @param target  保存PDF文件路径* @param pageNum  提取PDF中第pageNum页* @throws Exception  */private static void pdfExtraction(String source,String target,int pageNum) throws Exception{//1:创建PDF读取对象PdfReader pr = new PdfReader(source);System.out.println("this document "+pr.getNumberOfPages()+" page");//2:将第page页转为提取,创建document对象Document doc = new Document(pr.getPageSize(pageNum));//3:通过PdfCopy转其单独存储PdfCopy copy = new PdfCopy(doc, new FileOutputStream(new File(target)));doc.open();doc.newPage();//4:获取第1页,装载到document中。PdfImportedPage page = copy.getImportedPage(pr,pageNum);copy.addPage(page);	//5:释放资源copy.close();doc.close();pr.close();}/*** @param pdfFile 源PDF文件* @param imgFile	图片文件*/private static void jpgToPdf(File pdfFile,File imgFile)  throws Exception {//文件转imgInputStream is = new FileInputStream(pdfFile);ByteArrayOutputStream baos = new ByteArrayOutputStream();for(int i;(i=is.read())!=-1;){baos.write(i);}baos.flush();//取得图像的宽和高。Image img = Image.getInstance(baos.toByteArray());float width = img.width();float height = img.height();img.setAbsolutePosition(0.0F, 0.0F);//取消偏移System.out.println("width = "+width+"\theight"+height);//img转pdfDocument doc = new Document(new Rectangle(width,height));PdfWriter pw = PdfWriter.getInstance(doc,new FileOutputStream(imgFile));doc.open();doc.add(img);//释放资源System.out.println(doc.newPage());pw.flush();baos.close();doc.close();pw.close();}}



                                    

这篇关于java实现Img与PDF相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092742

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三