1. 程式人生 > >Java讀寫pdf、pdf轉圖片工具類

Java讀寫pdf、pdf轉圖片工具類


    本工具類所用到的相關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);

	}
}