Apache PDFBox 2

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示例“ Create a blank 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向后不兼容的历史观察》中试图sun.java2d.cmm的观点。 在那篇文章中,我总结道,“请小心并谨慎使用广告或实验性宣传的Java API,类和工具,这些Java,Java和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

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

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

相关文章

HDU题目分类啊!!!

分类一(详细): 分类二: 基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、1056、1058、1061、1070、1076、1089、1090、1091、1092、1093、1094、1095…

关于DP与背包

听说过动态规划(DP)的同学应该都知道有背包问题的存在。 首先我们来了解一下动态规划 基本思想: 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中, 可能会有很多可行解。没一个解都对应于一个值,我们希…

MATLAB图像中添加标记

指定坐标添加标记: text(x,y,str)手动指定位置添加标记: gtext(str)横纵坐标xlabel()%横ylabel()%纵tittle()%标题

QQ空间说说的表情添加的代码

QQ空间说说的表情添加的代码 [em]e100[/em] 微笑 [em]e101[/em] 撇嘴[em]e102[/em] 色[em]e103[/em] 发呆[em]e104[/em] 得意[em]e105[/em] 流泪[em]e106[/em] 害羞[em]e107[/em] 闭嘴[em]e108[/em] 睡[em]e109[/em] 大哭[em]e110[/em] 尴尬[em]e111[/…

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第3部分

在之前的博客中,我们使用Thymeleaf,Bower和Bootstrap构建了登录页面,并将其部署到了Heroku。 在此博客中,我们将介绍用于前端的AngularJS和在后端的Spring Boot Web服务的一些功能。 我们将从“登录/注销”部分开始。 让我们开始…

Nginx配置安装

安装之前准备1、依赖 gcc openssl-devel pcre-devel zlib-devel 安装:yum install gcc openssl-devel pcre-devel zlib-devel -y 安装Nginx./configure make && make install 默认安装目录:/usr/local/nginx 配置Nginx为系统服务,以…

matlab自定义窗口名

fg1figure(numbertitle,off,name,标题名称,color,white);saveas(fg1,保存图形的名称);clruprop 清除用户自定义属性setuprop 设置用户自定义属性getuprop 获取用户自定义属性

【从零开始搭建自己的.NET Core Api框架】(二)搭建项目的整体架构

系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSugar快速实现CRUD 3.3 生成实体类 四. 集成JWT授权验证 本来打算将搭建项目架构和集成SqlSugar放在一起讲的&…

zk 布局_ZK实际应用:样式和布局

zk 布局在先前的ZK in Action帖子中,我们使用ZK MVVM实现了CRUD功能 。 我们还快速浏览了一些样式代码,可能需要更多的解释。 在本文中,我们将介绍如何在ZK小部件上附加新CSS样式规则,以及如何覆盖现有样式。 我们还将介绍ZK中UI布…

蓝桥杯 2011年第二届C语言初赛试题(2)

6. 代码填空 (满分9分) 中奖计算 某抽奖活动的规则是:每位参与者在纸上写下一个8位数的号码。最后通过摇奖的办法随机产生一个8位数字。参与者写下的数字中最多有多少个连续位与开奖号码中的相同,则称为中了几个号。 例如&…

MATLAB离散一维小波函数

waveinfowfilters(wname);appcoef近似系数 detcoef详细系数dwt 单层独立1-D小波idwtupcoef 线性重建upwlev 单层重建wavedec wavelet decompositionwaverecwrcoef

使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分

在这一系列博客文章中,我们将使用以下技术堆栈构建完整的响应式Web应用程序: 1)弹簧靴 – Spring MVC网站 – Spring Data JPA –Spring安全 2)Thymeleaf用于服务器端模板 3)客户端MVC的Angular JS(包括…

Codeforces 999F Cards and Joy 【dp】【性质】

读完这道题后应该想到牌有多少张都是什么不重要,重要的是player的favorite number是怎么分配的。(因为不是任何player的favorite number不能带来任何joy)然后每个favorite number带来的joy互相不受影响,因为如果favorite number不…

蓝桥杯 2011年第二届C语言初赛试题(3)

1、假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始&#xff0c…

MATLAB凸包Convex hull运算

凸包Convex hull运算(求离散点的边界) [k,a] convhull(x,y); K convulln(X, options);[K AV] convexHull(DT);tsearch :搜索Delaunay三角形delaunay :Delaunay三角化dsearch :求最近点 (这是两个有趣的函数)inpolygon :搜索多边形…

MATLAB Floyd算法

Floyd算法 Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。 核心思路 通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)] nn开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(…

父组件 子组件渲染

子组件使用v-if判断后渲染。 v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。 转载于:https://www.cnblogs.com/mengfangui/p/9228137.html

介绍Spring Integration

在本文中,我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration,那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之, 企业…

蓝桥杯 2011年第二届C语言初赛试题(4)

4、某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答…