apache pdfbox_Apache PDFBox 2

apache pdfbox

Apache PDFBox 2已于今年早些时候发布 , Apache PDFBox 2.0.1和Apache PDFBox 2.0.2已发布。 Apache PDFBox是开源的( Apache许可证版本2 )并且基于Java(因此易于使用,包括Java , Groovy , Scala , Clojure , Kotlin和Ceylon在内的多种编程语言都易于使用)。 这些或其他基于JVM的任何语言都可以使用Apache PDFBox来读取,编写和使用PDF文档 。

Apache PDFBox 2除了完成的任务和一些新功能以外,还引入了许多错误修复。 Apache PDFBox 2现在需要Java SE 6 ( Apache PDFBox 1.x最低为J2SE 5 )。 有一个迁移指南,“ 迁移到PDFBox 2.0.0” ,其中详细介绍了PDFBox 1.8和PDFBox 2.0之间的许多差异,包括更新的依赖项( Bouncy Castle 1.53和Apache Commons Logging 1.2 )以及PDFBox 2中的“对库的重大更改”。

PDFBox可用于创建PDF。 下一个代码清单改编自文档创建 “ Cookbook”示例中的Apache PDFBox 1.8示例“创建空白PDF”。 引用的示例显式关闭了实例化的PDDocument ,可能这样做是为了使那些在JDK 7之前使用Java版本的用户受益。但是,对于Java 7的用户, try-with-resources是确保PDDocument实例关闭的更好选择。并且它受支持,因为PDDocument实现了AutoCloseable 。

创建(空)PDF

/*** Demonstrate creation of an empty PDF.*/
private void createEmptyDocument()
{try (final PDDocument document = new PDDocument()){final PDPage emptyPage = new PDPage();document.addPage(emptyPage);document.save("EmptyPage.pdf");}catch (IOException ioEx){err.println("Exception while trying to create blank document - " + ioEx);}
}

下一个代码清单改编自文档创建 “ Cookbook”示例中的Apache PDFBox 1.8示例“ Hello World使用PDF基本字体”。 从1.8 Cookbook示例中此清单中最重大的变化是分别将不赞成使用的方法PDPageContentStream.moveTextPositionByAmount(float,float)和PDPageContentStream.drawString(String)替换为PDPageContentStream.newLineAtOffset(float,float)和PDPageContentStream.showText(String) 。

用字体创建简单的PDF

/*** Create simple, single-page PDF "Hello" document.*/
private void createHelloDocument()
{final PDPage singlePage = new PDPage();final PDFont courierBoldFont = PDType1Font.COURIER_BOLD;final int fontSize = 12;try (final PDDocument document = new PDDocument()){document.addPage(singlePage);final PDPageContentStream contentStream = new PDPageContentStream(document, singlePage);contentStream.beginText();contentStream.setFont(courierBoldFont, fontSize);contentStream.newLineAtOffset(150, 750);contentStream.showText("Hello PDFBox");contentStream.endText();contentStream.close();  // Stream must be closed before saving document.document.save("HelloPDFBox.pdf");}catch (IOException ioEx){err.println("Exception while trying to create simple document - " + ioEx);}
}

下一个代码清单演示了使用Apache PDFBox从PDF解析文本的方法。 这个极其简单的实现使用PDFTextStripper.getText(PDDocument)将所有文本解析为单个String 。 在最现实的情况下,我不希望PDF中的所有文本都在单个String中,并且可能会使用PDFTextStripper的功能来更狭窄地指定要解析的文本 。 还要注意的是,尽管此代码清单是从网上获取PDF的( Scala示例 PDF, 网址为http://www.scala-lang.org/docu/files/ScalaByExample.pdf ),但PDDocument的构造函数很多 ,它允许一个访问文件系统上的PDF以及通过其他类型的流。

从在线PDF解析文本

/*** Parse text from an online PDF.*/
private void parseOnlinePdfText()
{final String address = "http://www.scala-lang.org/docu/files/ScalaByExample.pdf";try{final URL scalaByExampleUrl = new URL(address);final PDDocument documentToBeParsed = PDDocument.load(scalaByExampleUrl.openStream());final PDFTextStripper stripper = new PDFTextStripper();final String pdfText = stripper.getText(documentToBeParsed);out.println("Parsed text size is " + pdfText.length() + " characters:");out.println(pdfText);}catch (IOException ioEx){err.println("Exception while trying to parse text from PDF at " + address);}
}

JDK 8问题

PDFBox 2暴露了JDK 8中的一个问题,该问题是在Bug JDK-8041125下提出的(“与JDK7相比,JDK 8中的ColorConvertOp过滤器要慢得多”)。 Apache PDFBox“ 入门 ”文档描述了以下问题:“由于将Java颜色管理模块更改为“ LittleCMS ”,因此用户在进行颜色操作时会遇到性能下降的问题。” 相同的“入门”部分提供了变通方法:“禁用LittleCMS以便使用旧的KCMS(柯达色彩管理系统)。”

该错误似乎已由IDR Solutions及其商业Java PDF库JPedal识别并提交。 他们的博客文章Java新版本中的Color性能的重大变化提供了与此问题相关的更多详细信息。

刚刚提到的文章和文档(包括Apache PDFBox 2的“入门”部分)通过明确指定使用KCMS( 可以随时删除 )而不是默认值来明确展示Java系统属性的使用,以解决该问题。 LittleCMS。 如这些来源所述,可以使用-D选项[ -Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider ]向Java启动器[ java ]提供系统属性 ,也可以在可执行代码中指定该属性。本身[ System.setProperty("sun.java2d.cmm", "sun.java2d.cmm.kcms.KcmsServiceProvider"); ]。

听起来这个问题并不是Apache PDFBox版本2独有,但在Apache PDFBox 2中更常见,因为版本2更频繁地使用依赖结构,并且使用Java 8的人也有可能使用较新的PDFBox。

JDK 8中与属性sun.java2d.cmm相关联的默认实现的sun.java2d.cmm说明了我试图在我最近的博客文章《 Java向后不兼容的历史观察》中提出的观点。 在那篇文章中,我总结道:“谨防并谨慎使用广告或实验性宣传的API,类和工具,这些Java,类和工具在将来的Java发行版中将被删除。” 事实证明Java 2D系统属性在此类中。 Java 2D Technology的系统属性页面提供了有关使用这些属性的背景信息和警告信息:


本文档介绍了一些不受支持的属性,可用于自定义2D绘画系统的运行方式。 您可能会使用这些属性来提高性能,修复错误的呈现或避免某些配置下的系统崩溃。
警告:使用这些属性时要小心。 由于非常实际的原因,其中一些不受支持。 …由于这些属性的唯一目的是启用或禁用特定于实现的行为,因此它们可能会更改或删除,恕不另行通知。 某些属性可能仅适用于所记录的确切产品版本。

结论

Apache PDFBox 2是在Java中操作PDF文档的相对简单的方法。 它具有开放的Apache 2许可证,非常适合大量读者,其开放源代码性质使开发人员可以了解如何使用其在幕后使用的库并根据需要对其进行调整。

其他资源

  • Apache PDFBox – Java PDF库 (主项目页面)
  • Apache PDFBox 2.0发布 (软件开发时间,2016年3月21日)
  • 用于处理PDF文档的Apache PDFBox库 (2016年4月3日)
  • 以编程方式用Java填写PDF (2013年1月11日– PDFBox 1.x)

翻译自: https://www.javacodegeeks.com/2016/07/apache-pdfbox-2.html

apache pdfbox

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cad坐标归零lisp_CAD图怎么归零

展开全部原理,就是把图元Z轴线移动的负无穷远,然e68a84e8a2ad62616964757a686964616f31333335336530后移动到正无穷,除了块就可以Z轴线归零了。用autoLISP来解决。;;;;;;Z坐标归零;;(defun c:z0 ( / &kw &k1 #os1)(setvar "cmde…

dynamodb java_使用Java查询DynamoDB项

dynamodb java在上一篇文章中,我们继续在DynamoDB数据库上插入数据。 在本教程中,我们将对DynamoDB表发出一些基本查询。 主要规则是每个查询都必须使用哈希键。 查询的最简单形式是仅使用哈希键。 我们将在此表上查询Users表。 结果只有一个&#xff…

冰点还原离线激活_冰点还原密钥,小编告诉你如何激活冰点还原

冰点还原软件,它具有轻松安装、动态保护、实时瞬间恢复,操作简单的特点。安装了冰点还原的系统,无论进行了安装文件,还是删除文件、更改系统设置等操作,计算机重新启动后,一切将恢复成初始状态。不过这些都…

【WebRTC---源码篇】(四)WebRTC线程模型

常见的线程模型 1.为了解决频繁线程创建与销毁,在此模型中使用的线程池。在线程池创建的时候就将一些线程创建起来,以提高效率。通过控制线程数量来解决线程频繁切换。 2.一般线程与线程存在前后关系的,线程执行完毕之后生成一个新的任务(task1 , task2,task3---)插入到任…

java cuba_CUBA平台–用于快速应用程序开发的开源Java框架

java cuba传统上,自计算时代开始以来,企业软件开发自然面临着一个挑战,当时自然而然地,企业软件开发本应专注于解决实际的业务问题,但与此同时,开发人员必须在技术上花费大量时间和精力。解决方案的一面&am…

web project、web service project和java project的区别

java project就是普通的用java写的程序,直接就能运行的,web project,web service project不能直接运行,必须在容器里面运行,这个容器就是web server,例如tomcat,jboss。web project就是web工程,简单的讲做网…

WebRTC Qos优化杂记

WebRTC视频JitterBuffer详解 详细内容链接 JitterBuffer延迟换流畅 在丢包+延迟+抖动的弱网环境下,推流端通过NACK+FEC等方式做了一定的容错,但是可能并不能百分之百解决所有问题,而且通过SFU分发到拉流端之后,拉流端网络也可能有问题,这个时候需要JitterBuffer来做媒体…

keras添加正则化全连接_TensorFlow keras卷积神经网络 添加L2正则化

model keras.models.Sequential([#卷积层1keras.layers.Conv2D(32,kernel_size5,strides1,padding"same",data_format"channels_last",activationtf.nn.relu,kernel_regularizerkeras.regularizers.l2(0.01)),#池化层1keras.layers.MaxPool2D(pool_size2,…

java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件

java中什么时候应用异常Pareto记录原理:97%的记录错误语句是由3%的唯一错误引起的 在最新的数据整理帖子之后,我们收到了很多反馈和问题,我们发现97%的记录错误是由10个唯一错误引起的 。 根据大众的需求&…

C++ 11 深度学习(十四)C++类

(一)综述:类是我们自己定义的数据类型 设计时要考虑的角度: 站在设计和实现的角度来考虑;站在使用者的角度考虑;父类,子类之间的考虑; (二)explicit 首先, C中的explicit关键字只…

手动编译 lombok_Lombok,一种编译时Java注释预处理器,可最大程度地减少代码大小...

手动编译 lombok在本文中,我们将看到如何在常规Java代码中使用lombok来最大程度地减少代码长度和冗余。 什么是Lombok? Lombok,一个编译时注释预处理器,有助于在编译时注入一些代码。 在详细介绍之前,我要求您应该从…

MyEclipse for Windows快捷键

文章目录编辑查询/替换导航调试重构其他自定义快捷键技巧编辑 快捷键功能说明Ctrl1快速修复(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类、try catch包围等)CtrlShiftF格式化代码。团队有统一的代码格式&#xf…

微信小程序view动态长度_微信小程序实现动态获取元素宽高的方法分析

本文实例讲述了微信小程序实现动态获取元素宽高的方法。分享给大家供大家参考,具体如下:我以前一直以为微信小程序不能动态获取view元素的宽高。但是自从看到: wx.createSelectorQuery() 这个api接口,以前的某些问题就能得到解决了…

数据结构【双指针算法】

双指针一般应用于维护两个队列&#xff0c;或者同一队列。 常见写法如下 for (int i 0, j 0; i < n; i){while (j < i && check(i, j)) j;//每道题的具体逻辑} 双指针的核心思想是把如下O(n^2)的算法优化位O(n) for (int i 0; i < n; i){for (int j 0; …

antlr 语言 库_关于ANTLR的通用库的需求:使用反射来构建元模型

antlr 语言 库我是一名语言工程师&#xff1a;我使用多种工具来定义和处理语言。 在其他工具中&#xff0c;我使用ANTLR&#xff1a;它简单&#xff0c;灵活&#xff0c;可以围绕它进行构建。 但是我发现自己围绕ANTLR为不同的项目重建了类似的工具。 我看到两个问题&#xff…

Windows 如何通过命令启动和关闭 Tomcat

首先你的系统要安装tomcat&#xff0c;至于如何安装tomcat这里就不讲解了&#xff0c;接着你打开windows的DOS命令终端&#xff08;winR打开运行窗口&#xff0c;输入cmd即可&#xff09;&#xff0c;然后通过DOS命令切换到tomcat安装目录下的bin目录&#xff0c;最后执行start…

mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了

问题最近年底&#xff0c;大家的数据库经常跑批量大事务&#xff0c;会发现复制突然断开&#xff0c;报错“心跳与本地信息不兼容”&#xff1a;会是什么原因&#xff1f;实验我们先来复现一下&#xff0c;再进行分析。宽油&#xff0c;做一对主从数据库&#xff1a;我们先造一…

Java的访问控制修饰符_访问权限修饰符_访问权限修饰词

public > protected > (default) > private 1.public 修饰的&#xff0c;在任何地方都可以访问 2.protected 修饰的&#xff0c;在类内部、同一个包、子类中能访问 3.default 表示在本类中、同一个包中能访问&#xff0c;但是在代码中不可以直接写 default&#xff0…

red hat安装宝塔_只需几分钟即可安装Red Hat Container Development Kit(视频)

red hat安装宝塔自从我开始使用各种形式的OpenShift&#xff08;例如带盒的Online&#xff0c;然后又作为容器化的图像&#xff09;玩耍以来&#xff0c;没有什么比Red Hat Container Development Kit&#xff08;CDK&#xff09;的可用性令我兴奋。 该套件使您可以轻松地访问…