java实现Img与PDF相互转换

网友投稿 309 2023-02-06


java实现Img与PDF相互转换

本文实例为大家分享了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 tree = new TreeMap();

for(File f : listFiles)

{

tree.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f);

}

for(Entry eif : tree.entrySet())

http:// {

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 mif = new TreeMap();

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 eif : mif.entrySet())

{

//4.1:读取到内存中

baos = nCARInvew 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;

}

/**

http:// *

* @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 rect

null, // null for the ImageObserver

true, // fill background with white

true // 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 {

//文件转img

InputStream 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转pdf

Document 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();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解Spring Cloud 断路器集群监控(Turbine)
下一篇:Spring Boot利用@Async如何实现异步调用:自定义线程池
相关文章

 发表评论

暂时没有评论,来抢沙发吧~