您的位置:首页 > 编程语言 > Java开发

java实现Img与PDF相互转换

2018-05-02 11:06 841 查看

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

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

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java img pdf