java实现Img与PDF相互转换
程序员文章站
2023-12-14 15:55:58
本文实例为大家分享了java实现img与pdf相互转换的具体代码,供大家参考,具体内容如下
不善于表达,就直接贴出代码吧。请大牛忽视我。
import ja...
本文实例为大家分享了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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。