Java讀寫pdf、pdf轉圖片工具類
阿新 • • 發佈:2019-02-05
本工具類所用到的相關jar包及版本有:
1.pdfbox-1.5.0.jar
2.fontbox-1.5.0.jar
3.jempbox-1.5.0.jar
4.iText-5.0.6.jar;
package com.qunlivideo.common.utils; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.pdfparser.PDFParser; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.util.PDFTextStripper; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chapter; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.List; import com.itextpdf.text.ListItem; import com.itextpdf.text.PageSize; import com.itextpdf.text.Paragraph; import com.itextpdf.text.Phrase; import com.itextpdf.text.Rectangle; import com.itextpdf.text.Section; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfWriter; /** * 功能 PDF讀、寫、pdf轉圖片、圖片轉pdf */ public class PDFUtil { public static final String CHARACTOR_FONT_CH_FILE = "simhei.ttf"; // 黑體常規 public static final Rectangle PAGE_SIZE = PageSize.A4; public static final float MARGIN_LEFT = 50; public static final float MARGIN_RIGHT = 50; public static final float MARGIN_TOP = 50; public static final float MARGIN_BOTTOM = 50; public static final float SPACING = 20; public static final String IMG_TYPE_JPG = "jpg"; private Document document = null; /** * 功能:建立匯出資料的目標文件 * * @param fileName * 儲存檔案的臨時路徑 * @return */ public void createDocument(String fileName) { File file = new File(fileName); FileOutputStream out = null; document = new Document(PAGE_SIZE, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM); try { out = new FileOutputStream(file); // PdfWriter writer = PdfWriter.getInstance(document, out); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } // 開啟文件準備寫入內容 document.open(); } /** * 將章節寫入到指定的PDF文件中 * * @param chapter * @return */ public void writeChapterToDoc(Chapter chapter) { try { if (document != null) { if (!document.isOpen()) document.open(); document.add(chapter); } } catch (DocumentException e) { e.printStackTrace(); } } /** * 功能 建立PDF文件中的章節 * * @param title * 章節標題 * @param chapterNum * 章節序列號 * @param alignment * 0表示align=left,1表示align=center * @param numberDepth * 章節是否帶序號 設值=1 表示帶序號 1.章節一;1.1小節一...,設值=0表示不帶序號 * @param font * 字型格式 * @return Chapter章節 */ public static Chapter createChapter(String title, int chapterNum, int alignment, int numberDepth, Font font) { Paragraph chapterTitle = new Paragraph(title, font); chapterTitle.setAlignment(alignment); Chapter chapter = new Chapter(chapterTitle, chapterNum); chapter.setNumberDepth(numberDepth); return chapter; } /** * 功能:建立某指定章節下的小節 * * @param chapter * 指定章節 * @param title * 小節標題 * @param font * 字型格式 * @param numberDepth * 小節是否帶序號 設值=1 表示帶序號 1.章節一;1.1小節一...,設值=0表示不帶序號 * @return section在指定章節後追加小節 */ public static Section createSection(Chapter chapter, String title, Font font, int numberDepth) { Section section = null; if (chapter != null) { Paragraph sectionTitle = new Paragraph(title, font); sectionTitle.setSpacingBefore(SPACING); section = chapter.addSection(sectionTitle); section.setNumberDepth(numberDepth); } return section; } /** * 功能:向PDF文件中新增的內容 * * @param text * 內容 * @param font * 內容對應的字型 * @return phrase 指定字型格式的內容 */ public static Phrase createPhrase(String text, Font font) { Phrase phrase = new Paragraph(text, font); return phrase; } /** * 功能:建立列表 * * @param numbered * 設定為 true 表明想建立一個進行編號的列表 * @param lettered * 設定為true表示列表採用字母進行編號,為false則用數字進行編號 * @param symbolIndent * @return list */ public static List createList(boolean numbered, boolean lettered, float symbolIndent) { List list = new List(numbered, lettered, symbolIndent); return list; } /** * 功能:建立列表中的項 * * @param content * 列表項中的內容 * @param font * 字型格式 * @return listItem */ public static ListItem createListItem(String content, Font font) { ListItem listItem = new ListItem(content, font); return listItem; } /** * 功能:創造字型格式 * * @param fontname * @param size * 字型大小 * @param style * 字型風格 * @param color * 字型顏色 * @return Font */ public static Font createFont(String fontname, float size, int style, BaseColor color) { Font font = FontFactory.getFont(fontname, size, style, color); return font; } /** * 功能: 返回支援中文的字型---仿宋 * * @param size * 字型大小 * @param style * 字型風格 * @param color * 字型 顏色 * @return 字型格式 */ public static Font createCHineseFont(float size, int style, BaseColor color) { BaseFont bfChinese = null; try { bfChinese = BaseFont.createFont(CHARACTOR_FONT_CH_FILE, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); } catch (DocumentException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return new Font(bfChinese, size, style, color); } /** * 最後關閉PDF文件 */ public void closeDocument() { if (document != null) { document.close(); } } /** * 讀PDF檔案,使用了pdfbox開源專案 * * @param fileName */ public void readPDF(String fileName) { File file = null; InputStream in = null; int buff = 1024 * 1024; try { file = new File(fileName); if (file.exists()) { in = new BufferedInputStream(new FileInputStream(fileName), buff); // 新建一個PDF解析器物件 PDFParser parser = new PDFParser(in); // 對PDF檔案進行解析 parser.parse(); // 獲取解析後得到的PDF文件物件 PDDocument pdfdocument = parser.getPDDocument(); // 新建一個PDF文字剝離器 PDFTextStripper stripper = new PDFTextStripper(); // 從PDF文件物件中剝離文字 String result = stripper.getText(pdfdocument); System.out.println(result); } } catch (Exception e) { System.out.println("讀取PDF檔案" + file.getAbsolutePath() + "生失敗!" + e); e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e1) { } } } } public void pdfToImags(String filePath, String savePath) throws IOException { String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1, filePath.length()); fileName = fileName.substring(0, fileName.lastIndexOf(".")); File file = null; InputStream in = null; java.util.List pages = null; int buff = 1024 * 1024; PDDocument pdDocument = null; try { file = new File(filePath); if (file.exists()) { in = new BufferedInputStream(new FileInputStream(filePath), buff); PDFParser parser = new PDFParser(in); parser.parse(); pdDocument = parser.getPDDocument(); pages = pdDocument.getDocumentCatalog().getAllPages(); for (int i = 0; i < pages.size(); i++) { PDPage page = (PDPage) pages.get(i); BufferedImage img_temp = page.convertToImage(); Iterator iterator = ImageIO .getImageWritersBySuffix(IMG_TYPE_JPG); ImageWriter writer = (ImageWriter) iterator.next(); ImageOutputStream imageOut = ImageIO .createImageOutputStream(new FileOutputStream( new File(savePath + "\\" + fileName + "-" + i + ".jpg"))); writer.setOutput(imageOut); writer.write(new IIOImage(img_temp, null, null)); } } } catch (Exception e) { e.printStackTrace(); } finally { if (pdDocument != null) { pdDocument.close(); } } } /** * 測試pdf檔案的建立 * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { /** * String fileName = "F:\\test.pdf"; // 這裡先手動把絕對路徑的資料夾給補上。 PDFUtil * pdfUtil = new PDFUtil(); * * Font chapterFont = PDFUtil.createCHineseFont(20, Font.BOLD, new * BaseColor(0, 0, 255));// 文章標題字型 Font sectionFont = * PDFUtil.createCHineseFont(16, Font.BOLD, new BaseColor(0, 0, 255));// * 文章小節字型 Font textFont = PDFUtil.createCHineseFont(10, Font.NORMAL, new * BaseColor(0, 0, 0));// 小節內容字型 * * pdfUtil.createDocument(fileName); Chapter chapter = * PDFUtil.createChapter("adobe PDF範例", 1, 1, 0, chapterFont); Section * section1 = PDFUtil.createSection(chapter, "一", sectionFont, 0); * Phrase text1 = PDFUtil.createPhrase("你好嗎", textFont); * section1.add(text1); * * Section section2 = PDFUtil.createSection(chapter, "二", sectionFont, * 0); Phrase text2 = PDFUtil.createPhrase("你好嗎", textFont); // * ((Paragraph) text2).setFirstLineIndent(20); //第一行空格距離 * section2.add(text2); * * List list = PDFUtil.createList(true, false, 20); ListItem listItem1 = * PDFUtil.createListItem("我KO你", textFont); ListItem listItem2 = * PDFUtil.createListItem("你OK我 ", textFont); list.add(listItem1); * list.add(listItem2); section2.add(list); * * pdfUtil.writeChapterToDoc(chapter); pdfUtil.closeDocument(); */ String filePath = "F:\\test.pdf"; String savePath = "F:\\image"; PDFUtil pdfUtil = new PDFUtil(); pdfUtil.pdfToImags(filePath, savePath); // pdfUtil.readPDF(filePath); } }