pdfbox简明教程

来源:互联网 发布:嵌入式linux教学视频 编辑:程序博客网 时间:2024/06/18 15:05

pdfbox简明教程

1.概述

1.1.简介

Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。常用的PDF操作的java类库还有itext,功能比PDFbox还要强大,尤其是中文的支持做的比较好,但itext是收费的。

1.2.功能

Apache PDFBox主要有以下特征:
1)文本提取:从PDF文档中提取文本。
2)合并&分割:可以把多个PDF文档合并成单个,也可以把单个PDF分拆成多个PDF文档。
3)表单填充:可以从PDF表单中提取数据,或者是填充PDF表单。
4)PDF/A验证:验证PDF文档是否满足PDF/A ISO标准。
5)PDF打印:把PDF文档输出到打印机——利用了Java的打印API。
6)PDF转换:可以把PDF文档转换成映像文件。
7)PDF创建:可以从头创建新的PDF文档。
8)集成Lucene搜索引擎:Lucene搜索引擎与PDF索引相集成。

2.1.常用API

PDDocument:表示PDF文档在内存中的形式。

PDPage:表示内存中PDF文档的页码对象,可由pDDocument.getPage(index)得到。

PDPageContentStream:输出流,往PDF文档中写内容的流。

PDFTextStripper:文本内容提取器类,用于从PDF文档中提取text的API。

PDFRenderer:PDF渲染器类,可以将PDF转换成图片缓存。

3.1.常见功能示例

以下是从官方示例中整理出的一些常用功能代码封装成的方法,加了一些注释。

依赖

~~~xml

    <dependency>        <groupId>org.apache.pdfbox</groupId>        <artifactId>pdfbox</artifactId>        <version>2.0.6</version>    </dependency>    <dependency>        <groupId>org.apache.pdfbox</groupId>        <artifactId>fontbox</artifactId>        <version>2.0.6</version>    </dependency>    <dependency>        <groupId>org.apache.pdfbox</groupId>        <artifactId>xmpbox</artifactId>        <version>2.0.6</version>    </dependency>    <dependency>        <groupId>org.apache.pdfbox</groupId>        <artifactId>pdfbox-tools</artifactId>        <version>2.0.6</version>    </dependency>    <dependency>        <groupId>org.apache.ant</groupId>        <artifactId>ant</artifactId>        <version>1.10.1</version>    </dependency>    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>4.12</version>    </dependency></dependencies>

~~~

1.创建pdf文档

~~~java
/**
* TODO 创建PDF文档,写入内容,并且保存到指定路径下
* @param content 文本内容
* @param filePath 保存路径
*/
public void savePdf(String content , String filePath) throws IOException {

    //新建一个PDF文档到内存中    PDDocument doc = new PDDocument();    //新建一个PDF页,相当于文档中的一页    PDPage page = new PDPage();    //添加到文档中    doc.addPage(page);    //PDFont是pdfbox中的字体管理类,PDType1Font是字体库,HELVETICA_BOLD是字体类型,为该PDF文档设置字体    PDFont font = PDType1Font.HELVETICA_BOLD;    //创建往PDF中写内容的输出流    PDPageContentStream pdStream = new PDPageContentStream(doc , page);    //初始化流,开始写入    pdStream.beginText();    //设置字体类型,字体大小    pdStream.setFont(font , 12);    //设置当前页大小    pdStream.newLineAtOffset(100,700);    //将文本内容写入PDF    pdStream.showText(content);    //写入结束    pdStream.endText();    pdStream.close();    //将PDF文档保存到指定路径    doc.save(filePath);    //关闭PDDocument    doc.close();}

~~~

2.将图片转换为PDF

~~~java
/**
* TODO 保存图片为pdf文档
* @param imagePath 图片路径
* @param pdfPath PDF文档路径
*/
public void saveImageToPdf(String imagePath, String pdfPath) throws IOException {
//还是初始化PDF文档与pdf页
PDDocument doc = new PDDocument();
PDPage page = new PDPage();

    //创建读取图片的输入流,指定图片所在路径与要保存到的PDF文档    PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath , doc);    //初始化写入PDF文档的输出流    PDPageContentStream pdStream = new PDPageContentStream(doc , page);    //将图片写入pdf文档,指定显示大小    float scale = 1f;    pdStream.drawImage(pdImage , 100 , 100);    pdStream.close();    //保存写好的PDF    doc.save(pdfPath);    doc.close();}

~~~

3.将图片添加到已有PDF文档中

~~~java
/**
* TODO 将图片读取到已经存在的PDF文档中
* @param pdfPath pdf文档的路径
* @param imagePath 图片路径
* @param newPdfPath 保存了图片之后的新PDF文档的保存路径
* @throws IOException
*/
public void addImageToPdf(String pdfPath , String imagePath , String newPdfPath) throws IOException {
//将本地pdf文档加载到内存中,生成PDDocument对象
PDDocument doc = PDDocument.load(new File(pdfPath));
//准备将图片保存在PDF中的第一页
PDPage page = doc.getPage(0);

    //将图片读取到PDF文档中    PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath , doc);    /**     * 准备输出流,将准备写出的pdf文档与页码pdPage指定好     * PDPageContentStream.AppendMode.APPEND 在源文档基础上追加内容的模式     * compress:是否接受图片压缩     * resetContext:是否重置上下文     */    PDPageContentStream pdStream = new PDPageContentStream(doc , page ,            PDPageContentStream.AppendMode.APPEND , true, false);    /**     * 将图片读取到输出流中,并将图片以0.3比例压缩     */    float scale = 0.3f;    pdStream.drawImage(pdImage , 20 , 20 ,            pdImage.getWidth()*scale , pdImage.getHeight()*scale);    pdStream.close();    doc.save(newPdfPath);    doc.close();}

~~~

4.从PDF文档中提取text内容

~~~java
/**
* TODO 提取PDF文档中的text内容
* @param pdfPath 要提取PDF文档的路径
* @throws IOException
*/
public String extractTextFromPdf(String pdfPath) throws IOException {
//加载本地的PDF文档到内存中
PDDocument doc = PDDocument.load(new File(pdfPath));
//创建PDF文本内容提取器对象PDFTextStripper
PDFTextStripper stripper = new PDFTextStripper();
//提取内存文档中的text内容
String textRes = stripper.getText(doc);
//可以用输出流打印,也还有其他的提取方式,可以自行查阅

    doc.close();    return textRes;}

~~~

5.指定区域获取PDF文本内容

~java
/**
* TODO 指定区域获取PDF文本内容
* @param pdfPath 本地PDF文档内容
* @return 获取到的text内容
* @throws IOException
*/
public String extractTextByArea(String pdfPath) throws IOException {
PDDocument doc = PDDocument.load(new File(pdfPath));
PDFTextStripperByArea stripper = new PDFTextStripperByArea();
stripper.setSortByPosition(true);
Rectangle rect = new Rectangle(0 , 0 , 275 , 60);
stripper.addRegion("reg",rect);
PDPage page = doc.getPage(0);
stripper.extractRegions(page);
System.out.println(rect);
return null;
}
~

5.将PDF文档转换为图片

~java
/**
* TODO 将PDF文档转换为图片
* @param pdfPath 本地PDF文档的路径
* @param page 要保存PDF文档的页码
* @param imgPath 要保存目标图片的路径
* @throws IOException
*/
public void savePdfToImage(String pdfPath , Integer page , String imgPath) throws IOException {
PDDocument doc = PDDocument.load(new File(pdfPath));
//PDF文档的提取器,包含将PDF文档提取为图片缓冲流(BufferedImage)的方法
PDFRenderer renderer = new PDFRenderer(doc);
//图片比例
int scale = 4;
//将PDF文档提取为图片缓存流,并且指定是第几页
BufferedImage bufImage = renderer.renderImage(page , scale);
//将流中数据写出为图片
ImageIO.write(bufImage , "png" , new File(imgPath));
}
~

这里只整理了一部分常用功能,还有其他的需求可以参考官方示例,写的比较好。

原创粉丝点击