【问题标题】:Replace JasperReport iText 2.1.7 with latest iText 7.0.1用最新的 iText 7.0.1 替换 JasperReport iText 2.1.7
【发布时间】:2017-03-31 20:10:05
【问题描述】:

我们正在使用 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 错误 [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 正在尝试查找命名空间为“com.lowagie...”的旧 iText 类。 我试图解压缩新的 iText 7.0.1 jar,这些类在包“com.itextpdf ...”中。

如何让 JasperReport 调用新的 iText jar?

【问题讨论】:

  • “如何让 JasperReport 调用新的 iText jar?” - 重写使用 iText 的 JasperReport 类! 说真的,你不想说你只是用主要部分增加 5(2.1.7 乘 7.0.1)的版本替换依赖项并期望一切都可以开箱即用,这样做你?不仅类的包发生了变化,7.x API 也完全重写,兼容性被设计打破以摆脱许多旧罪。
  • 有人在 Jasper 报告网站上提出了同样的问题:community.jaspersoft.com/questions/1035351/itext7-support。如果您观看该页面,看看它是否从维护 Jasper 报告的人那里得到答案,这可能会很有用。
  • 升级到 iText 7,这是一个彻底的重写,而不是一个好的版本,将会破坏应用程序中的所有内容。您真正想要的是一个现代解决方案,它不需要您学习整个 PDF 标准 + iText voodoo,例如 Google 的 Puppeteer,它使用 Chromium 渲染引擎获取 HTML 和 CSS。
  • Jasperreports 确实有一个带有 itext7 PDF 导出器的存储库。

标签: jasper-reports itext


【解决方案1】:

不能用 iText 7 替换 iText 2.1.7,因为这两个版本之间的差异太大。我们确实知道有些人转而使用 iText 5 和 JasperReports。这需要对 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 域,并且我为我编写的所有 Java 代码使用了 com.lowagie 包。我没想到 iText 会如此成功。当每个人都开始使用 iText 时,每个人都开始亲自向我提问。我已经没有生活了。因此,我创建了一家公司,我们将 iText 专业化,并将 com.lowagie 替换为更中性的 com.itextpdf 就是其中之一。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多