PDFBox是Apache下的一个操作pdf的类库。其也提供了一个命令行的工具,也提供了java调用的第三方类库。

  下载地址:https://pdfbox.apache.org/

  

  下面的实验基于JDK8+pdfbox-2.0.13.jar+pdfbox-app-2.0.13.jar(命令行工具库)

1.命令行使用

  文档参考:https://pdfbox.apache.org/2.0/commandline.html

  命令行工具可以提取pdf中的图片、文本,合并pdf与拆分pdf,pdf转换为图片等操作。

1.提取图片

java -jar pdfbox-app-2.0..jar ExtractImages ./.pdf

  会在同文件夹下提取出pdf中的图片。

2.提取文字

java -jar pdfbox-app-2.0..jar ExtractText ./.pdf ./text.txt

  当然还可以指定起始页号等参数。

3.pdf转换为图片

java -jar pdfbox-app-2.0..jar PDFToImage ./.pdf

  结果每页生成一张图片。当然可以指定起始页号、生产图片的名称前缀等信息。默认生成的图片命名如下:(pdfname+page)

  还有许多命令行操作可以参考官网的文档,对于参数都有详细的解释。这种方式可以封装为工具类用Runtime多线程执行操作pdf。

2.Java中作为类库使用

  感觉这个工具还不是太方便,写入pdf表格等直接操作pdf的可以考虑用itext代替。这个就当做命令行工具实现pdf转换图片、提取文字等操作就可以了。关于itext的使用参考:https://www.cnblogs.com/qlqwjy/p/8213989.html

依赖的jar包:

commons-logging-1.0.4.jar、pdfbox-2.0.13.jar、fontbox-2.0.13.jar

package cn.qlq;

import java.io.File;
import java.io.IOException;
import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
import org.apache.pdfbox.text.PDFTextStripper; public class PDFBoxTest {
public static void main(String[] args) throws IOException {
ReplaceURLs();
} /**
* 替换pdf中的连接的url跳转地址,但是显示的不会变,只是修改点击跳转的地址
*
* @throws InvalidPasswordException
* @throws IOException
*/
public static void ReplaceURLs() throws InvalidPasswordException, IOException {
PDDocument doc = null;
try {
doc = PDDocument.load(new File("G:/qjl.pdf"));
int pageNum = 0;
for (PDPage page : doc.getPages()) {
pageNum++;
List<PDAnnotation> annotations = page.getAnnotations(); for (PDAnnotation annotation : annotations) {
PDAnnotation annot = annotation;
if (annot instanceof PDAnnotationLink) {
PDAnnotationLink link = (PDAnnotationLink) annot;
PDAction action = link.getAction();
if (action instanceof PDActionURI) {
PDActionURI uri = (PDActionURI) action;
String oldURI = uri.getURI();
String newURI = "http://pdfbox.apache.org";
System.out.println("Page " + pageNum + ": Replacing " + oldURI + " with " + newURI);
uri.setURI(newURI);
}
}
}
doc.save("G:/qjl_1.pdf");
}
} finally {
if (doc != null) {
doc.close();
}
}
} /**
* 删除PDF里面的指定页
*
* @throws IOException
* @throws InvalidPasswordException
*/
public static void removePdfPage() throws IOException, InvalidPasswordException {
try (PDDocument document = PDDocument.load(new File("G:/1.pdf"))) {
if (document.isEncrypted()) {
throw new IOException("Encrypted documents are not supported for this example");
}
if (document.getNumberOfPages() <= 1) {
throw new IOException(
"Error: A PDF document must have at least one page, " + "cannot remove the last page!");
}
document.removePage(1);// 删除第2页
System.out.println("ssssssssssssss");
document.save("G:/1_1.pdf");
} catch (Exception e) {
e.printStackTrace();
}
} /**
* PDF中增加图片
*
* @throws IOException
* @throws InvalidPasswordException
*/
public static void addImg2PDF() throws IOException, InvalidPasswordException {
try (PDDocument doc = PDDocument.load(new File("G:/blank.pdf"))) {
PDPage page = doc.getPage(0);
PDImageXObject pdImage = PDImageXObject.createFromFile("G:/0101.jpg", doc); try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true,
true)) {
// contentStream.drawImage(ximage, 20, 20 );
// better method inspired by
// http://stackoverflow.com/a/22318681/535646
// reduce this value if the image is too large
float scale = 1f;
contentStream.drawImage(pdImage, 20, 20, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
}
doc.save("G:/blank.pdf");
}
} /**
* PDF文件中增加JS脚本
*
* @throws IOException
* @throws InvalidPasswordException
*/
public static void addJavaScript2PDF() throws IOException, InvalidPasswordException {
try (PDDocument document = PDDocument.load(new File("G:/blank.pdf"))) {
PDActionJavaScript javascript = new PDActionJavaScript(
"app.alert( {cMsg: 'PDFBox rocks!', nIcon: 3, nType: 0, cTitle: 'PDFBox Javascript example' } );");
document.getDocumentCatalog().setOpenAction(javascript);
if (document.isEncrypted()) {
throw new IOException("Encrypted documents are not supported for this example");
}
document.save("G:/blank.pdf");
}
} /**
* 阅读PDF文件的内容,支持阅读中文(如果需要阅读指定页面的PDF自己改写此方法)
*
* @throws IOException
* @throws InvalidPasswordException
*/
public static void readPDFText() throws IOException, InvalidPasswordException {
try (PDDocument document = PDDocument.load(new File("G:/jl.pdf"))) {
AccessPermission ap = document.getCurrentAccessPermission();
if (!ap.canExtractContent()) {
throw new IOException("You do not have permission to extract text");
} PDFTextStripper stripper = new PDFTextStripper(); stripper.setSortByPosition(true); for (int p = 1; p <= document.getNumberOfPages(); ++p) {
stripper.setStartPage(p);
stripper.setEndPage(p); String text = stripper.getText(document); String pageStr = String.format("page %d:", p);
System.out.println(pageStr);
for (int i = 0; i < pageStr.length(); ++i) {
System.out.print("-");
}
System.out.println();
System.out.println(text.trim());
System.out.println();
}
}
} /**
* 创建空的PDF文件并且添加一个空白页,多页可以插入多个PDPage
*
* @throws IOException
*/
public static void createBlankPDF() throws IOException {
String filename = "G:/blank.pdf"; try (PDDocument doc = new PDDocument()) {
// a valid PDF document requires at least one page
PDPage blankPage = new PDPage();
doc.addPage(blankPage);
doc.save(filename);
}
} /**
* 图片转换为PDF文件
*
* @throws IOException
*/
public static void img2PDF() throws IOException {
String imagePath = "G:/0101.jpg";
String pdfPath = "G:/0101.pdf"; try (PDDocument doc = new PDDocument()) {
PDPage page = new PDPage();
doc.addPage(page); PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc); try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
contents.drawImage(pdImage, 20, 20); }
doc.save(pdfPath);
}
} /**
* 创建PDF文件并写入内容(暂时不支持写入中文)
*
* @throws IOException
*/
public static void createPDF() throws IOException {
String filename = "G:/Test.pdf";
String message = "pdf";// 字体不能有中文,暂时不支持中文 try (PDDocument doc = new PDDocument()) {
PDPage page = new PDPage();
doc.addPage(page); PDFont font = PDType1Font.HELVETICA_BOLD; try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
contents.beginText();
contents.setFont(font, 12);
contents.newLineAtOffset(100, 700);
contents.showText(message);
contents.endText();
} doc.save(filename);
}
}
}

[PDFBox]后台操作pdf的工具类的更多相关文章

  1. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  2. 操作集合的工具类Collections

    1       操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...

  3. Java操作字符串的工具类

    操作字符串的工具类 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStre ...

  4. Java操作图片的工具类

    操作图片的工具类: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.a ...

  5. 【转载】C#工具类:实现文件操作File的工具类

    在应用程序的开发中,文件操作的使用基本上是必不可少的,FileStream类.StreamWriter类.Directory类.DirectoryInfo类等都是文件操作中时常涉及到的类,我们可以通过 ...

  6. 自定义的操作Cookie的工具类

    可以在SpringMVC等环境中使用的操作Cookie的工具类 package utils; import java.io.UnsupportedEncodingException; import j ...

  7. java后台表单验证工具类

    /** * 描述 java后台表单验证工具类 * * @ClassName ValidationUtil * @Author wzf * @DATE 2018/10/27 15:21 * @VerSi ...

  8. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  9. Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类

    FileService.java也就是操作sdcard的工具类: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

随机推荐

  1. springcloud实战案例苏宁和海信

    http://springcloud.cn/view/341 为什么springlcoud不选用zookeeper: http://www.infoq.com/cn/articles/why-does ...

  2. Python之包

    包是一种通过使用'.模块名'来组织python模块名称空间的方式.创建包是为了用文件夹将文件/模块组织起来,创建包的目的不是为了运行,而是为了被导入使用.包的本质就是一个文件,其功能是将文件组织起来, ...

  3. Go多组Raft库

    Go多组Raft库 https://github.com/lni/dragonboat/blob/master/README.CHS.md 使用用例 https://github.com/lni/dr ...

  4. 缓存淘汰策略之LRU

    LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. 1. 新数据插入到链表头部: ...

  5. HDU - 1272 小希的迷宫(并查集判断环)

    https://cn.vjudge.net/problem/HDU-1272 Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardo ...

  6. Mcafee(麦咖啡) 无法升级的解决办法(威流验证)

    McAfee时会遇到更新失败的情况.为了解决这个问题,你需要做如下设置:1.“运行”>“dcomcnfg.exe”2.双击“组件服务>计算机>我的电脑”3.展开“DCOM配置”,打开 ...

  7. JavaScript 实现一个简单的MVVM前端框架(ES6语法)

    前言 随着前端各大框架的崛起,为我们平时的开发带来了相当的便利,我们不能一直停留在应用层面,今天就自己动手实现一个乞丐版的MVVM小框架 完整代码github地址 效果 html代码 <div ...

  8. Android adb shell 常用命令

    Ø  简介 adb 命令是 Android SDK 中自带的一个调试工具,可以调试电脑中的手机或者模拟器,使用 adb 命令前需要将 sdk 中的 platform-tools 目录添加到环境变量中. ...

  9. hasnMap的基本操作 源码(三)

    一.初始化: hashMap有四种初始化方式: public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity ...

  10. (6)设计一个TimeMap

    一.描述 设计一个TimeMap,基于key value的 支持两类操作set(string key, string value, int timestamp),get(string key, int ...