将JasperReport iText 2.1.7替换为最新的iText 7.0.1

时间:2016-11-17 10:22:25

标签: jasper-reports itext

我们正在使用JasperReport 6.1.0,它依赖于com.lowagie:itext:jar:2.1.7.js2。看起来iText 2.1.7有IP问题,iText要求所有用户使用需要商业许可的最新版本。所以我们想购买iText许可证。现在iText的最新版本是7.0.1。我尝试用以下步骤将JasperReport的iText 2.1.7替换为最新的iText 7.0.1:

1。在pom.xml

中排除默认的itext 2.1.7依赖项
<dependency>
  <groupId>net.sf.jasperreports</groupId>
  <artifactId>jasperreports</artifactId>
  <version>6.1.0</version>
  <exclusions>
    <exclusion>
      <groupId>com.lowagie</groupId>
      <artifactId>itext</artifactId>
    </exclusion>
    ...

2。在pom.xml

中添加新的iText jar
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>barcodes</artifactId>
  <version>7.0.1</version>
  <!-- barcodes depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>font-asian</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>forms</artifactId>
  <version>7.0.1</version>
  <!-- forms depends on kernel and layout -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>hyph</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>io</artifactId>
  <version>7.0.1</version>
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>kernel</artifactId>
  <version>7.0.1</version>
  <!-- kernel depends on io -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>layout</artifactId>
  <version>7.0.1</version>
  <!-- layout depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>pdfa</artifactId>
  <version>7.0.1</version>
  <!-- pdfa depends on kernel -->
</dependency>
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>sign</artifactId>
  <version>7.0.1</version>
  <!-- sign depends on kernel, layout and forms -->
</dependency>

3。运行mvn和测试报告功能,我得到以下错误:

  

2016-11-17 14:43:36,520 ERROR [c.i.c.d.DeferredOperationManager] [Thread-49]延迟操作的异常。操作UUID:2a647922-d6d0-450d-9b2d-4d97638ba03f。 UI错误密钥:d9a16093-be20-4278-9f8b-93120c0a2231 - 错误:java.lang.NoClassDefFoundError:com / lowagie / text / SplitCharacter

看起来JasperReport正试图找到旧的iText类,其命名空间是“com.lowagie ...”。 我试图解压缩新的iText 7.0.1 jar,这些类在“com.itextpdf ...”包中。

如何让JasperReport调用新的iText jar?

1 个答案:

答案 0 :(得分:6)

你不能用iText 7替换iText 2.1.7,因为两个版本之间的差异太大了。我们知道有些人转而使用带有JasperReports的iText 5。这需要对JasperReports进行一些更改,例如将包名称从com.lowagie更改为com.itextpdf(*),并将对com.lowagie.text.Color的引用更改为com.itextpdf.text.BaseColor

在iText,我们注意到我们用iText 5进入了天花板。例如:我们使用char存储文本,这意味着每个字符仅使用2个字节存储。如果我们想支持印地语,这还不够。如果我们想要向iText添加对印度语的支持,我们必须重写完整的字体层。因为字体层是构建所有其余代码的基础,因此在iText 5中“替换字体层”将非常困难。因此我们决定重写完整的API。

您可以在此处观看有关此决定的详细视频:Devoxx 2016: "Oops I broke my API"

然而:用iText 7替换iText 2.1.7的最大问题是,JasperReports取决于PdfGraphics2D,我们还没有将该部分移植到iText 7(尚未)。我们甚至可能决定不再移植该部分,因为如果您选择使用PdfGraphics2D(并且PDF / UA变得越来越重要),则无法创建PDF / UA。

(*)2009年,我决定从包名中删除我的名字。当我第一次发布iText时,我只拥有了lowagie.com域,并且我使用了com.lowagie个包来编写我编写的所有Java代码。我没想到iText会如此成功。当每个人都开始使用iText时,每个人都开始亲自问我问题。我已经没有生命了。因此,我创建了一家公司,我们将iText专业化,并将com.lowagie替换为更加中立的com.itextpdf,这是其中一项专业化。