java實(shí)現(xiàn)Img與PDF相互轉(zhuǎn)換
本文實(shí)例為大家分享了java實(shí)現(xiàn)Img與PDF相互轉(zhuǎn)換的具體代碼,供大家參考,具體內(nèi)容如下
不善于表達(dá),就直接貼出代碼吧。請(qǐng)大牛忽視我。
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 * 本工具對(duì)實(shí)現(xiàn)對(duì)IMG與PDF相互轉(zhuǎn)換。 * 運(yùn)行測(cè)試需要導(dǎo)入以下2個(gè)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轉(zhuǎn)jpg //pdfToJpg("E:\\java\\資料pdf\\1.pdf","E:\\java\\資料pdf\\1.jpg",1); //將多個(gè)jpg直接合并成pdf包 //extractionPdf("F:\\temp\\Project\\數(shù)據(jù)\\dfdsfds\\巴黎公社活動(dòng)家傳略_img","F:\\temp\\Project\\數(shù)據(jù)\\dfdsfds\\巴黎公社活動(dòng)家傳略_img.pdf"); //jpg轉(zhuǎn)pdf //jpgToPdf(); //文件排序 //listOrder(); ImgFileTool.imgMerageToPdf(new File("F:\\temp\\Project\\數(shù)據(jù)\\dfdsfds\\巴黎公社活動(dòng)家傳略_img").listFiles(),new File("F:\\temp\\Project\\數(shù)據(jù)\\dfdsfds\\","巴黎公社活動(dòng)家傳略.pdf")); } private static void listOrder() { File[] listFiles = new File("F:\\temp\\Project\\數(shù)據(jù)\\dfdsfds\\巴黎公社活動(dòng)家傳略_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:對(duì)圖片文件通過TreeMap以名稱進(jìn)行自然排序 Map<Integer,File> mif = new TreeMap<Integer,File>(); for(File f : list) mif.put(Integer.parseInt(f.getName().replaceAll(".jpg$", "")), f); //2:獲取第一個(gè)Img的寬、高做為PDF文檔標(biāo)準(zhǔn) 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:通過寬高 ,實(shí)例化PDF文檔對(duì)象。 Document document = new Document(new Rectangle(width,height)); PdfWriter pdfWr = PdfWriter.getInstance(document, new FileOutputStream(file)); document.open(); //4:獲取每一個(gè)圖片文件,轉(zhuǎn)為IMG對(duì)象。裝載到Document對(duì)象中 for(Entry<Integer,File> eif : mif.entrySet()) { //4.1:讀取到內(nèi)存中 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字節(jié)生成IMG對(duì)象 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 目標(biāo)文件 * @param x 讀取源文件中的第幾頁 */ private static void pdfToJpg(String source,String target,int x) throws Exception { //創(chuàng)建從中讀取和向其中寫入(可選)的隨機(jī)訪問文件流,R表示對(duì)其只是訪問模式 RandomAccessFile rea = new RandomAccessFile(new File(source), "r"); //將流讀取到內(nèi)存中,然后還映射一個(gè)PDF對(duì)象 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:創(chuàng)建PDF讀取對(duì)象 PdfReader pr = new PdfReader(source); System.out.println("this document "+pr.getNumberOfPages()+" page"); //2:將第page頁轉(zhuǎn)為提取,創(chuàng)建document對(duì)象 Document doc = new Document(pr.getPageSize(pageNum)); //3:通過PdfCopy轉(zhuǎn)其單獨(dú)存儲(chǔ) 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 { //文件轉(zhuǎn)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轉(zhuǎn)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(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java如何自定義List中的sort()排序,用于日期排序
這篇文章主要介紹了java如何自定義List中的sort()排序,用于日期排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11解決idea services窗口不見的一種特殊情況(小白采坑系列)
這篇文章主要介紹了解決idea services窗口不見的一種特殊情況(小白采坑系列),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09超細(xì)講解Java調(diào)用python文件的幾種方式
有時(shí)候我們?cè)趯慾ava的時(shí)候需要調(diào)用python文件,下面這篇文章主要給大家介紹了關(guān)于Java調(diào)用python文件的幾種方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12SpringCloud Alibaba 基本開發(fā)框架搭建過程
這篇文章主要介紹了SpringCloud Alibaba 基本開發(fā)框架搭建過程,開發(fā)工具選用的idea,本文通過圖文實(shí)例相結(jié)合給大家分享搭建全過程,需要的朋友可以參考下2021-06-06Java實(shí)現(xiàn)FTP批量大文件上傳下載篇1
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)FTP批量大文件上傳下載的基礎(chǔ)篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Java?SpringBoot項(xiàng)目如何優(yōu)雅的實(shí)現(xiàn)操作日志記錄
這篇文章主要介紹了Java?SpringBoot項(xiàng)目如何優(yōu)雅的實(shí)現(xiàn)操作日志記錄,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08設(shè)計(jì)模式之原型模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了設(shè)計(jì)模式之原型模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作
這篇文章主要介紹了java8 forEach結(jié)合Lambda表達(dá)式遍歷 List操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09