Java读写pdf、pdf转图片工具类

来源:互联网 发布:淘宝怎么参加公益宝贝 编辑:程序博客网 时间:2024/05/17 03:08

    本工具类所用到的相关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);}}