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.提取图片

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

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

2.提取文字

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

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

3.pdf转换为图片

  1. 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

  1. package cn.qlq;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.List;
  6.  
  7. import org.apache.pdfbox.pdmodel.PDDocument;
  8. import org.apache.pdfbox.pdmodel.PDPage;
  9. import org.apache.pdfbox.pdmodel.PDPageContentStream;
  10. import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
  11. import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
  12. import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
  13. import org.apache.pdfbox.pdmodel.font.PDFont;
  14. import org.apache.pdfbox.pdmodel.font.PDType1Font;
  15. import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
  16. import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
  17. import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
  18. import org.apache.pdfbox.pdmodel.interactive.action.PDActionURI;
  19. import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
  20. import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
  21. import org.apache.pdfbox.text.PDFTextStripper;
  22.  
  23. public class PDFBoxTest {
  24. public static void main(String[] args) throws IOException {
  25. ReplaceURLs();
  26. }
  27.  
  28. /**
  29. * 替换pdf中的连接的url跳转地址,但是显示的不会变,只是修改点击跳转的地址
  30. *
  31. * @throws InvalidPasswordException
  32. * @throws IOException
  33. */
  34. public static void ReplaceURLs() throws InvalidPasswordException, IOException {
  35. PDDocument doc = null;
  36. try {
  37. doc = PDDocument.load(new File("G:/qjl.pdf"));
  38. int pageNum = 0;
  39. for (PDPage page : doc.getPages()) {
  40. pageNum++;
  41. List<PDAnnotation> annotations = page.getAnnotations();
  42.  
  43. for (PDAnnotation annotation : annotations) {
  44. PDAnnotation annot = annotation;
  45. if (annot instanceof PDAnnotationLink) {
  46. PDAnnotationLink link = (PDAnnotationLink) annot;
  47. PDAction action = link.getAction();
  48. if (action instanceof PDActionURI) {
  49. PDActionURI uri = (PDActionURI) action;
  50. String oldURI = uri.getURI();
  51. String newURI = "http://pdfbox.apache.org";
  52. System.out.println("Page " + pageNum + ": Replacing " + oldURI + " with " + newURI);
  53. uri.setURI(newURI);
  54. }
  55. }
  56. }
  57. doc.save("G:/qjl_1.pdf");
  58. }
  59. } finally {
  60. if (doc != null) {
  61. doc.close();
  62. }
  63. }
  64. }
  65.  
  66. /**
  67. * 删除PDF里面的指定页
  68. *
  69. * @throws IOException
  70. * @throws InvalidPasswordException
  71. */
  72. public static void removePdfPage() throws IOException, InvalidPasswordException {
  73. try (PDDocument document = PDDocument.load(new File("G:/1.pdf"))) {
  74. if (document.isEncrypted()) {
  75. throw new IOException("Encrypted documents are not supported for this example");
  76. }
  77. if (document.getNumberOfPages() <= 1) {
  78. throw new IOException(
  79. "Error: A PDF document must have at least one page, " + "cannot remove the last page!");
  80. }
  81. document.removePage(1);// 删除第2页
  82. System.out.println("ssssssssssssss");
  83. document.save("G:/1_1.pdf");
  84. } catch (Exception e) {
  85. e.printStackTrace();
  86. }
  87. }
  88.  
  89. /**
  90. * PDF中增加图片
  91. *
  92. * @throws IOException
  93. * @throws InvalidPasswordException
  94. */
  95. public static void addImg2PDF() throws IOException, InvalidPasswordException {
  96. try (PDDocument doc = PDDocument.load(new File("G:/blank.pdf"))) {
  97. PDPage page = doc.getPage(0);
  98. PDImageXObject pdImage = PDImageXObject.createFromFile("G:/0101.jpg", doc);
  99.  
  100. try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true,
  101. true)) {
  102. // contentStream.drawImage(ximage, 20, 20 );
  103. // better method inspired by
  104. // http://stackoverflow.com/a/22318681/535646
  105. // reduce this value if the image is too large
  106. float scale = 1f;
  107. contentStream.drawImage(pdImage, 20, 20, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
  108. }
  109. doc.save("G:/blank.pdf");
  110. }
  111. }
  112.  
  113. /**
  114. * PDF文件中增加JS脚本
  115. *
  116. * @throws IOException
  117. * @throws InvalidPasswordException
  118. */
  119. public static void addJavaScript2PDF() throws IOException, InvalidPasswordException {
  120. try (PDDocument document = PDDocument.load(new File("G:/blank.pdf"))) {
  121. PDActionJavaScript javascript = new PDActionJavaScript(
  122. "app.alert( {cMsg: 'PDFBox rocks!', nIcon: 3, nType: 0, cTitle: 'PDFBox Javascript example' } );");
  123. document.getDocumentCatalog().setOpenAction(javascript);
  124. if (document.isEncrypted()) {
  125. throw new IOException("Encrypted documents are not supported for this example");
  126. }
  127. document.save("G:/blank.pdf");
  128. }
  129. }
  130.  
  131. /**
  132. * 阅读PDF文件的内容,支持阅读中文(如果需要阅读指定页面的PDF自己改写此方法)
  133. *
  134. * @throws IOException
  135. * @throws InvalidPasswordException
  136. */
  137. public static void readPDFText() throws IOException, InvalidPasswordException {
  138. try (PDDocument document = PDDocument.load(new File("G:/jl.pdf"))) {
  139. AccessPermission ap = document.getCurrentAccessPermission();
  140. if (!ap.canExtractContent()) {
  141. throw new IOException("You do not have permission to extract text");
  142. }
  143.  
  144. PDFTextStripper stripper = new PDFTextStripper();
  145.  
  146. stripper.setSortByPosition(true);
  147.  
  148. for (int p = 1; p <= document.getNumberOfPages(); ++p) {
  149. stripper.setStartPage(p);
  150. stripper.setEndPage(p);
  151.  
  152. String text = stripper.getText(document);
  153.  
  154. String pageStr = String.format("page %d:", p);
  155. System.out.println(pageStr);
  156. for (int i = 0; i < pageStr.length(); ++i) {
  157. System.out.print("-");
  158. }
  159. System.out.println();
  160. System.out.println(text.trim());
  161. System.out.println();
  162. }
  163. }
  164. }
  165.  
  166. /**
  167. * 创建空的PDF文件并且添加一个空白页,多页可以插入多个PDPage
  168. *
  169. * @throws IOException
  170. */
  171. public static void createBlankPDF() throws IOException {
  172. String filename = "G:/blank.pdf";
  173.  
  174. try (PDDocument doc = new PDDocument()) {
  175. // a valid PDF document requires at least one page
  176. PDPage blankPage = new PDPage();
  177. doc.addPage(blankPage);
  178. doc.save(filename);
  179. }
  180. }
  181.  
  182. /**
  183. * 图片转换为PDF文件
  184. *
  185. * @throws IOException
  186. */
  187. public static void img2PDF() throws IOException {
  188. String imagePath = "G:/0101.jpg";
  189. String pdfPath = "G:/0101.pdf";
  190.  
  191. try (PDDocument doc = new PDDocument()) {
  192. PDPage page = new PDPage();
  193. doc.addPage(page);
  194.  
  195. PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, doc);
  196.  
  197. try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
  198. contents.drawImage(pdImage, 20, 20);
  199.  
  200. }
  201. doc.save(pdfPath);
  202. }
  203. }
  204.  
  205. /**
  206. * 创建PDF文件并写入内容(暂时不支持写入中文)
  207. *
  208. * @throws IOException
  209. */
  210. public static void createPDF() throws IOException {
  211. String filename = "G:/Test.pdf";
  212. String message = "pdf";// 字体不能有中文,暂时不支持中文
  213.  
  214. try (PDDocument doc = new PDDocument()) {
  215. PDPage page = new PDPage();
  216. doc.addPage(page);
  217.  
  218. PDFont font = PDType1Font.HELVETICA_BOLD;
  219.  
  220. try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
  221. contents.beginText();
  222. contents.setFont(font, 12);
  223. contents.newLineAtOffset(100, 700);
  224. contents.showText(message);
  225. contents.endText();
  226. }
  227.  
  228. doc.save(filename);
  229. }
  230. }
  231. }

[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. 【清北学堂2018-刷题冲刺】Contest 5

     这三个题写了一天半,第一个题写了大概一整天.出题人劝我从后往前写,我不听,结果T1想了+调了一天QWQWQ Task 1:序列 [问题描述]  定义一个"好的序列"为一个长度为M ...

  2. (基础 输入方法 栈)P1427 小鱼的数字游戏 洛谷

    题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的 ...

  3. Go-day01

    Go-实现hello_world package main import "fmt" func main() { fmt.Println("hello world!&qu ...

  4. 2018ccpc湖南邀请赛后记

    第一次出省去打邀请赛,赛前给队友定的目标是打个铜,这样奖金就可以报销我们的伙食费了 5.12 热身赛,ak的心态冲进去,爆零逃出来 (为什么热身赛没有签到题啊),出来一度以为这场比赛要打铁,毕竟老远过 ...

  5. Linux top、VIRT、RES、SHR、SWAP(S)、DATA Memory Parameters Detailed

    catalog . Linux TOP指令 . VIRT -- Virtual Image (KB) . RES -- Resident size (KB) . SHR -- Shared Memor ...

  6. jdk7 并行计算框架Fork/Join

    故名思义,拆分fork+合并join.jdk1.7整合Fork/Join,性能上有大大提升. 思想:充分利用多核CPU把计算拆分成多个子任务,并行计算,提高CPU利用率大大减少运算时间.有点像,Map ...

  7. Linux下weblogic10.3.6(jar)版本安装详解

    一.安装前的准备 安装weblogic是需要JDK环境的,虽然weblogic有自带的JDK,但是我一般是自己选择JDK进行安装,如果你要自行安装,可以参考我的另一篇博客 https://www.cn ...

  8. VSCode 配置

    官网 https://code.visualstudio.com/ 便携化 Windows,Linux 在 Code.exe 所在目录创建 data 目录 macOS 在 Code.exe 所在目录创 ...

  9. python mysql安装&&简单基础sql

    ##############总结############## 1.mysql 介绍 Mysql是开源的,所以你不需要支付额外的费用. Mysql支持大型的数据库.可以处理拥有上千万条记录的大型数据库. ...

  10. html页面导出为excel表格

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...