Java操作PDF(快速入门)
- 简介:
- 环境
- 1.创建一个空白pdf文档
- 1.1批量添加PDF的空白页
- 2. 加载一个现有的PDF文档
- 3.删除PDF文档的页面
- 4.给PDF文档设置属性
- 5.给PDF文档添加文本
- 5.1添加多行文本
- 6.从现有的PDF文档提取数据
- 7.将图片插入到PDF文档里
- 8.给PDF文档加密
- 9.向PDF写入JavaScript脚本
- 10.拆分PDF文档页面
- 11.合并多个PDF
- 12.将PDF生成图片
- 13.在PDF文档中创建一个矩形
简介:
Apache PDFBox是一个开源Java库,支持PDF文档的开发和转换。 在本教程中,我们将学习如何使用PDFBox开发可以创建,转换和操作PDF文档的Java程序。
环境
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox-tools</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>preflight</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>xmpbox</artifactId>
<version>2.0.15</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging-api</artifactId>
<version>1.1</version>
</dependency>
或者添加以下jar包 pdfbox-2.0.15.jar,fontbox-2.0.15.jar,preflight-2.0.15.jar,xmpbox-2.0.15.jar,pdfbox-tools-2.0.15.jar,junit-4.10.jar,commons-logging-1.1.jar
1.创建一个空白pdf文档
我们可以通过实例化PDDocument类来创建空PDF文档。 您可以使用Save()方法将文档保存在所需的位置,最后别忘记关闭文档close();
/**
* 创建一个空白pdf
*/
@Test
public void Test2() throws IOException {
//1创建一个空的pdf
PDDocument document = new PDDocument();
//2创建一个空白页
PDPage page = new PDPage();
//3向文档添加一个空白页
document.addPage(page);
//4保存文档路径
document.save("C:\Users\jiang\Desktop\1.pdf");
//5关闭文档
document.close();
}
1.1批量添加PDF的空白页
/**
* 批量添加空白页
*/
@Test
public void Test2() throws IOException {
//1创建一个空的pdf
PDDocument document = new PDDocument();
//批量创建空白页
for (int i = 0; i < 10; i++) {
//2创建一个空白页
PDPage page = new PDPage();
//3向文档添加一个空白页
document.addPage(page);
}
//4保存文档路径
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
//5关闭文档
document.close();
}
2. 加载一个现有的PDF文档
我们通过PDDocument类的load()方法用于加载现有PDF文档。
/**
* 加载一个现有的pdf
*/
@Test
public void Test3() throws IOException {
//1加载现有的pdf
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
//2加载pdf
PDDocument document = PDDocument.load(file);
//3加入一个空白页面
document.addPage(new PDPage());
//4重新保存一个路径
document.save("C:\\Users\\jiang\\Desktop\\2.pdf");
//5关闭文档
document.close();
}
3.删除PDF文档的页面
我们可以使用PDDocument类的removePage()方法从现有PDF文档中删除页面。
/**
* 从文档中删除页面
*/
@Test
public void Test4() throws IOException {
//1加载现有的pdf
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2列出页数
int nofPages = document.getNumberOfPages();
System.out.println("总页数为:"+nofPages);
//3删除页面(使用PDDocument类的removePage()方法从pdf里删除页面)
document.removePage(1);
//4删除后保存
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
//5关闭文档
document.close();
}
4.给PDF文档设置属性
与其他文件一样,PDF文档也具有文档属性。这些属性是键值对。每个属性都提供有关该文档的特定信息。
PDF文档的属性
编号 | 描述 |
1 | (File) 此属性保存文件的名称。 |
2 | (Title)使用此属性,您可以设置文档的标题。 |
3 | (Author)使用此属性,您可以设置文档的作者姓名。 |
4 | (Subject)使用此属性,您可以指定PDF文档的主题。 |
5 | (Keywords)使用此属性,您可以列出我们可以搜索文档的关键字。 |
6 | (Created)使用此属性,您可以设置为文档创建的日期。 |
7 | (Modified)使用此属性,您可以设置为文档修改的日期。 |
8 | (Application)使用此属性,您可以设置文档的应用程序。。 |
/**
* 设置PDF的属性
*/
@Test
public void Test5() throws IOException {
//1创建一个pdf
PDDocument document = new PDDocument();
//2创建一个空白的页面
PDPage page = new PDPage();
//3把页面添加到pdf里
document.addPage(page);
//4创建一个PDDocumentInformation()对象来给文档添加属性
PDDocumentInformation pdd = new PDDocumentInformation();
//设置作者
pdd.setAuthor("PDFAuthor");
//设置头部的名字
pdd.setTitle("PDFTitle");
//设置创作者
pdd.setCreator("PDFCreator");
//设置主题
pdd.setSubject("PDFSubject");
//创建时间
Calendar data = new GregorianCalendar();
data.set(2020,6,18);
pdd.setCreationDate(data);
//修改时间
data.set(2020,6,20);
pdd.setModificationDate(data);
//文档的关键字
pdd.setKeywords("PDFKeywords");
//5保存文档
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
//6获取文档的属性
System.out.println("获取到的作者:"+pdd.getAuthor()+"\n获取到的主题:"+pdd.getSubject());
//6关闭文档
document.close();
}
我们可以通过set()方法来给文档的属性赋值,通过get()方法来获取文档的属性值。
5.给PDF文档添加文本
我们可以使用PDPageContentStream的类,其中包含在PDFDocument的页面中插入文本,图像和其他类型内容所需的方法。
/**
* 给pdf添加文本
*/
@Test
public void Test6() throws IOException {
//1加载pdf
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2获取页面
PDPage page = document.getPage(0);
//3 准备内容流
PDPageContentStream contentStream = new PDPageContentStream(document,page);
//4开始文本
contentStream.beginText();//起始文本
//加载本机字体
PDFont font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simkai.ttf"));
contentStream.setFont(font,12);//设置字体
contentStream.newLineAtOffset(25,700);//设置文本位置
String text = "这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是!";
contentStream.setLeading(15.5f);//设置文本的前导
contentStream.showText(text);//写入到PDF文档里
contentStream.endText();//结束文本
//5关闭内容流
contentStream.close();
//6保存PDF位置
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
//7关闭文档
document.close();
}
5.1添加多行文本
为了向PDF添加多行,我们需要使用setLeading()方法设置前导,并在完成每一行后使用newline()方法切换到新行。
/**
* 给pdf添加文本
*/
@Test
public void Test6() throws IOException {
//1加载pdf
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2获取页面
PDPage page = document.getPage(0);
//3 准备内容流
PDPageContentStream contentStream = new PDPageContentStream(document,page);
//4开始文本
contentStream.beginText();//起始文本
//加载本机字体
PDFont font = PDType0Font.load(document, new File("C:\\Windows\\Fonts\\simkai.ttf"));
contentStream.setFont(font,12);//设置字体
contentStream.newLineAtOffset(25,700);//设置文本位置
String text = "这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是一个PDF!这是!";
String text2 = "换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!换行了!";
contentStream.setLeading(15.5f);//设置文本的前导
contentStream.showText(text);
contentStream.newLine();//使用换行将他们分开
contentStream.showText(text2);
contentStream.endText();//结束文本
//5关闭内容流
contentStream.close();
//6保存PDF位置
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
//7关闭文档
document.close();
}
6.从现有的PDF文档提取数据
我们可以使用PDFTextStripper类的getText()方法提取文本。 此类提取给定PDF文档中的所有文本。
/**
* 从现有的PDF中提取文本
*/
@Test
public void Test7() throws IOException {
//1加载现有的pdf
File file = new File("C:\\Users\\jiang\\Desktop\\000.pdf");
PDDocument document = PDDocument.load(file);
//2实例化PDFTextStripper
PDFTextStripper stripper = new PDFTextStripper();
//3检索文本
String text = stripper.getText(document);
System.out.println("数据是:\n"+text);
//4关闭文件
document.close();
7.将图片插入到PDF文档里
我们可以分别使用PDImageXObject和PDPageContentStream类的createFromFile()和drawImage()方法将图像插入PDF文档。
/**
* 将图片插入到pdf
*/
@Test
public void test8() throws IOException {
//1获取现有的pdf
File file = new File("C:\\Users\\jiang\\Desktop\\2.pdf");
PDDocument document = PDDocument.load(file);
//2获取页面
PDPage page = document.getPage(0);
//3创建PDImageXObject对象来进行获取图片进行设置
PDImageXObject pdImage = PDImageXObject.createFromFile("C:\\Users\\jiang\\Desktop\\1.jpg",document);
//4准备内容流
PDPageContentStream contentStream = new PDPageContentStream(document,page);
//5在pdf中绘制图片位置及宽高
contentStream.drawImage(pdImage,80f,250f,500f,500f);
//养成好习惯用完保存关闭
//6关闭PDPageContentStream
contentStream.close();
//7保存文档
document.save("C:\\Users\\jiang\\Desktop\\2.pdf");
//8关闭文件
document.close();
}
8.给PDF文档加密
我们可以使用StandardProtectionPolicy和AccessPermission classes提供的方法加密PDF文档。
AccessPermission类用于通过为其分配访问权限来保护PDF文档。 使用此类,您可以限制用户执行以下操作。
- 打印文档
- 修改文档的内容
- 复制或提取文档的内容
- 添加或修改注释
- 填写交互式表单字段
- 提取文本和图形,以便为视障人士提供便利
- 组装文档
StandardProtectionPolicy类用于向文档添加基于密码的保护。
/**
* 加密pdf
*/
@Test
public void test9() throws IOException {
//1加载Pdf文档
File file = new File("C:\\Users\\jiang\\Desktop\\2.pdf");
PDDocument document = PDDocument.load(file);
//2创建访问对象
AccessPermission accessPermission = new AccessPermission();
//3创建StandardProtectionPolicy对象
//用来传递所有者密码,用户名密码和AccessPermission对象来实例化StandardProtectionPolicy类
StandardProtectionPolicy spp = new StandardProtectionPolicy("123","123",accessPermission);
spp.setEncryptionKeyLength(128);//设置加密密钥长度
spp.setPermissions(accessPermission);//设置权限
//4保护文档
document.protect(spp);
//5保存文档
document.save("C:\\Users\\jiang\\Desktop\\2.pdf");
//6关闭文档
document.close();
}
9.向PDF写入JavaScript脚本
我们可以使用PDActionJavaScript类将JavaScript操作添加到PDF文档。 这表示JavaScript操作。
/**
* 震惊PDF里竟然可以写javascript脚本
*/
@Test
public void test10() throws IOException {
//1首先来到操作文件的万年第一步加载文件
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2接下来我们把PDActionJavaScript对象创建出来
String javascript = "app.alert( {cMsg: '这是一个消息弹框,具体没有什么用。', nIcon: 1,"
+ " nType: 0,cTitle: '我来测试一下javaScript!!' } );";
PDActionJavaScript script = new PDActionJavaScript(javascript);
//3然后我们把javascript脚本放到pdf文档里
document.getDocumentCatalog().setOpenAction(script);
//4最后要养成好习惯保存关闭文档
document.save("C:\\Users\\jiang\\Desktop\\1.pdf");
document.close();
}
10.拆分PDF文档页面
我们可以使用名为Splitter的类将给定的PDF文档拆分为多个PDF文档。 此类用于将给定的PDF文档拆分为多个其他文档。
/**
* 拆分PDF文档的页面
*/
@Test
public void test11() throws IOException {
//1加载pdf文件
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2实例化Splitter类
Splitter splitter =new Splitter();
//3拆分PDF页面
List<PDDocument> pages = splitter.split(document);
//4创建迭代器
Iterator<PDDocument> iterator = pages.listIterator();
//5循环进行拆分
int i = 1;
while(iterator.hasNext()) {
PDDocument pd = iterator.next();
pd.save("C:\\Users\\jiang\\Desktop\\"+i+"1.pdf");
}
//5关闭文档
document.close();
}
11.合并多个PDF
我们可以使用名为PDFMergerUtility类的类将多个PDF文档合并到一个PDF文档中,此类提供了将两个或多个PDF文档合并到单个PDF文档中的方法。
/**
* 合并多个PDF
*/
@Test
public void test12() throws IOException {
//1加载pdf文件(这里加载了两个PDf进行合并)
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
File file1 = new File("C:\\Users\\jiang\\Desktop\\21.pdf");
PDDocument document = PDDocument.load(file);
PDDocument document1 = PDDocument.load(file1);
//2实例化PDFMergerUtility类
PDFMergerUtility pdfMerger = new PDFMergerUtility();
//3设置目标文件
pdfMerger.setDestinationFileName("C:\\Users\\jiang\\Desktop\\3.pdf");
//4设置源文件
pdfMerger.addSource(file);
pdfMerger.addSource(file1);
//5合并文档
pdfMerger.mergeDocuments();
//6关闭文档
document.close();
}
12.将PDF生成图片
PDFBox库为您提供了一个名为PDFRenderer的类, PDFRenderer PDF文档呈现为AWT BufferedImage。
/**
* 将pdf文件生成图像
*/
@Test
public void test13() throws IOException {
//1加载pdf文件
File file = new File("C:\\Users\\jiang\\Desktop\\1.pdf");
PDDocument document = PDDocument.load(file);
//2实例化PDFRenderer对象
PDFRenderer pdfRenderer = new PDFRenderer(document);
//3从PDF文档渲染图像
BufferedImage image = pdfRenderer.renderImage(0);//设置读第几页默认下标从0开始
//4将图像写入文件
ImageIO.write(image,"jpg",new File("C:\\Users\\jiang\\Desktop\\1.jpg"));
//5关闭文档
document.close();
}
13.在PDF文档中创建一个矩形
我们可以使用PDPageContentStream类的addRect()方法在PDF页面中添加矩形框。
/**
* 在PDF里创建一个矩形
*/
@Test
public void test14() throws IOException {
//1加载pdf文件
File file = new File("C:\\Users\\jiang\\Desktop\\21.pdf");
PDDocument document = PDDocument.load(file);
//2获取页面对象
PDPage page = document.getPage(0);
//3准备内容流
PDPageContentStream stream = new PDPageContentStream(document,page);
//4设置颜色
stream.setNonStrokingColor(Color.blue);
//5绘制矩形
stream.addRect(200, 650, 100, 100);
//6填充矩形
stream.fill();
//7关闭流
stream.close();
//8保存文档位置
document.save("C:\\Users\\jiang\\Desktop\\21.pdf");
//9关闭文档
document.close();
}